package wektoryzacja; import java.util.ArrayList; import java.util.List; import pl.wroc.pwr.imagechannel.IImageChannel; import pl.wroc.pwr.imagechannel.skeletonization.TerminationDetector; import pl.wroc.pwr.roi.IROI; public class SzeregowaniePunktow { private TerminationDetector tDetector = new TerminationDetector(); public List szeregujPunkty(IROI roi, IImageChannel channel) { List krzywa = roi.getROICoordinates(); IROI term = this.tDetector.apply(roi, channel); List tPoints = term.getROICoordinates(); List uszeregowanie = new ArrayList(); int[] nastepny = null; int[] rozciecie = null; //sprawdz czy krzywa ma konce, czy jest krzywa zamknieta if (tPoints.size() == 0) { //krzywa jest zamknieta, wybierz punkt arbitralnie /*int minimum = Integer.MAX_VALUE; for (int[] punkt : krzywa) { //wybieramy punkt jednoczesnie wysoko i po lewej int wartosc = punkt[0] + punkt[1]; if (wartosc < minimum) { minimum = wartosc; rozciecie = punkt; } }*/ rozciecie = krzywa.get(0); nastepny = rozciecie; //to jest pierwszy punkt } else { //punkt poczatkowy uszeregowania jest koncem krzywej nastepny = tPoints.get(0); } do { uszeregowanie.add(nastepny); int[] aktualny = uszeregowanie.get(uszeregowanie.size() - 1); int minDist = 3; nastepny = null; for (int[] punkt : krzywa) { if (uszeregowanie.contains(punkt)) { continue; } int dx = aktualny[0] - punkt[0]; int dy = aktualny[1] - punkt[1]; int dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; nastepny = punkt; } } } while (nastepny != null); if (rozciecie != null) { uszeregowanie.add(rozciecie); //punkt rozciecia jest rowniez ostatni } return uszeregowanie; } }