boxf* partition (cell* cells, int ncells, int* nrects, boxf bb) { int nsegs = 4*(ncells+1); segment_t* segs = N_GNEW(nsegs+1, segment_t); int* permute = N_NEW(nsegs+1, int); int hd_size, vd_size; int i, j, cnt = 0; boxf* rs; int ntraps = TRSIZE(nsegs); trap_t* trs = N_GNEW(ntraps, trap_t); boxf* hor_decomp = N_NEW(ntraps, boxf); boxf* vert_decomp = N_NEW(ntraps, boxf); int nt; /* fprintf (stderr, "cells = %d segs = %d traps = %d\n", ncells, nsegs, ntraps); */ genSegments (cells, ncells, bb, segs, 0); #if 0 fprintf (stderr, "%d\n\n", ncells+1); for (i = 1; i<= nsegs; i++) { if (i%4 == 1) fprintf(stderr, "4\n"); fprintf (stderr, "%f %f\n", segs[i].v0.x, segs[i].v0.y); if (i%4 == 0) fprintf(stderr, "\n"); } #endif srand48(173); generateRandomOrdering (nsegs, permute); nt = construct_trapezoids(nsegs, segs, permute, ntraps, trs); /* fprintf (stderr, "hor traps = %d\n", nt); */ hd_size = monotonate_trapezoids (nsegs, segs, trs, 0, hor_decomp); genSegments (cells, ncells, bb, segs, 1); generateRandomOrdering (nsegs, permute); nt = construct_trapezoids(nsegs, segs, permute, ntraps, trs); /* fprintf (stderr, "ver traps = %d\n", nt); */ vd_size = monotonate_trapezoids (nsegs, segs, trs, 1, vert_decomp); rs = N_NEW (hd_size*vd_size, boxf); for (i=0; i<vd_size; i++) for (j=0; j<hd_size; j++) if (rectIntersect(&rs[cnt], &vert_decomp[i], &hor_decomp[j])) cnt++; rs = RALLOC (cnt, rs, boxf); free (segs); free (permute); free (trs); free (hor_decomp); free (vert_decomp); *nrects = cnt; return rs; }
int triangulate_polygon(int ncontours, int cntr[], double (*vertices)[2], int (*triangles)[3]) { int i; int nmonpoly, ccount, npoints, genus; int n; memset((void *)seg, 0, sizeof(seg)); ccount = 0; i = 1; while (ccount < ncontours) { int j; int first, last; npoints = cntr[ccount]; first = i; last = first + npoints - 1; for (j = 0; j < npoints; j++, i++) { seg[i].v0.x = vertices[i][0]; seg[i].v0.y = vertices[i][1]; if (i == last) { seg[i].next = first; seg[i].prev = i-1; seg[i-1].v1 = seg[i].v0; } else if (i == first) { seg[i].next = i+1; seg[i].prev = last; seg[last].v1 = seg[i].v0; } else { seg[i].prev = i-1; seg[i].next = i+1; seg[i-1].v1 = seg[i].v0; } seg[i].is_inserted = FALSE; } ccount++; } genus = ncontours - 1; n = i-1; initialise(n); construct_trapezoids(n); nmonpoly = monotonate_trapezoids(n); triangulate_monotone_polygons(n, nmonpoly, triangles); return 0; }