130 lines
3.6 KiB
C#
130 lines
3.6 KiB
C#
|
// -----------------------------------------------------------------------
|
||
|
// <copyright file="Triangle.cs" company="">
|
||
|
// 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
|
||
|
.Topology
|
||
|
{
|
||
|
using System;
|
||
|
using Animation.TriangleNet.Geometry;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The triangle data structure.
|
||
|
/// </summary>
|
||
|
internal class Triangle : ITriangle
|
||
|
{
|
||
|
// Hash for dictionary. Will be set by mesh instance.
|
||
|
internal int hash;
|
||
|
|
||
|
// The ID is only used for mesh output.
|
||
|
internal int id;
|
||
|
|
||
|
internal Otri[] neighbors;
|
||
|
internal Vertex[] vertices;
|
||
|
internal Osub[] subsegs;
|
||
|
internal int label;
|
||
|
internal double area;
|
||
|
internal bool infected;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Initializes a new instance of the <see cref="Triangle" /> class.
|
||
|
/// </summary>
|
||
|
public Triangle()
|
||
|
{
|
||
|
// Three NULL vertices.
|
||
|
vertices = new Vertex[3];
|
||
|
|
||
|
// Initialize the three adjoining subsegments to be the omnipresent subsegment.
|
||
|
subsegs = new Osub[3];
|
||
|
|
||
|
// Initialize the three adjoining triangles to be "outer space".
|
||
|
neighbors = new Otri[3];
|
||
|
|
||
|
// area = -1.0;
|
||
|
}
|
||
|
|
||
|
#region Public properties
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets or sets the triangle id.
|
||
|
/// </summary>
|
||
|
public int ID
|
||
|
{
|
||
|
get { return this.id; }
|
||
|
set { this.id = value; }
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Region ID the triangle belongs to.
|
||
|
/// </summary>
|
||
|
public int Label
|
||
|
{
|
||
|
get { return this.label; }
|
||
|
set { this.label = value; }
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the triangle area constraint.
|
||
|
/// </summary>
|
||
|
public double Area
|
||
|
{
|
||
|
get { return this.area; }
|
||
|
set { this.area = value; }
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the specified corners vertex.
|
||
|
/// </summary>
|
||
|
public Vertex GetVertex(int index)
|
||
|
{
|
||
|
return this.vertices[index]; // TODO: Check range?
|
||
|
}
|
||
|
|
||
|
public int GetVertexID(int index)
|
||
|
{
|
||
|
return this.vertices[index].id;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets a triangles' neighbor.
|
||
|
/// </summary>
|
||
|
/// <param name="index">The neighbor index (0, 1 or 2).</param>
|
||
|
/// <returns>The neigbbor opposite of vertex with given index.</returns>
|
||
|
public ITriangle GetNeighbor(int index)
|
||
|
{
|
||
|
return neighbors[index].tri.hash == Mesh.DUMMY ? null : neighbors[index].tri;
|
||
|
}
|
||
|
|
||
|
/// <inheritdoc />
|
||
|
public int GetNeighborID(int index)
|
||
|
{
|
||
|
return neighbors[index].tri.hash == Mesh.DUMMY ? -1 : neighbors[index].tri.id;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets a triangles segment.
|
||
|
/// </summary>
|
||
|
/// <param name="index">The vertex index (0, 1 or 2).</param>
|
||
|
/// <returns>The segment opposite of vertex with given index.</returns>
|
||
|
public ISegment GetSegment(int index)
|
||
|
{
|
||
|
return subsegs[index].seg.hash == Mesh.DUMMY ? null : subsegs[index].seg;
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
public override int GetHashCode()
|
||
|
{
|
||
|
return this.hash;
|
||
|
}
|
||
|
|
||
|
public override string ToString()
|
||
|
{
|
||
|
return String.Format("TID {0}", hash);
|
||
|
}
|
||
|
}
|
||
|
}
|