示例#1
0
        static void Main(string[] args)
        {
            var    s  = new FileInfo(Directory.GetCurrentDirectory());
            var    s2 = s.Directory.Parent.Parent;
            String s3 = s2.ToString() + "\\dane.csv";


            listy S = new listy();
            punkt dodawany;

            using (var reader = new StreamReader(s3))
            {
                while (!reader.EndOfStream)
                {
                    var line   = reader.ReadLine();
                    var values = line.Split(',');

                    dodawany = new punkt(Convert.ToInt32(values[0]), Convert.ToInt32(values[1]));
                    S.dodaj(dodawany);
                }
            }

            S.sortuj();
            List <punkt> wynik   = policz(S);
            punkt        a       = wynik.ElementAt(0);
            punkt        b       = wynik.ElementAt(1);
            double       dystans = a.dystans(b);

            Console.WriteLine("Najbliższa para: ");
            a.napisz();
            b.napisz();
            Console.WriteLine("Dystan pomiędzy nimi równy jest " + Math.Sqrt(dystans));

            Console.ReadKey();
        }
示例#2
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);
            }
        }