Esempio n. 1
0
 public DCELHalfEdge2D(DCELVertex2D origin, DCELFace2D face, DCELHalfEdge2D twin, DCELHalfEdge2D next)
 {
     Origin = origin;
     Face   = face;
     Twin   = twin;
     Next   = next;
 }
Esempio n. 2
0
        public bool AddFace(DCELFace2D face)
        {
            faceList.Add(face);
            faceCount++;

            return(true);
        }
Esempio n. 3
0
 public bool RemoveFace(DCELFace2D face)
 {
     if (faceList.Remove(face))
     {
         faceCount--;
         return(true);
     }
     return(false);
 }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
 public bool Contains(DCELFace2D face)
 {
     return(faceList.Contains(face));
 }