예제 #1
0
            private void InsertHole(PolygonWithNested node, List <Point3d> insertingHole)
            {
                bool isNested = false;

                foreach (PolygonWithNested nn in node.NestedOuterPolygons)
                {
                    if (nn.IsNested(insertingHole))
                    {
                        //рекурсия
                        InsertHole(nn, insertingHole);
                        isNested = true;
                        break;
                    }
                }

                if (!isNested)
                {
                    //Если не вложена в дочерние узлы, значит вложена в текущий
                    node.Holes.Add(insertingHole);
                }
            }
예제 #2
0
            private void InsertOuterPolygon(PolygonWithNested node, PolygonWithNested insertingNode)
            {
                bool isNested = false;

                //Проверить вложена ли добавляемая полилиния в один из дочерних узлов
                foreach (PolygonWithNested nn in node.NestedOuterPolygons)
                {
                    if (nn.IsNested(insertingNode))
                    {
                        //рекурсия
                        InsertOuterPolygon(nn, insertingNode);
                        isNested = true;
                        break;
                    }
                }

                if (!isNested)
                {
                    //Если полилиния не вложена в дочерние узлы, то проверить не вложены ли дочерние узлы в добавляемую полилинию
                    for (int i = 0; i < node.NestedOuterPolygons.Count;)
                    {
                        PolygonWithNested nn = node.NestedOuterPolygons[i];
                        if (insertingNode.IsNested(nn))
                        {
                            //Если вложена, то убрать из node.NestedPolygons и добавить в insertingNode.NestedPolygons
                            node.NestedOuterPolygons.Remove(nn);
                            insertingNode.NestedOuterPolygons.Add(nn);
                        }
                        else
                        {
                            i++;
                        }
                    }

                    //Добавить insertingNode в node.NestedNodes
                    node.NestedOuterPolygons.Add(insertingNode);
                }
            }
예제 #3
0
 public PolygonTree()
 {
     Root = new PolygonWithNested(null);
 }
예제 #4
0
 /// <summary>
 /// Переданный узел вложен в этот
 /// </summary>
 /// <param name="node"></param>
 /// <returns></returns>
 public bool IsNested(PolygonWithNested node)
 {
     return(Utils.PointIsInsidePolylineWindingNumber(node.Polygon[0], this.Polygon));
 }