Exemplo n.º 1
0
        // Simulates the drawing of the edges into the designated face
        // and splits the face into two
        public void AddBridgeAndSeperateFace(List <Edge> edgesToAdd, Face face, Node[] pointsOfContract)
        {
            Face face1 = new Face();
            Face face2 = new Face();

            foreach (Edge edge in edgesToAdd)
            {
                AddNode(edge.Node1);
                AddNode(edge.Node2);
                AddEdge(edge);
                face1.AddNode(edge.Node1);
                face1.AddNode(edge.Node2);
                face1.AddEdge(edge);
                face2.AddNode(edge.Node1);
                face2.AddNode(edge.Node2);
                face2.AddEdge(edge);
            }
            Face oldFace  = face;
            Edge faceEdge = oldFace.Edges.First(e => e.Node1 == pointsOfContract[0] || e.Node2 == pointsOfContract[0]);
            Node prevNode = pointsOfContract[0];
            Node otherNode;

            while (faceEdge.Node1 != pointsOfContract[1] && faceEdge.Node2 != pointsOfContract[1])
            {
                face1.AddNode(faceEdge.Node1);
                face1.AddNode(faceEdge.Node2);
                face1.AddEdge(faceEdge);
                otherNode = faceEdge.OtherNode(prevNode);
                faceEdge  = oldFace.GetNextEdge(faceEdge, prevNode);
                prevNode  = otherNode;
            }
            face1.AddNode(faceEdge.Node1);
            face1.AddNode(faceEdge.Node2);
            face1.AddEdge(faceEdge);
            otherNode = faceEdge.OtherNode(prevNode);
            faceEdge  = oldFace.GetNextEdge(faceEdge, prevNode);
            prevNode  = otherNode;
            while (faceEdge.Node1 != pointsOfContract[0] && faceEdge.Node2 != pointsOfContract[0])
            {
                face2.AddNode(faceEdge.Node1);
                face2.AddNode(faceEdge.Node2);
                face2.AddEdge(faceEdge);
                otherNode = faceEdge.OtherNode(prevNode);
                faceEdge  = oldFace.GetNextEdge(faceEdge, prevNode);
                prevNode  = otherNode;
            }
            face2.AddNode(faceEdge.Node1);
            face2.AddNode(faceEdge.Node2);
            face2.AddEdge(faceEdge);

            Faces.Remove(oldFace);
            Faces.Add(face1);
            Faces.Add(face2);
        }
Exemplo n.º 2
0
        public void RemoveFace(Face2D face)
        {
            Faces.Remove(face);

            _lazyExitedEdges.isValeChanged = true;
            _lazyAllEdges.isValeChanged    = true;
            _lazyAllPoints.isValeChanged   = true;
            //face.BasicEdges.ForEach(e => e.Faces.Remove(face));

            /*_lazyAllEdges.isValeChanged = true;
             * _lazyAllPoints.isValeChanged = true;*/
        }
Exemplo n.º 3
0
 public void RemoveElement(GraphElement element)
 {
     if (element is Node node)
     {
         List <GraphElement> elementsToDelete = new List <GraphElement>();
         foreach (Edge edge in Edges)
         {
             if (edge.Start == node || edge.End == node)
             {
                 elementsToDelete.Add(edge);
             }
         }
         foreach (Face face in Faces)
         {
             if (face.Nodes.Contains(node))
             {
                 elementsToDelete.Add(face);
             }
         }
         foreach (GraphElement newElement in elementsToDelete)
         {
             RemoveElement(newElement);
         }
         Nodes.Remove(node);
     }
     else if (element is Edge edge)
     {
         List <GraphElement> elementsToDelete = new List <GraphElement>();
         foreach (Face face in Faces)
         {
             for (int i = 0; i < face.Nodes.Count; ++i)
             {
                 Node firstNode  = face.Nodes[i];
                 Node secondNode = face.Nodes[i + 1 < face.Nodes.Count ? i + 1 : 0];
                 if ((firstNode == edge.End && secondNode == edge.Start) ||
                     (firstNode == edge.Start && secondNode == edge.End))
                 {
                     elementsToDelete.Add(face);
                     break;
                 }
             }
         }
         foreach (GraphElement newElement in elementsToDelete)
         {
             RemoveElement(newElement);
         }
         Edges.Remove(edge);
     }
     else if (element is Face face)
     {
         Faces.Remove(face);
     }
 }
        /// <summary>
        /// Supprime la face
        /// </summary>
        /// <param name="f"></param>
        public void RemoveFace(FaceWE f)
        {
            foreach (EdgeWE e in f.Edges)
            {
                if (e.RightFace == f)
                {
                    e.RightFace = null;
                }

                if (e.LeftFace == f)
                {
                    e.LeftFace = null;
                }

                if (e.LeftFace == null && e.RightFace == null)
                {
                    Edges.Remove(e);
                    e.Vertex1.Edges.Remove(e);
                    e.Vertex2.Edges.Remove(e);
                }
            }
            Faces.Remove(f);
        }
Exemplo n.º 5
0
 public void RemoveFace(Face face)
 {
     Faces.Remove(face);
     face.Edges.ForEach(e => e.Faces.Remove(face));
 }
Exemplo n.º 6
0
        private void MergePolygons()
        {
            for (var polygonIndex = 0; polygonIndex < Faces.Count; ++polygonIndex)
            {
                var face = Faces[polygonIndex];

                for (var edgeIndex = 0; edgeIndex < face.edges.Count; ++edgeIndex)
                {
                    var edge     = face.edges[edgeIndex];
                    var neighbor = edge.Neighbors[0];
                    if (Object.ReferenceEquals(neighbor, face))
                    {
                        neighbor = edge.Neighbors[1];
                    }
                    if (neighbor == null)
                    {
                        continue;
                    }
                    if (Object.ReferenceEquals(neighbor, face))
                    {
                        continue;                                         //Face is it's own neighbor?
                    }
                    var reject = false;
                    foreach (var neighborEdge in neighbor.edges)
                    {
                        if (Object.ReferenceEquals(edge, neighborEdge))
                        {
                            continue;
                        }
                        if (neighborEdge.Neighbors[0] == face || neighborEdge.Neighbors[1] == face)
                        {
                            reject = true;
                        }
                    }
                    if (reject)
                    {
                        continue;
                    }

                    if (!FacesAreCoplanar(face, neighbor))
                    {
                        continue;
                    }

                    var candidateFace = MergeFaces(face, neighbor);
                    if (!IsConvex(candidateFace))
                    {
                        continue;
                    }

                    //Update neighbor references.
                    foreach (var candidateEdge in candidateFace.edges)
                    {
                        for (var i = 0; i < 2; ++i)
                        {
                            if (Object.ReferenceEquals(candidateEdge.Neighbors[i], neighbor) ||
                                Object.ReferenceEquals(candidateEdge.Neighbors[i], face))
                            {
                                candidateEdge.Neighbors[i] = candidateFace;
                            }
                        }
                    }

                    Faces.Remove(face);
                    Faces.Remove(neighbor);
                    Faces.Add(candidateFace);

                    polygonIndex = 0;
                    break;
                }
            }
        }