コード例 #1
0
        public static List <KRAB_Line> KRAB_ALIVE(List <PointC> pointFs)
        {
            PointC minA      = null;
            PointC minB      = null;
            double minLength = double.MaxValue;

            List <KRAB_Line> CrabLins = new List <KRAB_Line>();

            foreach (var A in pointFs)
            {
                foreach (var B in pointFs)
                {
                    if (A != B && LengthLineSqr(A, B) < minLength)
                    {
                        minLength = LengthLineSqr(A, B);
                        minA      = A;
                        minB      = B;
                    }
                }
            }
            CrabLins.Add(new KRAB_Line(minA, minB));
            List <PointC> CrabPoints = new List <PointC>();

            CrabPoints.Add(minA);
            CrabPoints.Add(minB);
            while (CrabPoints.Count != pointFs.Count)
            {
                minLength = double.MaxValue;
                foreach (var A in CrabPoints)
                {
                    foreach (var B in pointFs)
                    {
                        if (A != B && CrabPoints.FindIndex(p => p.Equals(B)) == -1 && minLength > LengthLineSqr(A, B))
                        {
                            minLength = LengthLineSqr(A, B);
                            minA      = A;
                            minB      = B;
                        }
                    }
                }
                CrabPoints.Add(minB);
                CrabLins.Add(new KRAB_Line(minA, minB));
            }
            return(CrabLins);
        }
コード例 #2
0
 private static double LengthLineSqr(PointC A, PointC B)
 {
     return(Math.Pow((A.X - B.X), 2) + Math.Pow((A.Y - B.Y), 2));
 }
コード例 #3
0
        public static List <PointC> Forel(List <PointC> PointCs, int START, int Radius)
        {
            nextHope.Clear();
            START--;
            List <PointC> points        = new List <PointC>(PointCs);
            PointC        center        = new PointC(0, 0);
            PointC        newCenter     = new PointC(0, 0);
            int           NumberCluster = 0;

            while (points.Count > 0)
            {
                if (result.Count == 0)
                {
                    center    = points[START];
                    newCenter = center;
                }
                else
                {
                    /* Random rnd = new Random();
                     * var index = rnd.Next(0, points.Count);*/
                    //try
                    //{
                    //    int index = Prompt.ShowDialog("ТОЧКА", "Введите точку-эталон для нахождения нового радиуса");
                    //    textBox1.Text += "Для метода Форель следующей выбрана точка [" + (index) + "]" + Environment.NewLine;
                    //    center = points[index - 1];
                    //    newCenter = center;
                    //}
                    //catch(Exception e)
                    //{
                    Random rnd   = new Random();
                    var    index = rnd.Next(0, points.Count);
                    nextHope.Add("Для метода Форель следующей выбрана точка [" + ((PointCs.IndexOf(points[index])) + 1) + "]" + Environment.NewLine);
                    center    = points[index];
                    newCenter = center;
                }

                //точки внутри окружности
                List <PointC> lst = new List <PointC>();
                //точки внутри окр два
                List <PointC> lst2 = new List <PointC>();
                while (center == newCenter)
                {
                    foreach (var p in points)
                    {
                        // textBox1.Text += "Точка " + p.X + " " + p.Y + " Расстояние=" + Math.Sqrt(Math.Pow((p.X - center.X), 2) + Math.Pow((p.Y - center.Y), 2))+Environment.NewLine;
                        if (Math.Sqrt(Math.Pow((p.X - center.X), 2) + Math.Pow((p.Y - center.Y), 2)) < Radius)
                        {
                            p.mark = NumberCluster;
                            lst.Add(p);
                        }
                    }
                    //находим центр
                    double powerX = 0;
                    double powerY = 0;
                    foreach (var p in lst)
                    {
                        powerX += p.X;
                        powerY += p.Y;
                    }
                    double powerCenterX = powerX / lst.Count;
                    double powerCenterY = powerY / lst.Count;
                    newCenter = new PointC(powerCenterX, powerCenterY);
                    foreach (var p in points)
                    {
                        if (Math.Sqrt(Math.Pow((p.X - newCenter.X), 2) + Math.Pow((p.Y - newCenter.Y), 2)) < Radius)
                        {
                            p.mark = NumberCluster;
                            lst2.Add(p);
                        }
                    }
                }
                NumberCluster++;
                result.Add(lst);
                centers.Add(newCenter);
                foreach (var p in lst2)
                {
                    points.Remove(p);
                }
            }
            return(centers);
        }
コード例 #4
0
 public KRAB_Line(PointC A, PointC B)
 {
     this.start = A;
     this.end   = B;
     value      = Math.Pow((A.X - B.X), 2) + Math.Pow((A.Y - B.Y), 2);
 }