SetId() 공개 메소드

public SetId ( int id ) : Point
id int
리턴 Point
예제 #1
0
        public static Triangle[] Triangulate(List <Point> points)
        {
            int nv = points.Count;

            int trimax = nv * 4;

            float xmin = points[0].x;
            float ymin = points[0].y;
            float xmax = xmin;
            float ymax = ymin;

            for (int i = 0; i < points.Count; i++)
            {
                Point point = points[i].SetId(i);

                if (point.x < xmin)
                {
                    xmin = point.z;
                }
                else if (point.x > xmax)
                {
                    xmax = point.x;
                }

                if (point.y < ymin)
                {
                    ymin = point.y;
                }
                else if (point.y > ymax)
                {
                    ymax = point.y;
                }
            }

            float dx = xmax - xmin;
            float dy = ymax - ymin;

            float dmax = (dx > dy) ? dx : dy;
            float xmid = (xmax + xmin) / 2;
            float ymid = (ymax + ymin) / 2;

            Point p1 = new Point((xmid - 2 * dmax), (ymid - dmax));
            Point p2 = new Point(xmid, (ymid + 2 * dmax));
            Point p3 = new Point((xmid + 2 * dmax), (ymid - dmax));

            p1.SetId(nv + 1);
            p2.SetId(nv + 2);
            p3.SetId(nv + 3);

            points.Add(p1);
            points.Add(p2);
            points.Add(p3);

            List <Triangle> triangles = new List <Triangle>();

            triangles.Add(new Triangle(p1, p2, p3));

            for (int i = 0; i < nv; i++)
            {
                List <Edge> edges = new List <Edge>();

                // Set up the edge buffer.
                // If the point (Vertex(i).x,Vertex(i).y) lies inside the circumcircle then the
                // three edges of that triangle are added to the edge buffer and the triangle is removed from list.
                for (int j = 0; j < triangles.Count; j++)
                {
                    if (triangles[j].PointInCircle(points[i]))
                    {
                        edges.Add(new Edge(triangles[j].p1, triangles[j].p2));
                        edges.Add(new Edge(triangles[j].p2, triangles[j].p3));
                        edges.Add(new Edge(triangles[j].p3, triangles[j].p1));

                        //array_splice(triangles, j, 1);
                        triangles.Remove(triangles[j]);
                        j--;
                    }
                }

                if (i >= nv)
                {
                    continue;
                }

                for (int j = edges.Count - 2; j >= 0; j--)
                {
                    for (int k = edges.Count - 1; k >= j + 1; k--)
                    {
                        if (edges[j].Equals(edges[k]))
                        {
                            edges.Remove(edges[k]);
                            edges.Remove(edges[j]);
                            k--;
                        }
                    }
                }

                for (int j = 0; j < edges.Count; j++)
                {
                    if (triangles.Count >= trimax)
                    {
                        Debug.Log("Max number of edges reached");
                    }

                    triangles.Add(new Triangle(edges[j].lSite, edges[j].rSite, points[i]));
                }

                edges.Clear();
            }

            for (int i = triangles.Count - 1; i >= 0; i--)
            {
                if (triangles[i].p1.id >= nv || triangles[i].p2.id >= nv || triangles[i].p3.id >= nv)
                {
                    triangles.Remove(triangles[i]);
                }
            }

            return(triangles.ToArray());
        }
예제 #2
0
        public static Triangle[] Triangulate(List<Point> points)
        {
            int nv = points.Count;

            int trimax = nv * 4;

            float xmin = points[0].x;
            float ymin = points[0].y;
            float xmax = xmin;
            float ymax = ymin;

            for (int i = 0; i < points.Count; i++)
            {
                Point point = points[i].SetId(i);

                if (point.x < xmin)
                {
                    xmin = point.z;
                }
                else if (point.x > xmax)
                {
                    xmax = point.x;
                }

                if (point.y < ymin)
                {
                    ymin = point.y;
                }
                else if (point.y > ymax)
                {
                    ymax = point.y;
                }
            }

            float dx = xmax - xmin;
            float dy = ymax - ymin;

            float dmax = (dx > dy) ? dx : dy;
            float xmid = (xmax + xmin) / 2;
            float ymid = (ymax + ymin) / 2;

            Point p1 = new Point((xmid - 2 * dmax), (ymid - dmax));
            Point p2 = new Point(xmid, (ymid + 2 * dmax));
            Point p3 = new Point((xmid + 2 * dmax), (ymid - dmax));

            p1.SetId(nv + 1);
            p2.SetId(nv + 2);
            p3.SetId(nv + 3);

            points.Add(p1);
            points.Add(p2);
            points.Add(p3);

            List<Triangle> triangles = new List<Triangle>();
            triangles.Add(new Triangle(p1, p2, p3));

            for (int i = 0; i < nv; i++)
            {
                List<Edge> edges = new List<Edge>();

                // Set up the edge buffer.
                // If the point (Vertex(i).x,Vertex(i).y) lies inside the circumcircle then the
                // three edges of that triangle are added to the edge buffer and the triangle is removed from list.
                for (int j = 0; j < triangles.Count; j++)
                {
                    if (triangles[j].PointInCircle(points[i]))
                    {
                        edges.Add(new Edge(triangles[j].p1, triangles[j].p2));
                        edges.Add(new Edge(triangles[j].p2, triangles[j].p3));
                        edges.Add(new Edge(triangles[j].p3, triangles[j].p1));

                        //array_splice(triangles, j, 1);
                        triangles.Remove(triangles[j]);
                        j--;
                    }
                }

                if (i >= nv)
                {
                    continue;
                }

                for (int j = edges.Count - 2; j >= 0; j--)
                {
                    for (int k = edges.Count - 1; k >= j + 1; k--)
                    {
                        if (edges[j].Equals(edges[k]))
                        {
                            edges.Remove(edges[k]);
                            edges.Remove(edges[j]);
                            k--;
                        }
                    }
                }

                for (int j = 0; j < edges.Count; j++)
                {
                    if (triangles.Count >= trimax)
                    {
                        Debug.Log("Max number of edges reached");
                    }

                    triangles.Add(new Triangle(edges[j].lSite, edges[j].rSite, points[i]));
                }

                edges.Clear();
            }

            for (int i = triangles.Count - 1; i >= 0; i--)
            {
                if (triangles[i].p1.id >= nv || triangles[i].p2.id >= nv || triangles[i].p3.id >= nv)
                {
                    triangles.Remove(triangles[i]);
                }
            }

            return triangles.ToArray();
        }