// 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); }
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;*/ }
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); }
public void RemoveFace(Face face) { Faces.Remove(face); face.Edges.ForEach(e => e.Faces.Remove(face)); }
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; } } }