/// <summary> /// Добавить контуры другого региона, применив к ним трансформацию. /// </summary> /// <param name="region">Регион, из которого будут копироваться контуры.</param> /// <param name="trans">Трансформация, которая будет применяться к контурам.</param> public void AddWithTransform(IRegion region, Transform trans) { foreach (IContour cont in region.Contours) { BasicContour ncont = new BasicContour(); ncont.AddWithTransform(cont, trans); DrawningContours.Add(ncont); } }
/// <summary> /// Сгенерировать контуры по списку отрезков. /// </summary> /// <param name="points">Массив начальных и конечных точек отрезков. /// ([0] - начало первого, [1] - конец первого, [2] - начало второго и т.п.)</param> /// <returns>Сгенерированные контуры.</returns> static List<BasicContour> GenerateContours(ICollection<Point> segments) { List<Point> segs = new List<Point>(segments); List<BasicContour> contours = new List<BasicContour>(); if (segments.Count < 2 || segments.Count % 2 != 0) return contours; BasicContour cont = new BasicContour(); cont.DrawningPoints.Add(segs[0]); cont.DrawningPoints.Add(segs[1]); segs.RemoveAt(0); segs.RemoveAt(0); // Не ошибка. while (segs.Count != 0) { bool inserted = false; for (int i = 0; i < segs.Count - 1; i += 2) { Point p1 = segs[i]; Point p2 = segs[i+1]; bool contFinished = false; if (GrUtil.IsPointsEqual( p1, cont.DrawningPoints[cont.DrawningPoints.Count - 1], 2 )) { if(!GrUtil.IsPointsEqual( p2, cont.DrawningPoints[0], 2 )) { cont.DrawningPoints.Add(p2); } else { contFinished = true; } inserted = true; } else if (GrUtil.IsPointsEqual( p2, cont.DrawningPoints[cont.DrawningPoints.Count - 1], 2 )) { if (!GrUtil.IsPointsEqual( p1, cont.DrawningPoints[0], 2 )) { cont.DrawningPoints.Add(p1); } else { contFinished = true; } inserted = true; } if (inserted) { segs.RemoveAt(i); segs.RemoveAt(i); // Не ошибка. if (contFinished) { contours.Add(cont); cont = null; if (segs.Count >= 2) { cont = new BasicContour(); cont.DrawningPoints.Add(segs[0]); cont.DrawningPoints.Add(segs[1]); segs.RemoveAt(0); segs.RemoveAt(0); // Не ошибка. } } break; } } // for i } // while if (cont != null) contours.Add(cont); return contours; }