示例#1
0
        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));
        }