Example #1
0
 public int porownajY(punkt a)
 {
     if (y < a.dajY())
     {
         return(-1);
     }
     else if (y > a.dajY())
     {
         return(1);
     }
     else if (x > a.dajX())
     {
         return(1);
     }
     else
     {
         return(-1);
     }
 }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }