-#include <assert.h>
#include "../q.h"
#include "active.h"
free(a);
}
-void actlist_verify_and_dump(actlist_t*a, int32_t y)
+void actlist_dump(actlist_t*a, int32_t y)
{
segment_t*s = a->list;
- assert(!s || !s->left);
double lastx;
+ char bad = 0;
while(s) {
if(y) {
double x = ((double)s->delta.x*(y-s->a.y)/s->delta.y)+s->a.x;
if(s!=a->list) {
- if(lastx>x) fprintf(stderr, "?%f<->%f? ", lastx, x);
+ if(lastx>x)
+ fprintf(stderr, "?%f<->%f? ", lastx, x);
}
lastx = x;
}
- assert(!s->left || s->left->right == s);
- assert(!s->right || s->right->left == s);
fprintf(stderr, "[%d]", s->nr);
s = s->right;
if(s) fprintf(stderr, " ");
else fprintf(stderr, "\n");
}
}
+void actlist_verify(actlist_t*a, int32_t y)
+{
+ segment_t*s = a->list;
+ assert(!s || !s->left);
+ double lastx;
+ while(s) {
+ if(y) {
+ double x = ((double)s->delta.x*(y-s->a.y)/s->delta.y)+s->a.x;
+ if(s!=a->list) {
+ assert(lastx<=x);
+ }
+ lastx = x;
+ }
+ assert(!s->left || s->left->right == s);
+ assert(!s->right || s->right->left == s);
+ s = s->right;
+ }
+}
segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2)
{
s->left->right = s;
if(s->right)
s->right->left = s;
+ a->size++;
}
void actlist_insert(actlist_t*a, point_t p, segment_t*s)
s->right->left = s->left;
}
s->left = s->right = 0;
+ a->size--;
+}
+int actlist_size(actlist_t*a)
+{
+ return a->size;
}
segment_t* actlist_leftmost(actlist_t*a)
return a->list;
}
+segment_t* actlist_rightmost(actlist_t*a)
+{
+ /* this is only used in checks, so it doesn't matter that it's slow */
+ segment_t*s = a->list;
+ segment_t*last = 0;
+ while(s) {
+ last = s;
+ s = s->right;
+ }
+ return last;
+}
+
segment_t* actlist_left(actlist_t*a, segment_t*s)
{
return s->left;
segment_t* actlist_right(actlist_t*a, segment_t*s)
{
- return s->right;
+ if(s) return s->right;
+ else return a->list;
}
void actlist_swap(actlist_t*a, segment_t*s1, segment_t*s2)