Exemple #1
0
        /// <summary>
        ///     Creates a Delaunay triangulation of a surface with a given set of UV parameters.
        /// </summary>
        /// <param name="uvs">Set of UV parameters.</param>
        /// <param name="face">Surface to triangulate.</param>
        public static IEnumerable<Curve> ByParametersOnSurface(IEnumerable<UV> uvs, Surface face)
        {
            var verts = uvs.Select(Vertex2.FromUV).ToList();
            var triangulation = DelaunayTriangulation<Vertex2, Cell2>.Create(verts, new TriangulationComputationConfig());

            // there are three vertices per cell in 2D
            foreach (var cell in triangulation.Cells)
            {
                var v1 = cell.Vertices[0].AsVector();
                var v2 = cell.Vertices[1].AsVector();
                var v3 = cell.Vertices[2].AsVector();

                var xyz1 = face.PointAtParameter(v1.X, v1.Y);
                var xyz2 = face.PointAtParameter(v2.X, v2.Y);
                var xyz3 = face.PointAtParameter(v3.X, v3.Y);

                if (xyz1.DistanceTo(xyz2) > 0.1)
                {
                    var l1 = Line.ByStartPointEndPoint(xyz1, xyz2);
                    yield return l1;
                }

                if (xyz2.DistanceTo(xyz3) > 0.1)
                {
                    var l1 = Line.ByStartPointEndPoint(xyz3, xyz2);
                    yield return l1;
                }

                if (xyz3.DistanceTo(xyz1) > 0.1)
                {
                    var l1 = Line.ByStartPointEndPoint(xyz1, xyz3);
                    yield return l1;
                }
            }
        }
Exemple #2
0
        /// <summary>
        ///     Creates a Voronoi tessellation of a surface with a given set of UV parameters.
        /// </summary>
        /// <param name="uvs">Set of UV parameters.</param>
        /// <param name="face">Surface to tesselate.</param>
        public static IEnumerable<Curve> ByParametersOnSurface(IEnumerable<UV> uvs, Surface face)
        {
            var verts = uvs.Select(Vertex2.FromUV);
            var voronoiMesh = VoronoiMesh.Create<Vertex2, Cell2>(verts);

            return from edge in voronoiMesh.Edges
                   let _from = edge.Source.Circumcenter
                   let to = edge.Target.Circumcenter
                   let start = face.PointAtParameter(_from.X, _from.Y)
                   let end = face.PointAtParameter(to.X, to.Y)
                   where start.DistanceTo(end) > 0.1
                   select Line.ByStartPointEndPoint(start, end);
        }