123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- // -----------------------------------------------------------------------
- // <copyright file="Behavior.cs">
- // 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/
- // </copyright>
- // -----------------------------------------------------------------------
- namespace UnityEngine.U2D.Animation.TriangleNet
- {
- using System;
- using Animation.TriangleNet.Geometry;
- /// <summary>
- /// Controls the behavior of the meshing software.
- /// </summary>
- 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<ITriangle, double, bool> 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;
- /// <summary>
- /// Creates an instance of the Behavior class.
- /// </summary>
- public Behavior(bool quality = false, double minAngle = 20.0)
- {
- if (quality)
- {
- this.quality = true;
- this.minAngle = minAngle;
- Update();
- }
- }
- /// <summary>
- /// Update quality options dependencies.
- /// </summary>
- 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
- /// <summary>
- /// No exact arithmetic.
- /// </summary>
- internal static bool NoExact { get; set; }
- #endregion
- #region Public properties
- /// <summary>
- /// Quality mesh generation.
- /// </summary>
- public bool Quality
- {
- get { return quality; }
- set
- {
- quality = value;
- if (quality)
- {
- Update();
- }
- }
- }
- /// <summary>
- /// Minimum angle constraint.
- /// </summary>
- public double MinAngle
- {
- get { return minAngle; }
- set { minAngle = value; Update(); }
- }
- /// <summary>
- /// Maximum angle constraint.
- /// </summary>
- public double MaxAngle
- {
- get { return maxAngle; }
- set { maxAngle = value; Update(); }
- }
- /// <summary>
- /// Maximum area constraint.
- /// </summary>
- public double MaxArea
- {
- get { return maxArea; }
- set
- {
- maxArea = value;
- fixedArea = value > 0.0;
- }
- }
- /// <summary>
- /// Apply a maximum triangle area constraint.
- /// </summary>
- public bool VarArea
- {
- get { return varArea; }
- set { varArea = value; }
- }
- /// <summary>
- /// Input is a Planar Straight Line Graph.
- /// </summary>
- public bool Poly
- {
- get { return poly; }
- set { poly = value; }
- }
- /// <summary>
- /// Apply a user-defined triangle constraint.
- /// </summary>
- public Func<ITriangle, double, bool> UserTest
- {
- get { return usertest; }
- set { usertest = value; }
- }
- /// <summary>
- /// Enclose the convex hull with segments.
- /// </summary>
- public bool Convex
- {
- get { return convex; }
- set { convex = value; }
- }
- /// <summary>
- /// Conforming Delaunay (all triangles are truly Delaunay).
- /// </summary>
- public bool ConformingDelaunay
- {
- get { return conformDel; }
- set { conformDel = value; }
- }
- /// <summary>
- /// Suppresses boundary segment splitting.
- /// </summary>
- /// <remarks>
- /// 0 = split segments
- /// 1 = no new vertices on the boundary
- /// 2 = prevent all segment splitting, including internal boundaries
- /// </remarks>
- public int NoBisect
- {
- get { return noBisect; }
- set
- {
- noBisect = value;
- if (noBisect < 0 || noBisect > 2)
- {
- noBisect = 0;
- }
- }
- }
- /// <summary>
- /// Compute boundary information.
- /// </summary>
- public bool UseBoundaryMarkers
- {
- get { return boundaryMarkers; }
- set { boundaryMarkers = value; }
- }
- /// <summary>
- /// Ignores holes in polygons.
- /// </summary>
- public bool NoHoles
- {
- get { return noHoles; }
- set { noHoles = value; }
- }
- /// <summary>
- /// Jettison unused vertices from output.
- /// </summary>
- public bool Jettison
- {
- get { return jettison; }
- set { jettison = value; }
- }
- #endregion
- }
- }
|