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); } }
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); } }
public PolygonTree() { Root = new PolygonWithNested(null); }
/// <summary> /// Переданный узел вложен в этот /// </summary> /// <param name="node"></param> /// <returns></returns> public bool IsNested(PolygonWithNested node) { return(Utils.PointIsInsidePolylineWindingNumber(node.Polygon[0], this.Polygon)); }