From ea2599e7d18eb986c0714746c159ed27795009a5 Mon Sep 17 00:00:00 2001 From: wo80 Date: Tue, 19 Jul 2022 01:38:14 +0200 Subject: [PATCH] Update example 4 (related to issue #21) --- src/Triangle.Examples/Examples/Example4.cs | 31 ++++++++++++++++++---- src/Triangle.Examples/Examples/Example8.cs | 2 +- src/Triangle.Examples/Program.cs | 23 +++++++++------- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/Triangle.Examples/Examples/Example4.cs b/src/Triangle.Examples/Examples/Example4.cs index 881c17f..9715d36 100644 --- a/src/Triangle.Examples/Examples/Example4.cs +++ b/src/Triangle.Examples/Examples/Example4.cs @@ -6,6 +6,7 @@ namespace TriangleNet.Examples using TriangleNet.Meshing; using TriangleNet.Rendering.Text; using TriangleNet.Smoothing; + using TriangleNet.Tools; /// /// Triangulate a polygon with hole with maximum area constraint, followed by mesh smoothing. @@ -17,15 +18,33 @@ namespace TriangleNet.Examples // Generate mesh. var mesh = CreateMesh(); - if (print) SvgImage.Save(mesh, "example-4.svg", 500); + if (print) + { + // The ideal area if triangles were equilateral. + var area = Math.Sqrt(3) / 4 * h * h; + + var quality = new QualityMeasure(mesh); + + Console.WriteLine($" Ideal area: {area}"); + Console.WriteLine($" Min. area: {quality.AreaMinimum}"); + Console.WriteLine($" Max. area: {quality.AreaMaximum}"); + + SvgImage.Save(mesh, "example-4.svg", 500); + } return mesh.Triangles.Count > 0; } + // The boundary segment size of the input geometry. + const double h = 0.2; + + // Parameter to relax the maximum area constraint. + const double relax = 1.45; + public static IMesh CreateMesh() { // Generate the input geometry. - var poly = Example3.CreatePolygon(); + var poly = Example3.CreatePolygon(h); // Since we want to do CVT smoothing, ensure that the mesh // is conforming Delaunay. @@ -35,9 +54,11 @@ namespace TriangleNet.Examples // angle, since smoothing will improve the triangle shapes). var quality = new QualityOptions() { - // The boundary segments have a length of 0.2, so we set a - // maximum area constraint assuming equilateral triangles. - MaximumArea = (Math.Sqrt(3) / 4 * 0.2 * 0.2) * 1.45 + // Given the boundary segment size, we set a maximum + // area constraint assuming equilateral triangles. The + // relaxation parameter is chosen to reduce the deviation + // from this ideal value. + MaximumArea = (Math.Sqrt(3) / 4 * h * h) * relax }; // Generate mesh using the polygons Triangulate extension method. diff --git a/src/Triangle.Examples/Examples/Example8.cs b/src/Triangle.Examples/Examples/Example8.cs index 32d66ec..4997696 100644 --- a/src/Triangle.Examples/Examples/Example8.cs +++ b/src/Triangle.Examples/Examples/Example8.cs @@ -21,7 +21,7 @@ namespace TriangleNet.Examples // Generate the input geometry. poly.Add(Generate.Rectangle(0.0, 0.0, 1.0, 1.0)); - // Set minimum angle quality option, ignoring holes. + // Set user test function. var quality = new QualityOptions() { UserTest = MaxEdgeLength diff --git a/src/Triangle.Examples/Program.cs b/src/Triangle.Examples/Program.cs index 0f2c0c3..5822865 100644 --- a/src/Triangle.Examples/Program.cs +++ b/src/Triangle.Examples/Program.cs @@ -2,23 +2,26 @@ namespace TriangleNet { using System; + using System.Linq; using TriangleNet.Examples; class Program { static void Main(string[] args) { - Check("Example 1", Example1.Run()); - Check("Example 2", Example2.Run()); - Check("Example 3", Example3.Run()); - Check("Example 4", Example4.Run()); - Check("Example 5", Example5.Run()); - Check("Example 6", Example6.Run()); - Check("Example 7", Example7.Run()); - Check("Example 8", Example8.Run()); + bool print = args.Contains("--print"); + + Check("Example 1", Example1.Run(print)); + Check("Example 2", Example2.Run(print)); + Check("Example 3", Example3.Run(print)); + Check("Example 4", Example4.Run(print)); + Check("Example 5", Example5.Run(print)); + Check("Example 6", Example6.Run(print)); + Check("Example 7", Example7.Run(print)); + Check("Example 8", Example8.Run(print)); Check("Example 9", Example9.Run()); - Check("Example 10", Example10.Run()); - Check("Example 11", Example11.Run()); + Check("Example 10", Example10.Run(print)); + Check("Example 11", Example11.Run(print)); } static void Check(string item, bool success)