Пример #1
0
		//------------------------------------------------------------------------------
		
		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);
			}
		}
Пример #2
0
		//------------------------------------------------------------------------------
		
		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);
		}
Пример #3
0
		internal void AddChild(PolyNode Child)
		{
			int cnt = m_Childs.Count;
			m_Childs.Add(Child);
			Child.m_Parent = this;
			Child.m_Index = cnt;
		}