public int porownajX(punkt a) { if (x < a.dajX()) { return(-1); } else if (x > a.dajX()) { return(1); } else if (y > a.dajY()) { return(1); } else { return(-1); } }
public double dystans(punkt a) { int X = x - a.dajX(); if (X < 0) { X = X * -1; } int Y = y - a.dajY(); if (Y < 0) { Y = Y * -1; } double dys = X * X + Y * Y; return(dys); }
public static List <punkt> policz(listy S) { List <punkt> Sx = S.dajSx(); List <punkt> Sy = S.dajSy(); int ile = Sx.Count(); if (ile < 5) { punkt a = Sx.ElementAt(0); punkt b = Sx.ElementAt(1); double min = a.dystans(b); for (int x = 0; x < Sx.Count(); x++) { for (int y = x + 1; y < Sx.Count(); y++) { double dys = Sx.ElementAt(x).dystans(Sx.ElementAt(y)); if (dys < min) { min = dys; a = Sx.ElementAt(x); b = Sx.ElementAt(y); } } } List <punkt> wynik = new List <punkt>(); wynik.Add(a); wynik.Add(b); return(wynik); } else { listy S1 = new listy(); listy S2 = new listy(); int l; for (int x = 0; x < ile; x++) { punkt p = Sx.ElementAt(x); if (x < ile / 2) { S1.dodajX(p); p.ustawPrzed(true); } else { S2.dodajX(p); p.ustawPrzed(false); } } for (int x = 0; x < ile; x++) { punkt p = Sy.ElementAt(x); if (p.czyPrzed() == true) { S1.dodajY(p); } else { S2.dodajY(p); } } Sx = S1.dajSx(); ile = Sx.Count(); ile -= 1; punkt ostatni = Sx.ElementAt(ile); l = ostatni.dajX(); List <punkt> wynik1 = policz(S1); //najbliższe pary w podzbiorach List <punkt> wynik2 = policz(S2); double dystans1 = wynik1.ElementAt(0).dystans(wynik1.ElementAt(1)); double dystans2 = wynik2.ElementAt(0).dystans(wynik2.ElementAt(1)); double minDystans; //dystans między mniejszą parą List <punkt> minPara; //mniejsza para if (dystans1 < dystans2) { minDystans = dystans1; minPara = wynik1; } else { minDystans = dystans2; minPara = wynik2; } //tworzenie list punktów w pasie przy prostej listy S1znaczek = new listy(); listy S2znaczek = new listy(); List <punkt> tmp = S1.dajSy(); foreach (punkt p in tmp) { double odleglosc = p.dajX() - l; if (odleglosc < 0) { odleglosc *= -1; } if (odleglosc <= minDystans) { S1znaczek.dodaj(p); } } tmp = S2.dajSy(); foreach (punkt p in tmp) { double odleglosc = p.dajX() - l; if (odleglosc < 0) { odleglosc *= -1; } if (odleglosc <= minDystans) { S2znaczek.dodaj(p); } } List <punkt> tmp1 = S1znaczek.dajSy(); List <punkt> tmp2 = S2znaczek.dajSy(); foreach (punkt p in tmp1) { int licznik = 0; foreach (punkt P in tmp2) { if (P.dajY() >= p.dajY()) { licznik += 1; if (p.dystans(P) < minDystans) { minDystans = p.dystans(P); minPara = new List <punkt>(); minPara.Add(p); minPara.Add(P); } if (licznik >= 4) { break; } } } } foreach (punkt p in tmp2) { int licznik = 0; foreach (punkt P in tmp1) { if (P.dajY() >= p.dajY()) { licznik += 1; if (p.dystans(P) < minDystans) { minDystans = p.dystans(P); minPara = new List <punkt>(); minPara.Add(p); minPara.Add(P); } if (licznik >= 4) { break; } } } } return(minPara); } }