From efe0da057a16ce40f6a7d0f9dee720d226e7842a Mon Sep 17 00:00:00 2001 From: wo80 Date: Tue, 19 Jul 2022 13:01:31 +0200 Subject: [PATCH] Update QualityMeasure and example 4 (closes #21) --- src/Triangle.Examples/Examples/Example4.cs | 13 +- src/Triangle/Tools/QualityMeasure.cs | 236 +++++++-------------- 2 files changed, 83 insertions(+), 166 deletions(-) diff --git a/src/Triangle.Examples/Examples/Example4.cs b/src/Triangle.Examples/Examples/Example4.cs index 9715d36..252b4a6 100644 --- a/src/Triangle.Examples/Examples/Example4.cs +++ b/src/Triangle.Examples/Examples/Example4.cs @@ -18,21 +18,22 @@ namespace TriangleNet.Examples // Generate mesh. var mesh = CreateMesh(); + // The ideal area if triangles were equilateral. + var area = Math.Sqrt(3) / 4 * h * h; + + var quality = new QualityMeasure(mesh); + 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}"); + Console.WriteLine($" Avg. area: {quality.AreaTotal / mesh.Triangles.Count}"); SvgImage.Save(mesh, "example-4.svg", 500); } - return mesh.Triangles.Count > 0; + return quality.AreaMinimum < area && quality.AreaMaximum > area; } // The boundary segment size of the input geometry. diff --git a/src/Triangle/Tools/QualityMeasure.cs b/src/Triangle/Tools/QualityMeasure.cs index 87c661a..08780fb 100644 --- a/src/Triangle/Tools/QualityMeasure.cs +++ b/src/Triangle/Tools/QualityMeasure.cs @@ -58,6 +58,71 @@ namespace TriangleNet.Tools AlphaMeasure alphaMeasure; Q_Measure qMeasure; + + #region Public properties + + /// + /// Minimum triangle area. + /// + public double AreaMinimum => areaMeasure.area_min; + + /// + /// Maximum triangle area. + /// + public double AreaMaximum => areaMeasure.area_max; + + /// + /// Total triangulation area. + /// + public double AreaTotal => areaMeasure.area_total; + + /// + /// Ratio of maximum and minimum triangle area. + /// + public double AreaRatio => areaMeasure.area_max / areaMeasure.area_min; + + /// + /// Smallest angle. + /// + public double AlphaMinimum => alphaMeasure.alpha_min; + + /// + /// Maximum smallest angle. + /// + public double AlphaMaximum => alphaMeasure.alpha_max; + + /// + /// Average angle. + /// + public double AlphaAverage => alphaMeasure.alpha_ave; + + /// + /// Average angle weighted by area. + /// + public double AlphaArea => alphaMeasure.alpha_area; + + /// + /// Smallest aspect ratio. + /// + public double Q_Minimum => qMeasure.q_min; + + /// + /// Largest aspect ratio. + /// + public double Q_Maximum => qMeasure.q_max; + + /// + /// Average aspect ratio. + /// + public double Q_Average => qMeasure.q_ave; + + /// + /// Average aspect ratio weighted by area. + /// + public double Q_Area => qMeasure.q_area; + + #endregion + /// /// Initializes a new instance of the class. /// @@ -67,108 +132,6 @@ namespace TriangleNet.Tools alphaMeasure = new AlphaMeasure(); qMeasure = new Q_Measure(); - Compute(mesh); - } - - #region Public properties - - /// - /// Minimum triangle area. - /// - public double AreaMinimum - { - get { return areaMeasure.area_min; } - } - - /// - /// Maximum triangle area. - /// - public double AreaMaximum - { - get { return areaMeasure.area_max; } - } - - /// - /// Ratio of maximum and minimum triangle area. - /// - public double AreaRatio - { - get { return areaMeasure.area_max / areaMeasure.area_min; } - } - - /// - /// Smallest angle. - /// - public double AlphaMinimum - { - get { return alphaMeasure.alpha_min; } - } - - /// - /// Maximum smallest angle. - /// - public double AlphaMaximum - { - get { return alphaMeasure.alpha_max; } - } - - /// - /// Average angle. - /// - public double AlphaAverage - { - get { return alphaMeasure.alpha_ave; } - } - - /// - /// Average angle weighted by area. - /// - public double AlphaArea - { - get { return alphaMeasure.alpha_area; } - } - - /// - /// Smallest aspect ratio. - /// - public double Q_Minimum - { - get { return qMeasure.q_min; } - } - - /// - /// Largest aspect ratio. - /// - public double Q_Maximum - { - get { return qMeasure.q_max; } - } - - /// - /// Average aspect ratio. - /// - public double Q_Average - { - get { return qMeasure.q_ave; } - } - - /// - /// Average aspect ratio weighted by area. - /// - public double Q_Area - { - get { return qMeasure.q_area; } - } - - #endregion - - private void Compute(IMesh mesh) - { - // Reset all measures. - areaMeasure.Reset(); - alphaMeasure.Reset(); - qMeasure.Reset(); - Point a, b, c; double ab, bc, ca; double lx, ly; @@ -271,17 +234,6 @@ namespace TriangleNet.Tools // Number of triangles with zero area public int area_zero = 0; - /// - /// Reset all values. - /// - public void Reset() - { - area_min = double.MaxValue; - area_max = -double.MaxValue; - area_total = 0; - area_zero = 0; - } - /// /// Compute the area of given triangle. /// @@ -299,7 +251,7 @@ namespace TriangleNet.Tools if (area == 0.0) { - area_zero = area_zero + 1; + area_zero++; } return area; @@ -321,40 +273,13 @@ namespace TriangleNet.Tools class AlphaMeasure { // Minimum value over all triangles - public double alpha_min; + public double alpha_min = double.MaxValue; // Maximum value over all triangles - public double alpha_max; + public double alpha_max = -double.MaxValue; // Value averaged over all triangles - public double alpha_ave; + public double alpha_ave = 0; // Value averaged over all triangles and weighted by area - public double alpha_area; - - /// - /// Reset all values. - /// - public void Reset() - { - alpha_min = double.MaxValue; - alpha_max = -double.MaxValue; - alpha_ave = 0; - alpha_area = 0; - } - - double acos(double c) - { - if (c <= -1.0) - { - return Math.PI; - } - else if (1.0 <= c) - { - return 0.0; - } - else - { - return Math.Acos(c); - } - } + public double alpha_area = 0; /// /// Compute q value of given triangle. @@ -427,6 +352,8 @@ namespace TriangleNet.Tools alpha_max = Math.Max(alpha, alpha_max); return alpha; + + double acos(double c) => (c <= -1.0) ? Math.PI : ((1.0 <= c) ? 0.0 : Math.Acos(c)); } /// @@ -470,24 +397,13 @@ namespace TriangleNet.Tools class Q_Measure { // Minimum value over all triangles - public double q_min; + public double q_min = double.MaxValue; // Maximum value over all triangles - public double q_max; + public double q_max = -double.MaxValue; // Average value - public double q_ave; + public double q_ave = 0; // Average value weighted by the area of each triangle - public double q_area; - - /// - /// Reset all values. - /// - public void Reset() - { - q_min = double.MaxValue; - q_max = -double.MaxValue; - q_ave = 0; - q_area = 0; - } + public double q_area = 0; /// /// Compute q value of given triangle.