public Triangulate ( |
||
input | ||
return | void |
public void Triangulate(InputGeometry input)
{
ResetData();
behavior.Poly = input.HasSegments;
//behavior.useSegments = input.HasSegments;
//if (input.EdgeMarkers != null)
//{
// behavior.UseBoundaryMarkers = true;
//}
// TODO: remove
if (!behavior.Poly)
{
// Be careful not to allocate space for element area constraints that
// will never be assigned any value (other than the default -1.0).
behavior.VarArea = false;
// Be careful not to add an extra attribute to each element unless the
// input supports it (PSLG in, but not refining a preexisting mesh).
behavior.useRegions = false;
}
behavior.useRegions = input.Regions.Count > 0;
steinerleft = behavior.SteinerPoints;
TransferNodes(input);
hullsize = Delaunay(); // Triangulate the vertices.
// Ensure that no vertex can be mistaken for a triangular bounding
// box vertex in insertvertex().
infvertex1 = null;
infvertex2 = null;
infvertex3 = null;
if (behavior.useSegments)
{
// Segments will be introduced next.
checksegments = true;
// Insert PSLG segments and/or convex hull segments.
FormSkeleton(input);
}
if (behavior.Poly && (triangles.Count > 0))
{
// Copy holes
foreach (var item in input.holes)
{
holes.Add(item);
}
// Copy regions
foreach (var item in input.regions)
{
regions.Add(item);
}
//dummytri.neighbors[2].triangle = dummytri;
// Carve out holes and concavities.
Carver c = new Carver(this);
c.CarveHoles();
}
else
{
// Without a PSLG, there can be no holes or regional attributes
// or area constraints. The following are set to zero to avoid
// an accidental free() later.
//
// TODO: -
holes.Clear();
regions.Clear();
}
if (behavior.Quality && (triangles.Count > 0))
{
quality.EnforceQuality(); // Enforce angle and area constraints.
}
// Calculate the number of edges.
edges = (3 * triangles.Count + hullsize) / 2;
}
Mesh::Triangulate ( string inputFile ) : void |
public Mesh CreateMeshFromPoints(bool combine) { if (spriteRenderer != null && points.Length > 2) { int pointNum = points.Length; if (combine && combineMesh != null) { pointNum = points.Length + combineMesh.vertices.Length; } //Create triangle.NET geometry TriangleNet.Geometry.InputGeometry geometry = new TriangleNet.Geometry.InputGeometry(pointNum); geometry.AddPolygon(points); if (combine && combineMesh != null) { geometry.AddPolygon(combineMesh.vertices.Select(x => (Vector2)x).ToArray()); } //Triangulate TriangleNet.Mesh triangleMesh = new TriangleNet.Mesh(); triangleMesh.Triangulate(geometry); //transform vertices points = new Vector2[triangleMesh.Vertices.Count]; Vector3[] vertices = new Vector3[triangleMesh.Vertices.Count]; Vector3[] normals = new Vector3[triangleMesh.Vertices.Count]; int n = 0; foreach(TriangleNet.Data.Vertex v in triangleMesh.Vertices) { points[n] = new Vector2((float)v.X, (float)v.Y); vertices[n] = new Vector3((float)v.X, (float)v.Y, 0); normals[n]=new Vector3(0,0,-1); n++; } //transform triangles int[] triangles = triangleMesh.Triangles.ToUnityMeshTriangleIndices(); mesh.Clear(); mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = triangles; mesh.uv = genUV(mesh.vertices); mesh.normals = normals; return mesh; } else { return null; } }