Exemple #1
0
        private void LegalizeEdge(Vertex a_Vertex, HalfEdge a_HalfEdge, Triangle a_Triangle)
        {
            if (a_Vertex == null || a_HalfEdge == null || a_Triangle == null)
            {
                Debug.LogError("Invalid call to LegalizeEdge");
                return;
            }

            Vertex v1, v2, v3;
            try
            {
                // Points to test
                v1 = a_HalfEdge.Twin.Next.Next.Origin;
                v2 = a_HalfEdge.Next.Twin.Next.Next.Origin;
                v3 = a_HalfEdge.Next.Next.Twin.Next.Next.Origin;
            }
            catch (NullReferenceException)
            {
                Debug.LogError("Null pointers in call to LegalizeEdge");
                return;
            }

            if (v1 == null || v2 == null || v3 == null)
            {
                Debug.LogError("Invalid halfedge in call to LegalizeEdge");
                return;
            }

            if (a_Triangle.InsideCircumcenter(v1) || a_Triangle.InsideCircumcenter(v2) || a_Triangle.InsideCircumcenter(v3))
            {
                HalfEdge h1 = a_HalfEdge.Twin.Next.Twin;
                HalfEdge h2 = a_HalfEdge.Twin.Prev.Twin;

                Flip(a_HalfEdge);

                LegalizeEdge(a_Vertex, h1.Twin, h1.Twin.Triangle);
                LegalizeEdge(a_Vertex, h2.Twin, h2.Twin.Triangle);
            }
        }
Exemple #2
0
        private void LegalizeEdge(Vertex vertex, HalfEdge halfEdge, Triangle triangle)
        {
            if (vertex == null) throw new ArgumentNullException(nameof(vertex));

            if (triangle == null)
                return;

            LogEntry logEntry = new LogEntry("Checking edge", this);
            //logEntry.objects.Add(vertex);
            logEntry.Objects.Add(halfEdge.Face);
            logEntry.Objects.Add(new Edge(halfEdge.Origin, halfEdge.Next.Origin));
            Log.Add(logEntry);

            // Points to test
            Vertex v1 = halfEdge.Twin.Next.Next.Origin;
            Vertex v2 = halfEdge.Next.Twin.Next.Next.Origin;
            Vertex v3 = halfEdge.Next.Next.Twin.Next.Next.Origin;

            logEntry.Objects.Add(v1);
            logEntry.Objects.Add(v2);
            logEntry.Objects.Add(v3);

            if (triangle.InsideCircumcenter(v1))
            {
                logEntry = new LogEntry("Found point Inside circumcenter", this);
                logEntry.Objects.Add(v1);
                logEntry.Objects.Add(halfEdge.Face);
                Log.Add(logEntry);
            }

            if (triangle.InsideCircumcenter(v2))
            {
                logEntry = new LogEntry("Found point Inside circumcenter", this);
                logEntry.Objects.Add(v2);
                logEntry.Objects.Add(halfEdge.Face);
                Log.Add(logEntry);
            }

            if (triangle.InsideCircumcenter(v3))
            {
                logEntry = new LogEntry("Found point Inside circumcenter", this);
                logEntry.Objects.Add(v3);
                logEntry.Objects.Add(halfEdge.Face);
                Log.Add(logEntry);
            }

            if (triangle.InsideCircumcenter(v1) || triangle.InsideCircumcenter(v2) || triangle.InsideCircumcenter(v3))
            {
                HalfEdge h1 = halfEdge.Twin.Next.Twin;
                HalfEdge h2 = halfEdge.Twin.Prev.Twin;

                Flip(halfEdge);

                logEntry = new LogEntry("Select recursive flip edges", this);
                logEntry.Objects.Add(new Edge(h1.Origin, h1.Next.Origin));
                logEntry.Objects.Add(new Edge(h2.Origin, h2.Next.Origin));
                Log.Add(logEntry);

                LegalizeEdge(vertex, h1.Twin, h1.Twin.Face as Triangle);
                LegalizeEdge(vertex, h2.Twin, h2.Twin.Face as Triangle);
            }
        }