Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /*
         * 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);
        }