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