// Bowyer-Watson algorithm
public IList <Triangle> Triangulate(Vector3[] pointList)
{
List <Triangle> triangulation = new List <Triangle>();
Triangle superTriangle = CreateBoundingTriangle(pointList);
triangulation.Add(superTriangle);
for (int i = 0; i < pointList.Length; i++)
{
List <Triangle> badTriangles = new List <Triangle>();
for (int j = 0; j < triangulation.Count; j++)
{
Triangle triangle = triangulation[j];
if (triangle.IsInsideCircumcircle(pointList[i]))
{
badTriangles.Add(triangle);
}
}
ICollection <Edge> polygon = new HashSet <Edge>();
if (badTriangles.Count == 1)
{
Triangle triangle = badTriangles[0];
IList <Edge> edges = triangle.GetEdges();
foreach (Edge edge in edges)
{
polygon.Add(edge);
}
}
for (int j = 0; j < badTriangles.Count; j++)
{
Triangle triangle = badTriangles[j];
foreach (Edge edge in triangle.GetEdges())
{
ICollection <Triangle> triangleList = new HashSet <Triangle>(badTriangles);
triangleList.Remove(triangle);
if (edge.IsEdgeUnshared(triangleList))
{
polygon.Add(edge);
}
}
}
//remove each triangle in badTriangles from triangulation
foreach (Triangle triangle in badTriangles)
{
//remove triangle from triangulation
triangulation.Remove(triangle);
}
foreach (Edge edge in polygon)
{
Triangle newTri = new Triangle(pointList[i], edge.A, edge.B);
if (newTri.IsValid() && !triangulation.Contains(newTri))
{
triangulation.Add(newTri);
}
}
}
triangulation = triangulation.FindAll(triangle => triangle.ContainsVertex(pointList));
return(triangulation);
}