public DCELHalfEdge2D(DCELVertex2D origin, DCELFace2D face, DCELHalfEdge2D twin, DCELHalfEdge2D next) { Origin = origin; Face = face; Twin = twin; Next = next; }
public bool AddFace(DCELFace2D face) { faceList.Add(face); faceCount++; return(true); }
public bool RemoveFace(DCELFace2D face) { if (faceList.Remove(face)) { faceCount--; return(true); } return(false); }
public bool TriangulateFace(DCELFace2D face) { //lista di appoggio List <DCELHalfEdge2D> edges = face.Sides().ToList(); //sides è il numero di lati della faccia int sides = edges.Count; //first è il vertice a partire dal quale viene suddiviso il poligono DCELVertex2D first = edges[0].Origin; //se la faccia non esiste o se esiste ma ha meno di 4 lati o non è convessa restituisco false //if (sides <= 3 || !this.Contains(face) || !face.IsConvex()) // return false; for (int i = 0; i < sides; i++) { if (i == 0) { this.AddFace(new DCELFace2D(edges[i])); edges[i].Face = faceList[FaceCount - 1]; i++; edges[i].Face = faceList[FaceCount - 1]; this.AddHalfEdge(new DCELHalfEdge2D(edges[i].Next.Origin, faceList[FaceCount - 1], null, edges[0])); edges[i].Next = edgeList[HalfEdgeCount - 1]; } else if (i == sides - 2) { this.AddFace(new DCELFace2D(null)); this.AddHalfEdge(new DCELHalfEdge2D(first, faceList[FaceCount - 1], edgeList[HalfEdgeCount - 1], edges[i])); edges[i].Face = faceList[FaceCount - 1]; i++; edges[i].Face = faceList[FaceCount - 1]; edgeList[HalfEdgeCount - 2].Twin = edgeList[HalfEdgeCount - 1]; faceList[FaceCount - 1].Edge = edgeList[HalfEdgeCount - 1]; edges[i].Next = edgeList[HalfEdgeCount - 1]; } else { this.AddFace(new DCELFace2D(null)); this.AddHalfEdge(new DCELHalfEdge2D(first, faceList[FaceCount - 1], edgeList[HalfEdgeCount - 1], edges[i])); faceList[FaceCount - 1].Edge = edgeList[HalfEdgeCount - 1]; edges[i].Face = faceList[FaceCount - 1]; edgeList[HalfEdgeCount - 2].Twin = edgeList[HalfEdgeCount - 1]; this.AddHalfEdge(new DCELHalfEdge2D(edges[i].Next.Origin, faceList[faceCount - 1], null, edgeList[HalfEdgeCount - 1])); edges[i].Next = edgeList[HalfEdgeCount - 1]; } } //ora è possibile rimuovere la faccia dalla lista return(RemoveFace(face)); }
public bool Contains(DCELFace2D face) { return(faceList.Contains(face)); }