protected override void BuildMeshComponents() { Vertices = new Vector3[4]; Vector2 center = (verts[0] + verts[1] + verts[2] + verts[3]) * 0.25f; for (int i = 0; i < 4; i++) { Vertices[i] = verts[i] - center; } if (MeshHelper.IsPointInTriangle(verts[0], verts[1], verts[2], verts[3])) { Triangles = new int[] { 0, 2, 3, 0, 1, 2 }; } else if (!MeshHelper.IsPointInTriangle(verts[3], verts[0], verts[1], verts[2])) { if (MeshHelper.IsPointInTriangle(verts[2], verts[0], verts[1], verts[3])) { Triangles = new int[] { 0, 2, 3, 1, 0, 2 }; } else { Triangles = new int[] { 0, 1, 3, 1, 2, 3 }; } } else { Triangles = new int[] { 0, 1, 3, 2, 3, 1 }; } UVs = MeshHelper.UVUnwrap(Vertices); }
public static List<Vector2Triple> GetTriangles(List<Vector2> sourcePoints) { List<Vector2Triple> triangles = new List<Vector2Triple>(); int MAX = sourcePoints.Count * sourcePoints.Count; //temporary List of points List<Vector2> verts = sourcePoints; //was shape drawn clockwise? bool isCW = IsShapeClockWise(verts); int start = 0; int repeats = 0; while (verts.Count > 2 && repeats < MAX) { bool earNotFound = true; while (earNotFound && repeats < MAX) { repeats++; start %= verts.Count; int middle = (start + 1) % verts.Count; int end = (start + 2) % verts.Count; triangles.Add(new Vector2Triple(verts[start], verts[middle], verts[end])); //is current point convex? bool isConvex = IsPointConvex(verts[start], verts[middle], verts[middle], verts[end], !isCW) && IsPointConvex(verts[middle], verts[end], verts[end], verts[start], !isCW) && IsPointConvex(verts[end], verts[start], verts[start], verts[middle], !isCW); if (!isConvex) { //reject the triangle start++; triangles.RemoveAt(triangles.Count - 1); continue; } bool noPointsIn = true; for (int i = 0; i < verts.Count; i++) if (i != start && i != middle && i != end) if (MeshHelper.IsPointInTriangle(verts[i], verts[start], verts[middle], verts[end]) && noPointsIn) { //there's a point in triangle noPointsIn = false; //reject the triangle start++; triangles.RemoveAt(triangles.Count - 1); break; } if (noPointsIn) { earNotFound = false; //add triangle to set verts.RemoveAt(middle); } } } return triangles; }
public static List<IntTriple> TriangulationToInt3(List<Vector2> sourcePoints) { List<IntTriple> triangles = new List<IntTriple>(); int MAX = sourcePoints.Count * sourcePoints.Count; //temporary List of points List<VecIndexPair> verts = VecIndexPair.Get(sourcePoints); //was shape drew clockwise? bool isCW = IsShapeClockWise(sourcePoints); int start = 0; int repeats = 0; while (verts.Count > 2 && repeats < MAX) { bool earNotFound = true; while (earNotFound && repeats < MAX) { repeats++; start %= verts.Count; int middle = (start + 1) % verts.Count; int end = (start + 2) % verts.Count; //change the order to fit triangle mesh facing triangles.Add(new IntTriple(verts[start].index, verts[end].index, verts[middle].index)); //is current point convex? bool isConvex = IsPointConvex(verts[start].v, verts[middle].v, verts[middle].v, verts[end].v, !isCW) && IsPointConvex(verts[middle].v, verts[end].v, verts[end].v, verts[start].v, !isCW) && IsPointConvex(verts[end].v, verts[start].v, verts[start].v, verts[middle].v, !isCW); if (!isConvex) { //reject the triangle start++; triangles.RemoveAt(triangles.Count - 1); continue; } bool noPointsIn = true; for (int i = 0; i < verts.Count; i++) { if (i != start && i != middle && i != end) if (MeshHelper.IsPointInTriangle(verts[i].v, verts[start].v, verts[middle].v, verts[end].v) && noPointsIn) { //there's a point in triangle noPointsIn = false; //reject the triangle start++; triangles.RemoveAt(triangles.Count - 1); break; } } if (noPointsIn) { earNotFound = false; //add triangle to set verts.RemoveAt(middle); } } } return triangles; }