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);
    }