Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: tri.c Projeto: palmerc/Seidel
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;
}