#include <stdlib.h>
#include <memory.h>
#include <math.h>
+#include "../../config.h"
#include "../q.h"
+#include "../types.h"
#include "active.h"
actlist_t* actlist_new()
free(a);
}
-void actlist_dump(actlist_t*a, int32_t y)
+void actlist_dump(actlist_t*a, int32_t y, double gridsize)
{
segment_t*s = a->list;
double lastx;
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);
+ fprintf(stderr, "?%.2f<->%.2f? ", lastx * gridsize, x * gridsize);
}
lastx = x;
}
- fprintf(stderr, "[%d]", s->nr);
+ fprintf(stderr, "[%d]", (int)s->nr);
s = s->right;
if(s) fprintf(stderr, " ");
- else fprintf(stderr, "\n");
+ else fprintf(stderr, " y=%.2f\n", y * gridsize);
}
}
void actlist_verify(actlist_t*a, int32_t y)
/* we need to re-evaluate the x of the previous segment. if we
try to store it, it might end up being converted to a double,
which will make it non-equal to (and possibly larger than) the
- "long double" the FPU has in it's register. This only happens
+ "long double" the FPU has in its register. This only happens
when compiler optimizations are turned on. */
assert((XPOS(s, y) - XPOS(l, y)) >= 0);
assert(XDIFF(s,l,y) >= 0);
//double d = cmp(t, p1, p2);
double d = single_cmp(t, p1);
if(d>=0 && to_the_left) {
+ actlist_dump(a, p1.y, 1);
segment_t*s = a->list;
while(s) {
- fprintf(stderr, "[%d] %f/%f (%d,%d) -> (%d,%d)\n", s->nr,
+ fprintf(stderr, "[%d] %f/%f (%d,%d) -> (%d,%d)\n", SEGNR(s),
single_cmp(s,p1), cmp(s,p1,p2),
s->a.x, s->a.y, s->b.x, s->b.y);
s = s->right;
}
#endif
+ /* this can be optimized for (is not needed in) normal mode (as opposed to horizontal postprocess mode) */
segment_t*out = last;
if(d<0 || (d==0 && LINE_EQ(p2,last)<0)) {
last = last->left;
}
}
-static int actlist_splay(actlist_t*a, point_t p1, point_t p2)
+static void actlist_splay(actlist_t*a, point_t p1, point_t p2)
{
if(!a->list) return;
} else if(!a->root->rightchild) {
a->root = a->root->leftchild;
} else {
+#ifdef HAVE_LRAND48
if(lrand48()&1) {
+#else
+ if(((ptroff_t)s)&16) {
+#endif
// free up root->left->right
segment_t*t = a->root->leftchild;
while(t->rightchild) {