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("Готово!"); }