Files
2026-03-04 10:03:45 +08:00

255 lines
3.2 KiB
C#

using System;
using TriangleNet.Geometry;
namespace TriangleNet
{
internal class Behavior
{
private bool poly;
private bool quality;
private bool varArea;
private bool convex;
private bool jettison;
private bool boundaryMarkers = true;
private bool noHoles;
private bool conformDel;
private Func<ITriangle, double, bool> usertest;
private int noBisect;
private double minAngle;
private double maxAngle;
private double maxArea = -1.0;
internal bool fixedArea;
internal bool useSegments = true;
internal bool useRegions;
internal double goodAngle;
internal double maxGoodAngle;
internal double offconstant;
public static bool NoExact { get; set; }
public bool Quality
{
get
{
return quality;
}
set
{
quality = value;
if (quality)
{
Update();
}
}
}
public double MinAngle
{
get
{
return minAngle;
}
set
{
minAngle = value;
Update();
}
}
public double MaxAngle
{
get
{
return maxAngle;
}
set
{
maxAngle = value;
Update();
}
}
public double MaxArea
{
get
{
return maxArea;
}
set
{
maxArea = value;
fixedArea = value > 0.0;
}
}
public bool VarArea
{
get
{
return varArea;
}
set
{
varArea = value;
}
}
public bool Poly
{
get
{
return poly;
}
set
{
poly = value;
}
}
public Func<ITriangle, double, bool> UserTest
{
get
{
return usertest;
}
set
{
usertest = value;
}
}
public bool Convex
{
get
{
return convex;
}
set
{
convex = value;
}
}
public bool ConformingDelaunay
{
get
{
return conformDel;
}
set
{
conformDel = value;
}
}
public int NoBisect
{
get
{
return noBisect;
}
set
{
noBisect = value;
if (noBisect < 0 || noBisect > 2)
{
noBisect = 0;
}
}
}
public bool UseBoundaryMarkers
{
get
{
return boundaryMarkers;
}
set
{
boundaryMarkers = value;
}
}
public bool NoHoles
{
get
{
return noHoles;
}
set
{
noHoles = value;
}
}
public bool Jettison
{
get
{
return jettison;
}
set
{
jettison = value;
}
}
public Behavior(bool quality = false, double minAngle = 20.0)
{
if (quality)
{
this.quality = true;
this.minAngle = minAngle;
Update();
}
}
private void Update()
{
quality = true;
if (minAngle < 0.0 || minAngle > 60.0)
{
minAngle = 0.0;
quality = false;
Log.Instance.Warning("Invalid quality option (minimum angle).", "Mesh.Behavior");
}
if (maxAngle != 0.0 && (maxAngle < 60.0 || maxAngle > 180.0))
{
maxAngle = 0.0;
quality = false;
Log.Instance.Warning("Invalid quality option (maximum angle).", "Mesh.Behavior");
}
useSegments = Poly || Quality || Convex;
goodAngle = Math.Cos(MinAngle * Math.PI / 180.0);
maxGoodAngle = Math.Cos(MaxAngle * Math.PI / 180.0);
if (goodAngle == 1.0)
{
offconstant = 0.0;
}
else
{
offconstant = 0.475 * Math.Sqrt((1.0 + goodAngle) / (1.0 - goodAngle));
}
goodAngle *= goodAngle;
}
}
}