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); } }
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); } }