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.