Ejemplo n.º 1
0
 public Section(Vector vector, Triangle left, Triangle right)
 {
     this.Vector = vector;
     this.left = left;
     this.right = right;
 }
        public Triangulation(IEnumerable <Point> collection, Graphics g = null, Pen linePen = null, Pen pointPen = null, Pen newLinePen = null, int size = 0, int delay = 0)
        {
            points    = new List <Point>(collection);                     //сделали копию, на всякий пожарный
            triangles = new List <Triangle>();                            //список треугольников
            shell     = new List <Vector>();                              //список векторов из границы

            Point massCenter = Point.getMassCenter(points);               //получили центр масс
            Point basePoint  = massCenter.getNearestPointFrom(points);    //получили ближайшую к нему точку

            points.Remove(basePoint);                                     //убираем её из списка вершин

            List <PolarPoint> polarCoordinates = new List <PolarPoint>(); //переходим к полярным координатам

            foreach (Point point in points)                               //для каждой точки находим новые координаты
            {
                polarCoordinates.Add(new PolarPoint(basePoint, point));   //полюс - basePoint
            }
            polarCoordinates.Sort();                                      //сортировка, угол в приоритете

            points.Clear();                                               //больше этот список нам не пригодится
            foreach (PolarPoint polPoint in polarCoordinates)             //записываем в него координаты точек в
            {
                points.Add(polPoint.toDecart());                          //отсортированном порядке
            }
            Triangle t;

            for (int i = 0; i < points.Count - 1; i++)                  //ну а теперь нужно до каждой точки протянуть вектор
            {                                                           //справа и слева от него будут треугольники, а
                t = new Triangle(points[i + 1], basePoint, points[i]);  //соседнии точки образуют границу

                shell.Add(new Vector(points[i], points[i + 1]));
                triangles.Add(t);
            }


            //это необходимо для замыкания границы
            if (new Vector(basePoint, points[points.Count - 1]).getVectorMultiplication(new Vector(basePoint, points[0])) > 0)
            {
                shell.Add(new Vector(points[points.Count - 1], points[0]));
                triangles.Add(new Triangle(points[0], basePoint, points[points.Count - 1]));
            }
            else
            {
                shell.Insert(0, new Vector(basePoint, points[0]));
                shell.Add(new Vector(points[points.Count - 1], basePoint));
            }

            updateShell(); //теперь, дополним оболочку до выпуклого множества
            if (g != null)
            {
                foreach (Triangle triangle in triangles)
                {
                    triangle.Paint(g, linePen, pointPen, size);
                }
            }
            MessageBox.Show("Триангуляция построена!\nПреобразуем её к триангуляции Делоне.");

            upToDelanay(g, linePen, pointPen, newLinePen, size, delay); //преобразовываем триангуляцию к триангуляции Делоне
            if (g != null)
            {
                foreach (Triangle triangle in triangles)
                {
                    triangle.Paint(g, linePen, pointPen, size);
                }
            }

            MessageBox.Show("Готово!");
        }