Ejemplo n.º 1
0
int octsect_active(const Region R, const MathTree* tree, Region* const out)
{
    out[0] = R;
    uint8_t bits = 1;
    const uint8_t active = active_axes(tree);

    if (R.nk > 1 && (active & 1)) {
        bisect_z(out[0], out, out+1);
        bits |= (bits << 1);
    }

    if (R.nj > 1 && (active & 2)) {
        if (bits & (1 << 0))
            bisect_y(out[0], out,   out+2);
        if (bits & (1 << 1))
            bisect_y(out[1], out+1, out+3);
        bits |= (bits << 2);
    }

    if (R.ni > 1 && (active & 4)) {
        if (bits & (1 << 0))
            bisect_x(out[0], out,   out+4);
        if (bits & (1 << 1))
            bisect_x(out[1], out+1, out+5);
        if (bits & (1 << 2))
            bisect_x(out[2], out+2, out+6);
        if (bits & (1 << 3))
            bisect_x(out[3], out+3, out+7);
        bits |= (bits << 4);
    }

    return bits;
}
Ejemplo n.º 2
0
// Splits a region into up to 8 sections, returning
// a bitfield with bits set where a region was stored.
uint8_t octsect(const Region R, Region* const out)
{
    out[0] = R;
    uint8_t bits = 1;

    if (R.nk > 1) {
        bisect_z(out[0], out, out+1);
        bits |= (bits << 1);
    }

    if (R.nj > 1) {
        if (bits & (1 << 0))
            bisect_y(out[0], out,   out+2);
        if (bits & (1 << 1))
            bisect_y(out[1], out+1, out+3);
        bits |= (bits << 2);
    }

    if (R.ni > 1) {
        if (bits & (1 << 0))
            bisect_x(out[0], out,   out+4);
        if (bits & (1 << 1))
            bisect_x(out[1], out+1, out+5);
        if (bits & (1 << 2))
            bisect_x(out[2], out+2, out+6);
        if (bits & (1 << 3))
            bisect_x(out[3], out+3, out+7);
        bits |= (bits << 4);
    }

    return bits;
}
Ejemplo n.º 3
0
// Splits a region into up to 8 sections, returning
// a bitfield with bits set where a region was stored.
uint8_t octsect_merged(const Region R, const ASDF* const asdf,
                       Region* const out)
{
    out[0] = R;
    uint8_t bits = 1;

    if (asdf->branches[1] && R.nk > 1) {
        bisect_z(out[0], out, out+1);
        bits |= (bits << 1);
    }

    if (asdf->branches[2] && R.nj > 1) {
        if (bits & (1 << 0))
            bisect_y(out[0], out,   out+2);
        if (bits & (1 << 1))
            bisect_y(out[1], out+1, out+3);
        bits |= (bits << 2);
    }

    if (asdf->branches[4] && R.ni > 1) {
        if (bits & (1 << 0))
            bisect_x(out[0], out,   out+4);
        if (bits & (1 << 1))
            bisect_x(out[1], out+1, out+5);
        if (bits & (1 << 2))
            bisect_x(out[2], out+2, out+6);
        if (bits & (1 << 3))
            bisect_x(out[3], out+3, out+7);
        bits |= (bits << 4);
    }

    return bits;
}
Ejemplo n.º 4
0
// Splits a region in two along its longest axis.  Returns 1
// if the region is of volume 1 and cannot be split.
int bisect(const Region r, Region* const A, Region* const B)
{
    if (r.ni * r.nj * r.nk == 1) {
        *A = r;
        return 1;
    }

    if (r.ni >= r.nj && r.ni >= r.nk)
        bisect_x(r, A, B);
    else if (r.nj >= r.nk)
        bisect_y(r, A, B);
    else
        bisect_z(r, A, B);

    return 0;
}