private static Polyline?MergeTwoPl([NotNull] Polyline pl1, [NotNull] Polyline pl2, double tolerance) { Polyline?plMerged = null; // Точки полилиний var plVertexes = PolylineVertex.GetVertexes(pl1, "1"); plVertexes.AddRange(PolylineVertex.GetVertexes(pl2, "2")); // группировка совпадающих точек на обоих полилиниях var comparer = new Comparers.Point2dEqualityComparer(tolerance); var nearsPts = plVertexes.GroupBy(g => g.Pt, comparer) .Where(w => w.Any(p => p.Name == "1") && w.Any(p => p.Name == "2")).ToList(); if (!nearsPts.Any()) { return(null); } // Попытка создать объединенную полилинию - от первой найденной общей точки двух полинилиний var fpt = nearsPts.FirstOrDefault(); if (fpt != null) { var ptInPl1 = fpt.First(f => f.Name == "1"); var ptInPl2 = fpt.First(f => f.Name == "2"); plMerged = Merge(pl1, pl2, ptInPl1, ptInPl2); } if (plMerged != null && !plMerged.CheckCross()) { // Вторая попытка - от последней общей точки plMerged.Dispose(); var lpt = nearsPts.Last(); if (lpt != null) { var ptInPl1 = lpt.First(f => f.Name == "1"); var ptInPl2 = lpt.First(f => f.Name == "2"); plMerged = Merge(pl1, pl2, ptInPl1, ptInPl2); } } if (plMerged != null && !plMerged.CheckCross()) { // Неудалось объединить полилинии без самопересечений plMerged.Dispose(); throw new Exception("Ошибка объединения полининий без самопересечения."); } return(plMerged); }
private static Polyline MergeTwoPl(Polyline pl1, Polyline pl2, double tolerance) { Polyline plMerged = null; // Точки полилиний var plVertexes = PolylineVertex.GetVertexes(pl1, "1"); plVertexes.AddRange(PolylineVertex.GetVertexes(pl2, "2")); // группировка совпадающих точек на обоих полилиниях var comparer = new Comparers.Point2dEqualityComparer(tolerance); var nearsPts = plVertexes.GroupBy(g => g.Pt, comparer).Where(w => w.Any(p => p.Name == "1") && w.Any(p => p.Name == "2")); if (!nearsPts.Any()) { return null; } // Попытка создать объединенную полилинию - от первой найденной общей точки двух полинилиний var fpt = nearsPts.FirstOrDefault(); if (fpt != null) { var ptInPl1 = fpt.First(f => f.Name == "1"); var ptInPl2 = fpt.First(f => f.Name == "2"); plMerged = Merge(pl1, pl2, ptInPl1, ptInPl2); } if (!plMerged.CheckCross()) { // Вторая попытка - от последней общей точки plMerged.Dispose(); var lpt = nearsPts.Last(); if (lpt != null) { var ptInPl1 = lpt.First(f => f.Name == "1"); var ptInPl2 = lpt.First(f => f.Name == "2"); plMerged = Merge(pl1, pl2, ptInPl1, ptInPl2); } } if (plMerged != null && !plMerged.CheckCross()) { // Неудалось объединить полилинии без самопересечений plMerged.Dispose(); throw new Exception("Ошибка объединения полининий без самопересечения."); } return plMerged; }