127 qnodes_at(qs, i1)->nodetype =
T_Y;
128 qnodes_at(qs, i1)->yval =
max_(
s->v0,
s->v1);
129 const size_t root = i1;
132 qnodes_at(qs, i1)->right = i2;
133 qnodes_at(qs, i2)->nodetype =
T_SINK;
134 qnodes_at(qs, i2)->parent = i1;
137 qnodes_at(qs, i1)->left = i3;
138 qnodes_at(qs, i3)->nodetype =
T_Y;
139 qnodes_at(qs, i3)->yval =
min_(
s->v0,
s->v1);
140 qnodes_at(qs, i3)->parent = i1;
143 qnodes_at(qs, i3)->left = i4;
144 qnodes_at(qs, i4)->nodetype =
T_SINK;
145 qnodes_at(qs, i4)->parent = i3;
148 qnodes_at(qs, i3)->right = i5;
149 qnodes_at(qs, i5)->nodetype =
T_X;
150 qnodes_at(qs, i5)->segnum = segnum;
151 qnodes_at(qs, i5)->parent = i3;
154 qnodes_at(qs, i5)->left = i6;
155 qnodes_at(qs, i6)->nodetype =
T_SINK;
156 qnodes_at(qs, i6)->parent = i5;
159 qnodes_at(qs, i5)->right = i7;
160 qnodes_at(qs, i7)->nodetype =
T_SINK;
161 qnodes_at(qs, i7)->parent = i5;
168 traps_at(tr, t1)->hi = qnodes_get(qs, i1).yval;
169 traps_at(tr, t2)->hi = qnodes_get(qs, i1).yval;
170 traps_at(tr, t4)->lo = qnodes_get(qs, i1).yval;
171 traps_at(tr, t1)->lo = qnodes_get(qs, i3).yval;
172 traps_at(tr, t2)->lo = qnodes_get(qs, i3).yval;
173 traps_at(tr, t3)->hi = qnodes_get(qs, i3).yval;
174 traps_at(tr, t4)->hi.y = (double)(
INF);
175 traps_at(tr, t4)->hi.x = (double)(
INF);
176 traps_at(tr, t3)->lo.y = (double)-1 * (
INF);
177 traps_at(tr, t3)->lo.x = (double)-1 * (
INF);
178 traps_at(tr, t1)->rseg = segnum;
179 traps_at(tr, t2)->lseg = segnum;
180 traps_at(tr, t1)->u0 = t4;
181 traps_at(tr, t2)->u0 = t4;
182 traps_at(tr, t1)->d0 = t3;
183 traps_at(tr, t2)->d0 = t3;
184 traps_at(tr, t4)->d0 = t1;
185 traps_at(tr, t3)->u0 = t1;
186 traps_at(tr, t4)->d1 = t2;
187 traps_at(tr, t3)->u1 = t2;
189 traps_at(tr, t1)->sink = i6;
190 traps_at(tr, t2)->sink = i7;
191 traps_at(tr, t3)->sink = i4;
192 traps_at(tr, t4)->sink = i2;
199 qnodes_at(qs, i2)->trnum = t4;
200 qnodes_at(qs, i4)->trnum = t3;
201 qnodes_at(qs, i6)->trnum = t1;
202 qnodes_at(qs, i7)->trnum = t2;
204 s->is_inserted =
true;
317 traps_t *tr, qnodes_t *qs) {
325 cond = (
is_valid_trap(tnext = traps_get(tr, t).d0) && traps_get(tr, tnext).rseg == segnum) ||
326 (
is_valid_trap(tnext = traps_get(tr, t).d1) && traps_get(tr, tnext).rseg == segnum);
328 cond = (
is_valid_trap(tnext = traps_get(tr, t).d0) && traps_get(tr, tnext).lseg == segnum) ||
329 (
is_valid_trap(tnext = traps_get(tr, t).d1) && traps_get(tr, tnext).lseg == segnum);
333 if (traps_get(tr, t).lseg == traps_get(tr, tnext).lseg &&
334 traps_get(tr, t).rseg == traps_get(tr, tnext).rseg)
338 const size_t ptnext = qnodes_get(qs, traps_get(tr, tnext).sink).parent;
340 if (qnodes_get(qs, ptnext).
left == traps_get(tr, tnext).sink)
341 qnodes_at(qs, ptnext)->left = traps_get(tr, t).sink;
343 qnodes_at(qs, ptnext)->right = traps_get(tr, t).sink;
348 if (
is_valid_trap(traps_at(tr, t)->d0 = traps_get(tr, tnext).d0)) {
349 if (traps_get(tr, traps_get(tr, t).d0).u0 == tnext)
350 traps_at(tr, traps_get(tr, t).d0)->u0 = t;
351 else if (traps_get(tr, traps_get(tr, t).d0).u1 == tnext)
352 traps_at(tr, traps_get(tr, t).d0)->u1 = t;
355 if (
is_valid_trap(traps_at(tr, t)->d1 = traps_get(tr, tnext).d1)) {
356 if (traps_get(tr, traps_get(tr, t).d1).u0 == tnext)
357 traps_at(tr, traps_get(tr, t).d1)->u0 = t;
358 else if (traps_get(tr, traps_get(tr, t).d1).u1 == tnext)
359 traps_at(tr, traps_get(tr, t).d1)->u1 = t;
362 traps_at(tr, t)->lo = traps_get(tr, tnext).lo;
377 size_t t,
size_t tn) {
381 if (traps_get(tr, t).uside ==
S_LEFT)
383 traps_at(tr, tn)->u0 = traps_get(tr, t).u1;
385 traps_at(tr, tn)->u1 = traps_get(tr, t).usave;
387 traps_at(tr, traps_get(tr, t).u0)->d0 = t;
388 traps_at(tr, traps_get(tr, tn).u0)->d0 = tn;
389 traps_at(tr, traps_get(tr, tn).u1)->d0 = tn;
394 traps_at(tr, tn)->u0 = traps_get(tr, t).u1;
395 traps_at(tr, t)->u1 = traps_get(tr, t).u0;
396 traps_at(tr, t)->u0 = traps_get(tr, t).usave;
398 traps_at(tr, traps_get(tr, t).u0)->d0 = t;
399 traps_at(tr, traps_get(tr, t).u1)->d0 = t;
400 traps_at(tr, traps_get(tr, tn).u0)->d0 = tn;
403 traps_at(tr, t)->usave = 0;
404 traps_at(tr, tn)->usave = 0;
408 traps_at(tr, tn)->u0 = traps_get(tr, t).u1;
411 traps_at(tr, traps_get(tr, tn).u0)->d0 = tn;
416 const size_t tmp_u = traps_get(tr, t).u0;
420 if (traps_get(tr, td0).rseg > 0 && !
is_left_of(traps_get(tr, td0).rseg, seg, &
s->v1))
425 traps_at(tr, traps_get(tr, tn).u0)->d1 = tn;
432 traps_at(tr, traps_get(tr, t).u0)->d0 = t;
437 traps_at(tr, traps_get(tr, t).u0)->d0 = t;
438 traps_at(tr, traps_get(tr, t).u0)->d1 = tn;
450 size_t tfirst, tlast;
451 size_t tfirstr = 0, tlastr = 0;
462 else is_swapped =
false;
471 traps_set(tr, tl, traps_get(tr, tu));
472 traps_at(tr, tu)->lo =
s.v0;
473 traps_at(tr, tl)->hi =
s.v0;
474 traps_at(tr, tu)->d0 = tl;
475 traps_at(tr, tu)->d1 = 0;
476 traps_at(tr, tl)->u0 = tu;
477 traps_at(tr, tl)->u1 = 0;
479 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d0) && traps_get(tr, tmp_d).u0 == tu)
480 traps_at(tr, tmp_d)->u0 = tl;
481 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d0) && traps_get(tr, tmp_d).u1 == tu)
482 traps_at(tr, tmp_d)->u1 = tl;
484 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d1) && traps_get(tr, tmp_d).u0 == tu)
485 traps_at(tr, tmp_d)->u0 = tl;
486 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d1) && traps_get(tr, tmp_d).u1 == tu)
487 traps_at(tr, tmp_d)->u1 = tl;
494 const size_t sk = traps_get(tr, tu).sink;
496 qnodes_at(qs, sk)->nodetype =
T_Y;
497 qnodes_at(qs, sk)->yval =
s.v0;
498 qnodes_at(qs, sk)->segnum = segnum;
499 qnodes_at(qs, sk)->left = i2;
500 qnodes_at(qs, sk)->right = i1;
502 qnodes_at(qs, i1)->nodetype =
T_SINK;
503 qnodes_at(qs, i1)->trnum = tu;
504 qnodes_at(qs, i1)->parent = sk;
506 qnodes_at(qs, i2)->nodetype =
T_SINK;
507 qnodes_at(qs, i2)->trnum = tl;
508 qnodes_at(qs, i2)->parent = sk;
510 traps_at(tr, tu)->sink = i1;
511 traps_at(tr, tl)->sink = i2;
528 traps_set(tr, tl, traps_get(tr, tu));
529 traps_at(tr, tu)->lo =
s.v1;
530 traps_at(tr, tl)->hi =
s.v1;
531 traps_at(tr, tu)->d0 = tl;
532 traps_at(tr, tu)->d1 = 0;
533 traps_at(tr, tl)->u0 = tu;
534 traps_at(tr, tl)->u1 = 0;
536 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d0) && traps_get(tr, tmp_d).u0 == tu)
537 traps_at(tr, tmp_d)->u0 = tl;
538 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d0) && traps_get(tr, tmp_d).u1 == tu)
539 traps_at(tr, tmp_d)->u1 = tl;
541 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d1) && traps_get(tr, tmp_d).u0 == tu)
542 traps_at(tr, tmp_d)->u0 = tl;
543 if (
is_valid_trap(tmp_d = traps_get(tr, tl).d1) && traps_get(tr, tmp_d).u1 == tu)
544 traps_at(tr, tmp_d)->u1 = tl;
551 const size_t sk = traps_get(tr, tu).sink;
553 qnodes_at(qs, sk)->nodetype =
T_Y;
554 qnodes_at(qs, sk)->yval =
s.v1;
555 qnodes_at(qs, sk)->segnum = segnum;
556 qnodes_at(qs, sk)->left = i2;
557 qnodes_at(qs, sk)->right = i1;
559 qnodes_at(qs, i1)->nodetype =
T_SINK;
560 qnodes_at(qs, i1)->trnum = tu;
561 qnodes_at(qs, i1)->parent = sk;
563 qnodes_at(qs, i2)->nodetype =
T_SINK;
564 qnodes_at(qs, i2)->trnum = tl;
565 qnodes_at(qs, i2)->parent = sk;
567 traps_at(tr, tu)->sink = i1;
568 traps_at(tr, tl)->sink = i2;
587 const size_t sk = traps_get(tr, t).sink;
591 qnodes_at(qs, sk)->nodetype =
T_X;
592 qnodes_at(qs, sk)->segnum = segnum;
593 qnodes_at(qs, sk)->left = i1;
594 qnodes_at(qs, sk)->right = i2;
596 qnodes_at(qs, i1)->nodetype =
T_SINK;
597 qnodes_at(qs, i1)->trnum = t;
598 qnodes_at(qs, i1)->parent = sk;
600 qnodes_at(qs, i2)->nodetype =
T_SINK;
602 qnodes_at(qs, i2)->trnum = tn;
604 qnodes_at(qs, i2)->parent = sk;
608 if (
equal_to(traps_get(tr, t).lo, traps_get(tr, tlast).lo))
611 traps_set(tr, tn, traps_get(tr, t));
612 traps_at(tr, t)->sink = i1;
613 traps_at(tr, tn)->sink = i2;
614 const size_t t_sav = t;
615 const size_t tn_sav = tn;
621 fprintf(stderr,
"add_segment: error\n");
633 if (
fp_equal(traps_get(tr, t).lo.y, traps_get(tr, tlast).lo.y) &&
634 fp_equal(traps_get(tr, t).lo.x, traps_get(tr, tlast).lo.x) && tribot)
638 tmptriseg = seg[segnum].
prev;
640 tmptriseg = seg[segnum].
next;
642 if (tmptriseg > 0 &&
is_left_of(tmptriseg, seg, &
s.v0))
645 traps_at(tr, traps_get(tr, t).d0)->u0 = t;
652 traps_at(tr, traps_get(tr, tn).d0)->u1 = tn;
661 if (traps_get(tr, traps_get(tr, t).d0).u0 == t) {
662 traps_at(tr, traps_get(tr, t).d0)->usave = traps_get(tr, traps_get(tr, t).d0).u1;
663 traps_at(tr, traps_get(tr, t).d0)->uside =
S_LEFT;
667 traps_at(tr, traps_get(tr, t).d0)->usave = traps_get(tr, traps_get(tr, t).d0).u0;
668 traps_at(tr, traps_get(tr, t).d0)->uside =
S_RIGHT;
671 traps_at(tr, traps_get(tr, t).d0)->u0 = t;
672 traps_at(tr, traps_get(tr, t).d0)->u1 = tn;
675 t = traps_get(tr, t).d0;
683 if (
fp_equal(traps_get(tr, t).lo.y, traps_get(tr, tlast).lo.y) &&
684 fp_equal(traps_get(tr, t).lo.x, traps_get(tr, tlast).lo.x) && tribot)
688 tmptriseg = seg[segnum].
prev;
690 tmptriseg = seg[segnum].
next;
692 if (tmptriseg > 0 &&
is_left_of(tmptriseg, seg, &
s.v0))
695 traps_at(tr, traps_get(tr, t).d1)->u0 = t;
702 traps_at(tr, traps_get(tr, tn).d1)->u1 = tn;
711 if (traps_get(tr, traps_get(tr, t).d1).u0 == t) {
712 traps_at(tr, traps_get(tr, t).d1)->usave = traps_get(tr, traps_get(tr, t).d1).u1;
713 traps_at(tr, traps_get(tr, t).d1)->uside =
S_LEFT;
717 traps_at(tr, traps_get(tr, t).d1)->usave = traps_get(tr, traps_get(tr, t).d1).u0;
718 traps_at(tr, traps_get(tr, t).d1)->uside =
S_RIGHT;
721 traps_at(tr, traps_get(tr, t).d1)->u0 = t;
722 traps_at(tr, traps_get(tr, t).d1)->u1 = tn;
725 t = traps_get(tr, t).d1;
739 if (
fp_equal(traps_get(tr, t).lo.y,
s.v0.y)) {
740 if (traps_get(tr, t).lo.x >
s.v0.x)
747 tmppt.
y = y0 = traps_get(tr, t).lo.y;
748 yt = (y0 -
s.v0.y)/(
s.v1.y -
s.v0.y);
749 tmppt.
x =
s.v0.x + yt * (
s.v1.x -
s.v0.x);
751 if (
less_than(tmppt, traps_get(tr, t).lo))
762 if (
fp_equal(traps_get(tr, t).lo.y, traps_get(tr, tlast).lo.y) &&
763 fp_equal(traps_get(tr, t).lo.x, traps_get(tr, tlast).lo.x) && tribot)
769 traps_at(tr, traps_get(tr, t).d0)->u0 = t;
770 traps_at(tr, traps_get(tr, t).d0)->u1 =
SIZE_MAX;
771 traps_at(tr, traps_get(tr, t).d1)->u0 = tn;
772 traps_at(tr, traps_get(tr, t).d1)->u1 =
SIZE_MAX;
774 traps_at(tr, tn)->d0 = traps_get(tr, t).d1;
778 tnext = traps_get(tr, t).d1;
783 traps_at(tr, traps_get(tr, t).d0)->u0 = t;
784 traps_at(tr, traps_get(tr, t).d0)->u1 = tn;
785 traps_at(tr, traps_get(tr, t).d1)->u0 = tn;
786 traps_at(tr, traps_get(tr, t).d1)->u1 =
SIZE_MAX;
793 tnext = traps_get(tr, t).d0;
797 traps_at(tr, traps_get(tr, t).d0)->u0 = t;
798 traps_at(tr, traps_get(tr, t).d0)->u1 =
SIZE_MAX;
799 traps_at(tr, traps_get(tr, t).d1)->u0 = t;
800 traps_at(tr, traps_get(tr, t).d1)->u1 = tn;
805 traps_at(tr, tn)->d0 = traps_get(tr, t).d1;
808 tnext = traps_get(tr, t).d1;
814 traps_at(tr, t_sav)->rseg = segnum;
815 traps_at(tr, tn_sav)->lseg = segnum;
823 const size_t tfirstl = tfirst;
824 const size_t tlastl = tlast;