/******************************************************* To cut an ear from polygon to make ears and an updated polygon: *******************************************************/ public void CutEar() { CPolygon polygon=new CPolygon(m_aUpdatedPolygonVertices); bool bFinish=false; //if (polygon.GetPolygonType()==PolygonType.Convex) //don't have to cut ear // bFinish=true; if (m_aUpdatedPolygonVertices.Length==3) //triangle, don't have to cut ear bFinish=true; CPoint2D pt=new CPoint2D(); while (bFinish==false) //UpdatedPolygon { int i=0; bool bNotFound=true; while (bNotFound && (i<m_aUpdatedPolygonVertices.Length)) //loop till find an ear { pt=m_aUpdatedPolygonVertices[i]; if (IsEarOfUpdatedPolygon(pt)) bNotFound=false; //got one, pt is an ear else i++; } //bNotFount //An ear found:} if (pt !=null) UpdatePolygonVertices(pt); polygon=new CPolygon(m_aUpdatedPolygonVertices); //if ((polygon.GetPolygonType()==PolygonType.Convex) // && (m_aUpdatedPolygonVertices.Length==3)) if (m_aUpdatedPolygonVertices.Length==3) bFinish=true; } //bFinish=false SetPolygons(); }
/******************************************************** To update m_aUpdatedPolygonVertices: Take out Vertex from m_aUpdatedPolygonVertices array, add 3 points to the m_aEars **********************************************************/ private void UpdatePolygonVertices(CPoint2D vertex) { System.Collections.ArrayList alTempPts=new System.Collections.ArrayList(); for (int i=0; i< m_aUpdatedPolygonVertices.Length; i++) { if (vertex.EqualsPoint( m_aUpdatedPolygonVertices[i])) //add 3 pts to FEars { CPolygon polygon=new CPolygon(m_aUpdatedPolygonVertices); CPoint2D pti = vertex; CPoint2D ptj = polygon.PreviousPoint(vertex); //previous point CPoint2D ptk = polygon.NextPoint(vertex); //next point CPoint2D[] aEar=new CPoint2D[3]; //3 vertices of each ear aEar[0]=ptj; aEar[1]=pti; aEar[2]=ptk; m_alEars.Add(aEar); } else { alTempPts.Add(m_aUpdatedPolygonVertices[i]); } //not equal points } if (m_aUpdatedPolygonVertices.Length - alTempPts.Count==1) { int nLength=m_aUpdatedPolygonVertices.Length; m_aUpdatedPolygonVertices=new CPoint2D[nLength-1]; for (int i=0; i<alTempPts.Count; i++) m_aUpdatedPolygonVertices[i]=(CPoint2D)alTempPts[i]; } }
/**************************************************************** To check whether the Vertex is an ear or not based updated Polygon vertices ref. www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Ian /algorithm1.html If it is an ear, return true, If it is not an ear, return false; *****************************************************************/ private bool IsEarOfUpdatedPolygon(CPoint2D vertex ) { CPolygon polygon=new CPolygon(m_aUpdatedPolygonVertices); if (polygon.PolygonVertex(vertex)) { bool bEar=true; if (polygon.PolygonVertexType(vertex)==VertexType.ConvexPoint) { CPoint2D pi=vertex; CPoint2D pj=polygon.PreviousPoint(vertex); //previous vertex CPoint2D pk=polygon.NextPoint(vertex);//next vertex for (int i=m_aUpdatedPolygonVertices.GetLowerBound(0); i<m_aUpdatedPolygonVertices.GetUpperBound(0); i++) { CPoint2D pt = m_aUpdatedPolygonVertices[i]; if ( !(pt.EqualsPoint(pi)|| pt.EqualsPoint(pj)||pt.EqualsPoint(pk))) { if (TriangleContainsPoint(new CPoint2D[] {pj, pi, pk}, pt)) bEar=false; } } } //ThePolygon.getVertexType(Vertex)=ConvexPt else //concave point bEar=false; //not an ear/ return bEar; } else //not a polygon vertex; { System.Diagnostics.Trace.WriteLine("IsEarOfUpdatedPolygon: "+ "Not a polygon vertex"); return false; } }