# Subversion RepositoriesScribus

Rev

double bxx0 = bx1, bxx1 = bx1;
double byy0 = by1, byy1 = by1;
while(q) {
double cx = (bxx0 + bxx1)/2;
double cy = (byy0 + byy1)/2;
unsigned i = 0;
if(x0 >= cx) {
i += 1;
bxx0 = cx; // zoom in a quad
} else if(x1 <= cx) {
bxx1 = cx;
} else
break;
if(y0 >= cy) {
i += 2;
byy0 = cy;
} else if(y1 <= cy) {
byy1 = cy;
} else
break;

assert(i < 4);
if(qq == 0) break; // last non-null
q = qq;
}
return q;
}

void QuadTree::insert(double x0, double y0, double x1, double y1, int shape) {
// loop until a quad would break the box.
if(root == 0) {

bx0 = 0;
bx1 = 1;
by0 = 0;
by1 = 1;
}

double bxx0 = bx0, bxx1 = bx1;
double byy0 = by0, byy1 = by1;
while((bxx0 > x0) ||
(bxx1 < x1) ||
(byy0 > y0) ||
(byy1 < y1)) { // too small initial size - double
unsigned i = 0;
if(bxx0 > x0) {
bxx0 = 2*bxx0 - bxx1;
i += 1;
} else {
bxx1 = 2*bxx1 - bxx0;
}
if(byy0 > y0) {
byy0 = 2*byy0 - byy1;
i += 2;
} else {
byy1 = 2*byy1 - byy0;
}
q->children[i] = root;
root = q;
bx0 = bxx0;
bx1 = bxx1;
by0 = byy0;
by1 = byy1;
}

while(q) {
double cx = (bxx0 + bxx1)/2;
double cy = (byy0 + byy1)/2;
unsigned i = 0;
assert(x0 >= bxx0);
assert(x1 <= bxx1);
assert(y0 >= byy0);
assert(y1 <= byy1);
if(x0 >= cx) {
i += 1;
bxx0 = cx; // zoom in a quad
} else if(x1 <= cx) {
bxx1 = cx;
} else
break;
if(y0 >= cy) {
i += 2;
byy0 = cy;
} else if(y1 <= cy) {
byy1 = cy;
} else
break;

assert(i < 4);
if(qq == 0) {
q->children[i] = qq;
}
q = qq;
}
q->data.push_back(shape);
}

while(i != q->data.end()) {
if(*i == shape) {
i = q->data.erase(i);
continue;
}
i++;
}
return;
}

/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(substatement-open . 0))
indent-tabs-mode:nil
c-brace-offset:0
fill-column:99
End:
vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
*/