Пример #1
0
		//------------------------------------------------------------------------------
		
		double Area(OutRec outRec)
		{
			OutPt op = outRec.Pts;
			if (op == null) return 0;
			double a = 0;
			do {
				a = a + (double)(op.Pt.X + op.Prev.Pt.X) * (double)(op.Prev.Pt.Y - op.Pt.Y);
				op = op.Next;
			} while (op != outRec.Pts);
			return a/2;
		}
Пример #2
0
		//----------------------------------------------------------------------
		
		private void FixupFirstLefts2(OutRec OldOutRec, OutRec NewOutRec)
		{ 
			foreach (OutRec outRec in m_PolyOuts)
				if (outRec.FirstLeft == OldOutRec) outRec.FirstLeft = NewOutRec;
		}
Пример #3
0
		//------------------------------------------------------------------------------
		
		private void UpdateOutPtIdxs(OutRec outrec)
		{  
			OutPt op = outrec.Pts;
			do
			{
				op.Idx = outrec.Idx;
				op = op.Prev;
			}
			while(op != outrec.Pts);
		}
Пример #4
0
		//------------------------------------------------------------------------------
		
		private void FixupOutPolygon(OutRec outRec)
		{
			//FixupOutPolygon() - removes duplicate points and simplifies consecutive
			//parallel edges by removing the middle vertex.
			OutPt lastOK = null;
			outRec.BottomPt = null;
			OutPt pp = outRec.Pts;
			for (;;)
			{
				if (pp.Prev == pp || pp.Prev == pp.Next)
				{
					DisposeOutPts(pp);
					outRec.Pts = null;
					return;
				}
				//test for duplicate points and collinear edges ...
				if ((pp.Pt == pp.Next.Pt) || (pp.Pt == pp.Prev.Pt) ||
				    (SlopesEqual(pp.Prev.Pt, pp.Pt, pp.Next.Pt, m_UseFullRange) &&
				 (!PreserveCollinear || !Pt2IsBetweenPt1AndPt3(pp.Prev.Pt, pp.Pt, pp.Next.Pt))))
				{
					lastOK = null;
					pp.Prev.Next = pp.Next;
					pp.Next.Prev = pp.Prev;
					pp = pp.Prev;
				}
				else if (pp == lastOK) break;
				else
				{
					if (lastOK == null) lastOK = pp;
					pp = pp.Next;
				}
			}
			outRec.Pts = pp;
		}
Пример #5
0
		//----------------------------------------------------------------------
		
		private void FixupFirstLefts1(OutRec OldOutRec, OutRec NewOutRec)
		{ 
			for (int i = 0; i < m_PolyOuts.Count; i++)
			{
				OutRec outRec = m_PolyOuts[i];
				if (outRec.Pts != null && outRec.FirstLeft == OldOutRec) 
				{
					if (Poly2ContainsPoly1(outRec.Pts, NewOutRec.Pts, m_UseFullRange))
						outRec.FirstLeft = NewOutRec;
				}
			}
		}
Пример #6
0
		//------------------------------------------------------------------------------
		
		bool Param1RightOfParam2(OutRec outRec1, OutRec outRec2)
		{
			do
			{
				outRec1 = outRec1.FirstLeft;
				if (outRec1 == outRec2) return true;
			} while (outRec1 != null);
			return false;
		}
Пример #7
0
		//------------------------------------------------------------------------------
		
		private OutRec GetLowermostRec(OutRec outRec1, OutRec outRec2)
		{
			//work out which polygon fragment has the correct hole state ...
			if (outRec1.BottomPt == null) 
				outRec1.BottomPt = GetBottomPt(outRec1.Pts);
			if (outRec2.BottomPt == null) 
				outRec2.BottomPt = GetBottomPt(outRec2.Pts);
			OutPt bPt1 = outRec1.BottomPt;
			OutPt bPt2 = outRec2.BottomPt;
			if (bPt1.Pt.Y > bPt2.Pt.Y) return outRec1;
			else if (bPt1.Pt.Y < bPt2.Pt.Y) return outRec2;
			else if (bPt1.Pt.X < bPt2.Pt.X) return outRec1;
			else if (bPt1.Pt.X > bPt2.Pt.X) return outRec2;
			else if (bPt1.Next == bPt1) return outRec2;
			else if (bPt2.Next == bPt2) return outRec1;
			else if (FirstIsBottomPt(bPt1, bPt2)) return outRec1;
			else return outRec2;
		}
Пример #8
0
		//------------------------------------------------------------------------------
		
		private void SetHoleState(TEdge e, OutRec outRec)
		{
			bool isHole = false;
			TEdge e2 = e.PrevInAEL;
			while (e2 != null)
			{
				if (e2.OutIdx >= 0)
				{
					isHole = !isHole;
					if (outRec.FirstLeft == null)
						outRec.FirstLeft = m_PolyOuts[e2.OutIdx];
				}
				e2 = e2.PrevInAEL;
			}
			if (isHole) outRec.IsHole = true;
		}
Пример #9
0
		//------------------------------------------------------------------------------
		
		private OutRec CreateOutRec()
		{
			OutRec result = new OutRec();
			result.Idx = Unassigned;
			result.IsHole = false;
			result.IsOpen = false;
			result.FirstLeft = null;
			result.Pts = null;
			result.BottomPt = null;
			result.PolyNode = null;
			m_PolyOuts.Add(result);
			result.Idx = m_PolyOuts.Count - 1;
			return result;
		}
Пример #10
0
		//------------------------------------------------------------------------------
		
		internal void FixHoleLinkage(OutRec outRec)
		{
			//skip if an outermost polygon or
			//already already points to the correct FirstLeft ...
			if (outRec.FirstLeft == null ||                
			    (outRec.IsHole != outRec.FirstLeft.IsHole &&
			 outRec.FirstLeft.Pts != null)) return;
			
			OutRec orfl = outRec.FirstLeft;
			while (orfl != null && ((orfl.IsHole == outRec.IsHole) || orfl.Pts == null))
				orfl = orfl.FirstLeft;
			outRec.FirstLeft = orfl;
		}