/// <summary> /// Check an edge and determine if it needs to be change? If yes the function call itself again /// </summary> /// <param name="e"></param> private void InspectEdge(List <EdgeWE> edges, WingedEdgeMesh mesh) { foreach (EdgeWE e in edges) { // Wefirstcheck that the edge connect 2 triangles if (e.LeftFace != null && e.RightFace != null) { List <VertexWE> v1 = mesh.GetFaceVertices(e.LeftFace); List <VertexWE> v2 = mesh.GetFaceVertices(e.RightFace); // We get the opposite side of the left face VertexWE leftOppositeVertex = null; for (int i = 0; i < v1.Count; i++) { if ((v1[i] != e.Vertex1) && (v1[i] != e.Vertex2)) { leftOppositeVertex = v1[i]; } } //We get the opposite side of the right face VertexWE rightOppositeVertex = null; for (int i = 0; i < v2.Count; i++) { if ((v2[i] != e.Vertex1) && (v2[i] != e.Vertex2)) { rightOppositeVertex = v1[i]; } } // We get back informations about the circles from the left and right face Vector3 leftCircleCenter = GetCircleCenter(v1[0].Position, v1[1].Position, v1[2].Position); float leftCircleRadius = GetCircleRadius(v1[0].Position, v1[1].Position, v1[2].Position, leftCircleCenter); Vector3 rightCircleCenter = GetCircleCenter(v2[0].Position, v2[1].Position, v2[2].Position); float rightCircleRadius = GetCircleRadius(v2[0].Position, v2[1].Position, v2[2].Position, rightCircleCenter); // We check if one of the opposite side can fit in the circle of the opposite face if (IsPointInCircle(leftOppositeVertex.Position, rightCircleCenter, rightCircleRadius) || IsPointInCircle(rightOppositeVertex.Position, leftCircleCenter, leftCircleRadius)) { // We switchover the edge List <FaceWE> newfaces = mesh.FlipEdge(e); // We inspect the new edges List <EdgeWE> newEdges = new List <EdgeWE>(); for (int i = 0; i < newfaces.Count; i++) { for (int j = 0; j < newfaces[i].Edges.Count; j++) { if (newEdges.Contains(newfaces[i].Edges[j])) { newEdges.Add(newfaces[i].Edges[j]); } } } InspectEdge(newEdges, mesh); return; } } } return; }
/// <summary> /// Inspecte une edge et détermine si un basculement est nécéssaire /// Si un basculement a eu lieu, réinvoque la fonction /// </summary> /// <param name="e"></param> private void InspectEdge(List <EdgeWE> edges, WingedEdgeMesh mesh) { foreach (EdgeWE e in edges) { // On vérifie d'abord que l'arrête relie 2 triangles if (e.LeftFace != null && e.RightFace != null) { List <VertexWE> v1 = mesh.GetFaceVertices(e.LeftFace); List <VertexWE> v2 = mesh.GetFaceVertices(e.RightFace); // Récupère le coté opposé à la face gauche VertexWE leftOppositeVertex = null; for (int i = 0; i < v1.Count; i++) { if ((v1[i] != e.Vertex1) && (v1[i] != e.Vertex2)) { leftOppositeVertex = v1[i]; } } // Récupère le coté opposé à la face droite VertexWE rightOppositeVertex = null; for (int i = 0; i < v2.Count; i++) { if ((v2[i] != e.Vertex1) && (v2[i] != e.Vertex2)) { rightOppositeVertex = v1[i]; } } // On récupère les informations sur les cercle Right et Left Face Vector3 leftCircleCenter = GetCircleCenter(v1[0].Position, v1[1].Position, v1[2].Position); float leftCircleRadius = GetCircleRadius(v1[0].Position, v1[1].Position, v1[2].Position, leftCircleCenter); Vector3 rightCircleCenter = GetCircleCenter(v2[0].Position, v2[1].Position, v2[2].Position); float rightCircleRadius = GetCircleRadius(v2[0].Position, v2[1].Position, v2[2].Position, rightCircleCenter); // On vérifie si un des coté opposé ne rentre pas dans le cercle de la face opposé if (IsPointInCircle(leftOppositeVertex.Position, rightCircleCenter, rightCircleRadius) || IsPointInCircle(rightOppositeVertex.Position, leftCircleCenter, leftCircleRadius)) { // On bascule l'arrête List <FaceWE> newfaces = mesh.FlipEdge(e); // On inspecte les nouvelles arrêtes List <EdgeWE> newEdges = new List <EdgeWE>(); for (int i = 0; i < newfaces.Count; i++) { for (int j = 0; j < newfaces[i].Edges.Count; j++) { if (newEdges.Contains(newfaces[i].Edges[j])) { newEdges.Add(newfaces[i].Edges[j]); } } } InspectEdge(newEdges, mesh); return; } } } return; }