/// <summary> /// Remove all the encroached subsegments and bad triangles from the triangulation. /// </summary> private void EnforceQuality() { BadTriangle badtri; // Test all segments to see if they're encroached. TallyEncs(); // Fix encroached subsegments without noting bad triangles. // DO I NEED IT? //SplitEncSegs(false); // At this point, if we haven't run out of Steiner points, the // triangulation should be (conforming) Delaunay. // Next, we worry about enforcing triangle quality. if ((behavior.MinAngle > 0.0) || behavior.VarArea || behavior.fixedArea || behavior.UserTest != null) { // TODO: Reset queue? (Or is it always empty at this point) // Test all triangles to see if they're bad. TallyFaces(); mesh.checkquality = true; while ((queue.Count > 0) && (mesh.steinerleft != 0)) { // Fix one bad triangle by inserting a vertex at its circumcenter. badtri = queue.Dequeue(); SplitTriangle(badtri); if (badsubsegs.Count > 0) { // Put bad triangle back in queue for another try later. queue.Enqueue(badtri); // Fix any encroached subsegments that resulted. // Record any new bad triangles that result. SplitEncSegs(true); } } } // At this point, if the "-D" switch was selected and we haven't run out // of Steiner points, the triangulation should be (conforming) Delaunay // and have no low-quality triangles. // Might we have run out of Steiner points too soon? if (Log.Verbose && behavior.ConformingDelaunay && (badsubsegs.Count > 0) && (mesh.steinerleft == 0)) { logger.Warning("I ran out of Steiner points, but the mesh has encroached subsegments, " + "and therefore might not be truly Delaunay. If the Delaunay property is important " + "to you, try increasing the number of Steiner points.", "Quality.EnforceQuality()"); } }
/// <summary> /// Remove all the encroached subsegments and bad triangles from the triangulation. /// </summary> public void EnforceQuality() { BadTriangle badtri; // Test all segments to see if they're encroached. TallyEncs(); // Fix encroached subsegments without noting bad triangles. SplitEncSegs(false); // At this point, if we haven't run out of Steiner points, the // triangulation should be (conforming) Delaunay. // Next, we worry about enforcing triangle quality. if ((behavior.MinAngle > 0.0) || behavior.VarArea || behavior.fixedArea || behavior.UserTest != null) { // TODO: Reset queue? (Or is it always empty at this point) // Test all triangles to see if they're bad. TallyFaces(); mesh.checkquality = true; while ((queue.Count > 0) && (mesh.steinerleft != 0)) { // Fix one bad triangle by inserting a vertex at its circumcenter. badtri = queue.Dequeue(); SplitTriangle(badtri); if (badsubsegs.Count > 0) { // Put bad triangle back in queue for another try later. queue.Enqueue(badtri); // Fix any encroached subsegments that resulted. // Record any new bad triangles that result. SplitEncSegs(true); } else { TrianglePool.FreeBadTri(badtri); } } } // At this point, if the "-D" switch was selected and we haven't run out // of Steiner points, the triangulation should be (conforming) Delaunay // and have no low-quality triangles. // Might we have run out of Steiner points too soon? if (behavior.ConformingDelaunay && (badsubsegs.Count > 0) && (mesh.steinerleft == 0)) { } }