// -----------------------------------------------------------------------
//
// Original Triangle code by Jonathan Richard Shewchuk, http://www.cs.cmu.edu/~quake/triangle.html
// Triangle.NET code by Christian Woltering, http://triangle.codeplex.com/
//
// -----------------------------------------------------------------------
namespace TriangleNet
{
using System;
using TriangleNet.Geometry;
///
/// Controls the behavior of the meshing software.
///
class Behavior
{
bool poly = false;
bool quality = false;
bool varArea = false;
bool convex = false;
bool jettison = false;
bool boundaryMarkers = true;
bool noHoles = false;
bool conformDel = false;
Func usertest;
int noBisect = 0;
double minAngle = 0.0;
double maxAngle = 0.0;
double maxArea = -1.0;
internal bool fixedArea = false;
internal bool useSegments = true;
internal bool useRegions = false;
internal double goodAngle = 0.0;
internal double maxGoodAngle = 0.0;
internal double offconstant = 0.0;
///
/// Creates an instance of the Behavior class.
///
public Behavior(bool quality = false, double minAngle = 20.0)
{
if (quality)
{
this.quality = true;
this.minAngle = minAngle;
Update();
}
}
///
/// Update quality options dependencies.
///
private void Update()
{
this.quality = true;
if (this.minAngle < 0 || this.minAngle > 60)
{
this.minAngle = 0;
this.quality = false;
Log.Instance.Warning("Invalid quality option (minimum angle).", "Mesh.Behavior");
}
if ((this.maxAngle != 0.0) && (this.maxAngle < 60 || this.maxAngle > 180))
{
this.maxAngle = 0;
this.quality = false;
Log.Instance.Warning("Invalid quality option (maximum angle).", "Mesh.Behavior");
}
this.useSegments = this.Poly || this.Quality || this.Convex;
this.goodAngle = Math.Cos(this.MinAngle * Math.PI / 180.0);
this.maxGoodAngle = Math.Cos(this.MaxAngle * Math.PI / 180.0);
if (this.goodAngle == 1.0)
{
this.offconstant = 0.0;
}
else
{
this.offconstant = 0.475 * Math.Sqrt((1.0 + this.goodAngle) / (1.0 - this.goodAngle));
}
this.goodAngle *= this.goodAngle;
}
#region Static properties
///
/// No exact arithmetic.
///
public static bool NoExact { get; set; }
#endregion
#region Public properties
///
/// Quality mesh generation.
///
public bool Quality
{
get { return quality; }
set
{
quality = value;
if (quality)
{
Update();
}
}
}
///
/// Minimum angle constraint.
///
public double MinAngle
{
get { return minAngle; }
set { minAngle = value; Update(); }
}
///
/// Maximum angle constraint.
///
public double MaxAngle
{
get { return maxAngle; }
set { maxAngle = value; Update(); }
}
///
/// Maximum area constraint.
///
public double MaxArea
{
get { return maxArea; }
set
{
maxArea = value;
fixedArea = value > 0.0;
}
}
///
/// Apply a maximum triangle area constraint.
///
public bool VarArea
{
get { return varArea; }
set { varArea = value; }
}
///
/// Input is a Planar Straight Line Graph.
///
public bool Poly
{
get { return poly; }
set { poly = value; }
}
///
/// Apply a user-defined triangle constraint.
///
public Func UserTest
{
get { return usertest; }
set { usertest = value; }
}
///
/// Enclose the convex hull with segments.
///
public bool Convex
{
get { return convex; }
set { convex = value; }
}
///
/// Conforming Delaunay (all triangles are truly Delaunay).
///
public bool ConformingDelaunay
{
get { return conformDel; }
set { conformDel = value; }
}
///
/// Suppresses boundary segment splitting.
///
///
/// 0 = split segments
/// 1 = no new vertices on the boundary
/// 2 = prevent all segment splitting, including internal boundaries
///
public int NoBisect
{
get { return noBisect; }
set
{
noBisect = value;
if (noBisect < 0 || noBisect > 2)
{
noBisect = 0;
}
}
}
///
/// Compute boundary information.
///
public bool UseBoundaryMarkers
{
get { return boundaryMarkers; }
set { boundaryMarkers = value; }
}
///
/// Ignores holes in polygons.
///
public bool NoHoles
{
get { return noHoles; }
set { noHoles = value; }
}
///
/// Jettison unused vertices from output.
///
public bool Jettison
{
get { return jettison; }
set { jettison = value; }
}
#endregion
}
}