コード例 #1
0
        private void DelaunaySetup(Point[] points)
        {
            triangles = null;
            triangle2d_delaunay_position = 0;
            Del_Point2d[] del_points = new Del_Point2d[points.Length];

            for (int loop = 0; loop < points.Length; loop++)
            {
                del_points[loop] = new Del_Point2d();
                Point pt = points[loop];

                del_points[loop].x = (double)(pt.X);
                del_points[loop].y = (double)(pt.Y);
            }

            //Sort points and drop matching coordinates
            Array.Sort(del_points);
            int num_points = points.Length;
            int data_shift = 0;
            int deduplicate_loop;

            for (deduplicate_loop = 0; deduplicate_loop < num_points - 1 - data_shift; deduplicate_loop++)
            {
                if (data_shift > 0)
                {
                    del_points[deduplicate_loop] = del_points[deduplicate_loop + data_shift];
                }

                //Use while loop to check for multiple point copies.
                while (deduplicate_loop < num_points - 1 - data_shift)
                {
                    if (del_points[deduplicate_loop].CompareTo(del_points[deduplicate_loop + 1 + data_shift]) == 0)
                    {
                        data_shift++;
                    }
                    else
                    {
                        break;
                    }
                }
                if (deduplicate_loop >= num_points - 1 - data_shift)            //Preserve variable
                {
                    break;
                }
            }

            if (data_shift > 0)
            {
                del_points[deduplicate_loop]     = del_points[deduplicate_loop + data_shift];
                del_points[deduplicate_loop + 1] = null;
            }
            num_points -= data_shift;

            Delaunay2d delaunay2d = delaunay2d_from(del_points, num_points);

            if (num_points >= 3)
            {
                triangles = tri_delaunay2d_from(delaunay2d);
            }
        }
コード例 #2
0
        /*
         */
        private Delaunay2d delaunay2d_from(Del_Point2d[] points, int num_points)
        {
            Delaunay2d      res = null;
            DelaunaySegment del = new DelaunaySegment();
            int             i, j, fbuff_size = 0;

            int[] faces = null;

            /* allocate the points */
            del.points = new Point2d[num_points];
            Debug.Assert(null != del.points);

            /* copy the points */
            for (i = 0; i < num_points; i++)
            {
                del.points[i]     = new Point2d();
                del.points[i].idx = i;
                del.points[i].x   = points[i].x;
                del.points[i].y   = points[i].y;
            }

            Array.Sort(del.points);
            if (num_points >= 3)
            {
                del_divide_and_conquer(del, 0, num_points - 1);

                del_build_faces(del);

                fbuff_size = 0;
                for (i = 0; i < del.num_faces; i++)
                {
                    fbuff_size += del.faces[i].num_verts + 1;
                }

                faces = new int[fbuff_size];
                Debug.Assert(null != faces);

                j = 0;
                for (i = 0; i < del.num_faces; i++)
                {
                    Halfedge curr;

                    faces[j] = del.faces[i].num_verts;
                    j++;

                    curr = del.faces[i].he;
                    do
                    {
                        faces[j] = curr.vertex.idx;
                        j++;
                        curr = curr.pair.prev;
                    } while (curr != del.faces[i].he);
                }
                del.faces  = null;
                del.points = null;
            }

            res = new Delaunay2d();
            Debug.Assert(null != res);

            res.num_points = num_points;
            res.points     = new Del_Point2d[num_points];
            Debug.Assert(null != res.points);

            for (int loop = 0; loop < num_points; loop++)
            {
                res.points[loop] = (Del_Point2d)points[loop].Clone();
            }

            res.num_faces = del.num_faces;
            res.faces     = faces;

            return(res);
        }
コード例 #3
0
        private tri_delaunay2d tri_delaunay2d_from(Delaunay2d del)
        {
            int v_offset   = del.faces[0] + 1;          /* ignore external face */
            int dst_offset = 0;
            int i;

            tri_delaunay2d tdel = new tri_delaunay2d();

            tdel.num_triangles = 0;

            /* count the number of triangles */
            if (1 == del.num_faces)
            {
                /* degenerate case: only external face exists */
                int nv = del.faces[0];
                tdel.num_triangles += nv - 2;
            }
            else
            {
                for (i = 1; i < del.num_faces; ++i)
                {
                    int nv = del.faces[v_offset];
                    tdel.num_triangles += nv - 2;
                    v_offset           += nv + 1;
                }
            }

            /* copy points */
            tdel.num_points = del.num_points;
            tdel.points     = new Del_Point2d[del.num_points];
            Debug.Assert(null != tdel.points);

            for (int loop = 0; loop < del.num_points; loop++)
            {
                tdel.points[loop] = (Del_Point2d)del.points[loop].Clone();
            }

            /* build the triangles */
            tdel.tris = new int[3 * tdel.num_triangles];
            Debug.Assert(null != tdel.tris);

            v_offset = del.faces[0] + 1;                /* ignore external face */

            if (1 == del.num_faces)
            {
                /* handle the degenerated case where only the external face exists */
                int nv = del.faces[0];
                int j  = 0;
                v_offset = 1;
                for (; j < nv - 2; ++j)
                {
                    tdel.tris[dst_offset]     = del.faces[v_offset + j];
                    tdel.tris[dst_offset + 1] = del.faces[(v_offset + j + 1) % nv];
                    tdel.tris[dst_offset + 2] = del.faces[v_offset + j];
                    dst_offset += 3;
                }
            }
            else
            {
                for (i = 1; i < del.num_faces; ++i)
                {
                    int nv    = del.faces[v_offset];
                    int j     = 0;
                    int first = del.faces[v_offset + 1];

                    for (; j < nv - 2; ++j)
                    {
                        tdel.tris[dst_offset]     = first;
                        tdel.tris[dst_offset + 1] = del.faces[v_offset + j + 2];
                        tdel.tris[dst_offset + 2] = del.faces[v_offset + j + 3];
                        dst_offset += 3;
                    }

                    v_offset += nv + 1;
                }
            }
            return(tdel);
        }