Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 public static List <PolylineVertex> GetVertexes([NotNull] this Polyline pl)
 {
     return(PolylineVertex.GetVertexes(pl, string.Empty));
 }