//------------------------------------------------------------------------------ private void BuildResult2(PolyTree polytree) { polytree.Clear(); //add each output polygon/contour to polytree ... polytree.m_AllPolys.Capacity = m_PolyOuts.Count; for (int i = 0; i < m_PolyOuts.Count; i++) { OutRec outRec = m_PolyOuts[i]; int cnt = PointCount(outRec.Pts); if ((outRec.IsOpen && cnt < 2) || (!outRec.IsOpen && cnt < 3)) continue; FixHoleLinkage(outRec); PolyNode pn = new PolyNode(); polytree.m_AllPolys.Add(pn); outRec.PolyNode = pn; pn.m_polygon.Capacity = cnt; OutPt op = outRec.Pts.Prev; for (int j = 0; j < cnt; j++) { pn.m_polygon.Add(op.Pt); op = op.Prev; } } //fixup PolyNode links etc ... polytree.m_Childs.Capacity = m_PolyOuts.Count; for (int i = 0; i < m_PolyOuts.Count; i++) { OutRec outRec = m_PolyOuts[i]; if (outRec.PolyNode == null) continue; else if (outRec.IsOpen) { outRec.PolyNode.IsOpen = true; polytree.AddChild(outRec.PolyNode); } else if (outRec.FirstLeft != null) outRec.FirstLeft.PolyNode.AddChild(outRec.PolyNode); else polytree.AddChild(outRec.PolyNode); } }
//------------------------------------------------------------------------------ internal static void AddPolyNodeToPaths(PolyNode polynode, NodeType nt, Paths paths) { bool match = true; switch (nt) { case NodeType.ntOpen: return; case NodeType.ntClosed: match = !polynode.IsOpen; break; default: break; } if (polynode.Contour.Count > 0 && match) paths.Add(polynode.Contour); foreach (PolyNode pn in polynode.Childs) AddPolyNodeToPaths(pn, nt, paths); }
internal void AddChild(PolyNode Child) { int cnt = m_Childs.Count; m_Childs.Add(Child); Child.m_Parent = this; Child.m_Index = cnt; }