#include <common/boxes.h>
#include <cgraph/alloc.h>
#include <cgraph/bitarray.h>
+#include <cgraph/prisize_t.h>
#include <ortho/partition.h>
#include <ortho/trap.h>
#include <math.h>
segment_t* segs = gv_calloc(nsegs + 1, sizeof(segment_t));
int* permute = gv_calloc(nsegs + 1, sizeof(int));
- // First trapezoid is reserved as a sentinel. We will append later
- // trapezoids by expanding this on-demand.
- traps_t trs = {.length = 1, .data = gv_calloc(1, sizeof(trap_t))};
-
- int nt;
-
if (DEBUG) {
fprintf (stderr, "cells = %d segs = %d traps = dynamic\n", ncells, nsegs);
}
}
srand48(173);
generateRandomOrdering (nsegs, permute);
- nt = construct_trapezoids(nsegs, segs, permute, &trs);
+ traps_t hor_traps = construct_trapezoids(nsegs, segs, permute);
if (DEBUG) {
- fprintf (stderr, "hor traps = %d\n", nt);
+ fprintf (stderr, "hor traps = %" PRISIZE_T "\n", hor_traps.length);
}
boxes_t hor_decomp = {0};
- monotonate_trapezoids(nsegs, segs, &trs, 0, &hor_decomp);
-
- // reset trapezoid collection
- free(trs.data);
- trs = (traps_t){.length = 1, .data = gv_calloc(1, sizeof(trap_t))};
+ monotonate_trapezoids(nsegs, segs, &hor_traps, 0, &hor_decomp);
+ free(hor_traps.data);
genSegments (cells, ncells, bb, segs, 1);
generateRandomOrdering (nsegs, permute);
- nt = construct_trapezoids(nsegs, segs, permute, &trs);
+ traps_t ver_traps = construct_trapezoids(nsegs, segs, permute);
if (DEBUG) {
- fprintf (stderr, "ver traps = %d\n", nt);
+ fprintf (stderr, "ver traps = %" PRISIZE_T "\n", ver_traps.length);
}
boxes_t vert_decomp = {0};
- monotonate_trapezoids(nsegs, segs, &trs, 1, &vert_decomp);
+ monotonate_trapezoids(nsegs, segs, &ver_traps, 1, &vert_decomp);
+ free(ver_traps.data);
boxes_t rs = {0};
for (size_t i = 0; i < vert_decomp.size; ++i)
free (segs);
free (permute);
- free(trs.data);
boxes_free(&hor_decomp);
boxes_free(&vert_decomp);
*nrects = rs.size;
}
/* Main routine to perform trapezoidation */
-int
-construct_trapezoids(int nseg, segment_t *seg, int *permute, traps_t* tr) {
+traps_t construct_trapezoids(int nseg, segment_t *seg, int *permute) {
int i;
int root, h;
int segi = 1;
// sentinel.
qnodes_t qs = {.length = 1, .data = gv_calloc(1, sizeof(qnode_t))};
+ // First trapezoid is reserved as a sentinel. We will append later
+ // trapezoids by expanding this on-demand.
+ traps_t tr = {.length = 1, .data = gv_calloc(1, sizeof(trap_t))};
+
/* Add the first segment and get the query structure and trapezoid */
/* list initialised */
- root = init_query_structure(permute[segi++], seg, tr, &qs);
+ root = init_query_structure(permute[segi++], seg, &tr, &qs);
for (i = 1; i <= nseg; i++)
seg[i].root0 = seg[i].root1 = root;
for (h = 1; h <= math_logstar_n(nseg); h++) {
for (i = math_N(nseg, h -1) + 1; i <= math_N(nseg, h); i++)
- add_segment(permute[segi++], seg, tr, &qs);
+ add_segment(permute[segi++], seg, &tr, &qs);
/* Find a new root for each of the segment endpoints */
for (i = 1; i <= nseg; i++)
- find_new_roots(i, seg, tr, &qs);
+ find_new_roots(i, seg, &tr, &qs);
}
for (i = math_N(nseg, math_logstar_n(nseg)) + 1; i <= nseg; i++)
- add_segment(permute[segi++], seg, tr, &qs);
+ add_segment(permute[segi++], seg, &tr, &qs);
free(qs.data);
- return tr->length;
+ return tr;
}