public Mesh Build(Func <Vertex2D, Vector3> coord) { var mesh = new Mesh(); var vertices = P.Select(p => { return(coord(p)); }).ToArray(); var triangles = new List <int>(); for (int i = 0, n = T.Count; i < n; i++) { var t = T[i]; int a = P.IndexOf(t.a), b = P.IndexOf(t.b), c = P.IndexOf(t.c); if (a < 0 || b < 0 || c < 0) { // Debug.Log(a + " : " + b + " : " + c); continue; } if (Utils2D.LeftSide(t.a.Coordinate, t.b.Coordinate, t.c.Coordinate)) { triangles.Add(a); triangles.Add(c); triangles.Add(b); } else { triangles.Add(a); triangles.Add(b); triangles.Add(c); } } mesh.vertices = vertices; mesh.SetTriangles(triangles.ToArray(), 0); mesh.RecalculateNormals(); return(mesh); }
/* * slow incremental approach * O(n * log(n)) */ public static Polygon2D ConvexHull(Vector2[] points) { var ordered = points.ToList().OrderBy(p => p.x).ToList(); var upper = new List <Vector2>(); upper.Add(ordered[0]); upper.Add(ordered[1]); for (int i = 2, n = ordered.Count; i < n; i++) { upper.Add(ordered[i]); int l = upper.Count; if (l > 2) { var p = upper[l - 3]; var r = upper[l - 2]; var q = upper[l - 1]; if (Utils2D.LeftSide(p, q, r)) // r is left side of pq { upper.RemoveAt(l - 2); } } } var lower = new List <Vector2>(); lower.Add(ordered[ordered.Count - 1]); lower.Add(ordered[ordered.Count - 2]); for (int i = ordered.Count - 3; i >= 0; i--) { lower.Add(ordered[i]); int l = lower.Count; if (l > 2) { var p = lower[l - 3]; var r = lower[l - 2]; var q = lower[l - 1]; if (Utils2D.LeftSide(p, q, r)) // r is left side of pq { lower.RemoveAt(l - 2); } } } lower.RemoveAt(lower.Count - 1); lower.RemoveAt(0); upper.AddRange(lower); return(new Polygon2D(upper.ToArray())); }
public Mesh Build() { var mesh = new Mesh(); var vertices = P.Select(p => { var xy = p.Coordinate; var v = new Vector3(xy.x, xy.y, 0f); return(v); }).ToArray(); var triangles = new int[T.Count * 3]; for (int i = 0, n = T.Count; i < n; i++) { var t = T[i]; var i3 = i * 3; int a = P.IndexOf(t.a), b = P.IndexOf(t.b), c = P.IndexOf(t.c); if (Utils2D.LeftSide(t.a.Coordinate, t.b.Coordinate, t.c.Coordinate)) { triangles[i3] = a; triangles[i3 + 1] = c; triangles[i3 + 2] = b; } else { triangles[i3] = a; triangles[i3 + 1] = b; triangles[i3 + 2] = c; } } mesh.vertices = vertices; mesh.SetTriangles(triangles, 0); mesh.RecalculateNormals(); return(mesh); }