/// <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;
        }
Esempio n. 2
0
        /// <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;
        }