Exemplo n.º 1
0
        /// <summary>
        /// Переданный узел вложен в вызывающий узел
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        public bool IsNested(PolygonNestingNode node)
        {
            //Проверка по одной точке, так как предполагается, что полилинии не пересекаются - неподходит
            //return Utils.PointIsInsidePolylineWindingNumber(node.Point2dCollection[0], this.Point2dCollection);


            //предполагается, что полилинии могут касаться
            //=> взять любую внутреннюю точку переданного узла и проверить, попадает ли она в вызывающий узел
            List <Point2d> ptList = node.Point2dCollection.ToArray().ToList();
            Point2d        pt     = Utils.GetAnyPointInsidePoligon(ptList, Utils.DirectionIsClockwise(ptList));

            return(Utils.PointIsInsidePolylineWindingNumber(pt, this.Point2dCollection));
        }
Exemplo n.º 2
0
        protected void Insert(PolygonNestingNode node, PolygonNestingNode insertingNode)
        {
            //вставка контура в дерево вложенности!
            bool isNested = false;

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

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

                //Добавить insertingNode в node.NestedNodes
                node.NestedNodes.Add(insertingNode);
            }
        }
Exemplo n.º 3
0
 public void Insert(PolygonNestingNode insertingNode)
 {
     Insert(root, insertingNode);
 }