public List <DivisionTriangle> BowyerWatsonTriangulate(List <Vector3> points) { List <DivisionTriangle> triangles = new List <DivisionTriangle>(); (DivisionTriangle, DivisionTriangle)supertriangles = CreateSupertriangles(GetComponent <DivisionModel>().corners); triangles.Add(supertriangles.Item1); triangles.Add(supertriangles.Item2); foreach (Vector3 point in points) { List <DivisionTriangle> badTriangles = new List <DivisionTriangle>(); foreach (DivisionTriangle triangle in triangles) { if (Vector3.Distance(point, triangle.circumcenter) <= triangle.circumradius) { badTriangles.Add(triangle); } } List <Edge> polygon = new List <Edge>(); bool isEdgeUnique = true; foreach (DivisionTriangle outerTriangle in badTriangles) { foreach (Edge outerEdge in outerTriangle.edges) { isEdgeUnique = true; foreach (DivisionTriangle innerTriangle in badTriangles) { foreach (Edge innerEdge in innerTriangle.edges) { if (innerTriangle.id != outerTriangle.id) { if (innerEdge.innerHalf.Equals(outerEdge.innerHalf)) { isEdgeUnique = false; } else if (innerEdge.outerHalf.Equals(outerEdge.innerHalf)) { isEdgeUnique = false; } else if (innerEdge.outerHalf.Equals(outerEdge.outerHalf)) { isEdgeUnique = false; } } } } if (isEdgeUnique) { polygon.Add(outerEdge); } } } foreach (DivisionTriangle triangle in badTriangles) { for (int index = 0; index < triangles.Count; index++) { if (triangle.Equals(triangles[index])) { triangles.RemoveAt(index); break; } } } badTriangles.Clear(); foreach (Edge edge in polygon) { DivisionTriangle newTriangle = new DivisionTriangle(); newTriangle = CreateTriangle(point, edge.innerHalf.Item1, edge.innerHalf.Item2); triangles.Add(newTriangle); } } if (GetComponent <DivisionModel>().numberOfPieces % 2 != 0) { DividePiece(triangles); } Transformer.CenterTriangles(triangles); Transformer.RandomizeInitialPlacement(triangles, GetComponent <DivisionModel>().boardSize); Transformer.RandomizeInitialOrientation(triangles); return(triangles); }