51 return (v1.
x - v0.
x) * (v2.
y - v0.
y) - (v1.
y - v0.
y) * (v2.
x - v0.
x);
67static size_t newnode(qnodes_t *qs) {
130 const size_t root = i1;
151 LIST_AT(qs, i5)->segnum = segnum;
175 LIST_AT(tr, t4)->hi.y = DBL_MAX;
176 LIST_AT(tr, t4)->hi.x = DBL_MAX;
177 LIST_AT(tr, t3)->lo.y = -DBL_MAX;
178 LIST_AT(tr, t3)->lo.x = -DBL_MAX;
179 LIST_AT(tr, t1)->rseg = segnum;
180 LIST_AT(tr, t2)->lseg = segnum;
195 LIST_AT(tr, t1)->is_valid =
true;
196 LIST_AT(tr, t2)->is_valid =
true;
197 LIST_AT(tr, t3)->is_valid =
true;
198 LIST_AT(tr, t4)->is_valid =
true;
205 s->is_inserted =
true;
231 area =
cross(
s->v0,
s->v1, *v);
248 area =
cross(
s->v1,
s->v0, *v);
315 int side, traps_t *tr, qnodes_t *qs) {
361 LIST_AT(tr, tnext)->is_valid =
false;
375 size_t t,
size_t tn) {
414 const size_t tmp_u =
LIST_GET(tr, t).u0;
451 size_t tfirst, tlast;
452 size_t tfirstr = 0, tlastr = 0;
463 else is_swapped =
false;
495 const size_t sk =
LIST_GET(tr, tu).sink;
499 LIST_AT(qs, sk)->segnum = segnum;
552 const size_t sk =
LIST_GET(tr, tu).sink;
556 LIST_AT(qs, sk)->segnum = segnum;
588 const size_t sk =
LIST_GET(tr, t).sink;
593 LIST_AT(qs, sk)->segnum = segnum;
604 LIST_AT(tr, tn)->is_valid =
true;
615 const size_t t_sav = t;
616 const size_t tn_sav = tn;
620 fprintf(stderr,
"trapezoid segment construction failed\n");
637 tmptriseg = seg[segnum].
prev;
639 tmptriseg = seg[segnum].
next;
641 if (tmptriseg > 0 &&
is_left_of(tmptriseg, seg, &
s.v0))
687 tmptriseg = seg[segnum].
prev;
689 tmptriseg = seg[segnum].
next;
691 if (tmptriseg > 0 &&
is_left_of(tmptriseg, seg, &
s.v0))
743 yt = (y0 -
s.v0.y)/(
s.v1.y -
s.v0.y);
744 tmppt.
x =
s.v0.x + yt * (
s.v1.x -
s.v0.x);
807 LIST_AT(tr, t_sav)->rseg = segnum;
808 LIST_AT(tr, tn_sav)->lseg = segnum;
816 const size_t tfirstl = tfirst;
817 const size_t tlastl = tlast;
833 if (
s->is_inserted)
return;
846 for (
double v = (
double)n; v >= 1; i++)
852static size_t math_N(
size_t n,
size_t h) {
853 double v = (double)n;
854 for (
size_t i = 0; i < h; i++)
857 return (
size_t)ceil((
double)n / v);
877 for (
size_t i = 1; i <= nseg; i++)
878 seg[i].root0 = seg[i].root1 = root;
881 for (
size_t h = 1; h <= logstar; h++) {
882 for (
size_t i =
math_N(nseg, h -1) + 1; i <=
math_N(nseg, h); i++) {
883 if (
add_segment(permute[segi++], seg, &tr, &qs) != 0) {
890 for (
size_t i = 1; i <= nseg; i++)
894 for (
size_t i =
math_N(nseg, logstar) + 1; i <= nseg; i++) {
895 if (
add_segment(permute[segi++], seg, &tr, &qs) != 0) {
Memory allocation wrappers that exit on failure.
static Agnode_t * newnode(Agraph_t *g, IDTYPE id, uint64_t seq)
geometric types and macros (e.g. points and boxes)
Arithmetic helper functions.
type-generic dynamically expanding list
#define LIST_AT(list, index)
#define LIST_APPEND(list,...)
#define LIST_SET(list, index, item)
#define LIST_GET(list, index)
size_t parent
doubly linked DAG
size_t next
next logical segment
size_t prev
previous segment
trapezoid elements and utilities for partition.c
static bool is_valid_trap(size_t index)
static bool equal_to(pointf v0, pointf v1)
static bool greater_than(pointf v0, pointf v1)
static bool fp_equal(double s, double t)
static size_t math_logstar_n(size_t n)
static double cross(pointf v0, pointf v1, pointf v2)
static bool less_than(pointf v0, pointf v1)
static size_t locate_endpoint(pointf *v, pointf *vo, size_t r, segment_t *seg, qnodes_t *qs)
static WUR int add_segment(size_t segnum, segment_t *seg, traps_t *tr, qnodes_t *qs)
static pointf max_(pointf v0, pointf v1)
return the maximum of the two points
traps_t construct_trapezoids(size_t nseg, segment_t *seg, size_t *permute)
static bool is_left_of(size_t segnum, segment_t *seg, pointf *v)
static size_t math_N(size_t n, size_t h)
static void update_trapezoid(segment_t *s, segment_t *seg, traps_t *tr, size_t t, size_t tn)
static bool greater_than_equal_to(pointf v0, pointf v1)
static void find_new_roots(size_t segnum, segment_t *seg, traps_t *tr, qnodes_t *qs)
static bool inserted(size_t segnum, segment_t *seg, int whichpt)
static void merge_trapezoids(size_t segnum, size_t tfirst, size_t tlast, int side, traps_t *tr, qnodes_t *qs)
static pointf min_(pointf v0, pointf v1)
return the minimum of the two points
static size_t init_query_structure(size_t segnum, segment_t *seg, traps_t *tr, qnodes_t *qs)
static size_t newtrap(traps_t *tr)
graphs, nodes and edges info: Agraphinfo_t, Agnodeinfo_t and Agedgeinfo_t
abstraction for squashing compiler warnings for unused symbols