public override Value Evaluate(FSharpList <Value> args) { var input = args[0]; var result = FSharpList <Value> .Empty; if (input.IsList) { var uvList = (input as Value.List).Item; int length = uvList.Length; var verts = new List <Vertex2>(); for (int i = 0; i < length; i++) { UV uv = (UV)((Value.Container)uvList[i]).Item; Vertex2 vert = new Vertex2(uv.U, uv.V); verts.Add(vert); } var triangulation = DelaunayTriangulation <Vertex2, Cell2> .Create(verts); _tessellationLines.Clear(); object arg1 = ((Value.Container)args[1]).Item; var f = arg1 as Face; if (f != null) { // there are three vertices per cell in 2D foreach (var cell in triangulation.Cells) { var v1 = cell.Vertices[0]; var v2 = cell.Vertices[1]; var v3 = cell.Vertices[2]; var uv1 = new UV(v1.Position[0], v1.Position[1]); var uv2 = new UV(v2.Position[0], v2.Position[1]); var uv3 = new UV(v3.Position[0], v3.Position[1]); if (!f.IsInside(uv1) || !f.IsInside(uv2) || !f.IsInside(uv3)) { continue; } var xyz1 = f.Evaluate(uv1); var xyz2 = f.Evaluate(uv2); var xyz3 = f.Evaluate(uv3); if (xyz1.DistanceTo(xyz2) > 0.1) { var l1 = this.UIDocument.Application.Application.Create.NewLineBound(xyz1, xyz2); _tessellationLines.Add(l1); result = FSharpList <Value> .Cons(Value.NewContainer(l1), result); } if (xyz2.DistanceTo(xyz3) > 0.1) { var l1 = this.UIDocument.Application.Application.Create.NewLineBound(xyz3, xyz2); _tessellationLines.Add(l1); result = FSharpList <Value> .Cons(Value.NewContainer(l1), result); } if (xyz3.DistanceTo(xyz1) > 0.1) { var l1 = this.UIDocument.Application.Application.Create.NewLineBound(xyz1, xyz3); _tessellationLines.Add(l1); result = FSharpList <Value> .Cons(Value.NewContainer(l1), result); } } } return(Value.NewList(result)); } return(Value.NewList(result)); }