Algorithm-RectanglesContainingDot_XS

 view release on metacpan or  search on metacpan

RectanglesContainingDot_XS.xs  view on Meta::CPAN

            }
        }
        else {
            if (besty < bestreq) {
                // fprintf(stderr, "besty: %f, bestreq: %f\n", besty, bestreq);
                part_division(aTHX_ rects, size, bestyy, 'y', &(div->left), sizely, &(div->right), sizery);
                div->cut = bestyy;
                Safefry(div->rects);
                div->rects = NULL;
                return div->dir = 'y';
            }
        }
    }
    return div->dir = 'n';
}

struct division *
division_containing_dot(pTHX_ struct division *div, double x, double y) {
    while(1) {
        int dir = div->dir;
        if (!dir)
            dir = subdivide_division(aTHX_ div);

        switch(dir) {
        case 'x':
            div = (x <= div->cut) ? div->left : div->right;
            break;
        case 'y':
            div = (y <= div->cut) ? div->left : div->right;
            break;
        default:
            my_assert(div->rects);
            return div;
        }
    }
}



MODULE = Algorithm::RectanglesContainingDot_XS		PACKAGE = Algorithm::RectanglesContainingDot_XS		

void
add_rectangle(self, name, x0, y0, x1, y1)
    struct algorithm *self
    SV *name
    double x0
    double y0
    double x1
    double y1
C_ARGS:
    aTHX_ self, name, x0, y0, x1, y1
    
void
rectangles_containing_dot(self, x, y)
    struct algorithm *self
    double x
    double y
PREINIT:
    struct division *div;
    int n = 0;
PPCODE:
    div = init_division(aTHX_ self);
    if (div) {
        struct rectangle **rects;
        int i, size;
        
        div = division_containing_dot(aTHX_ div, x, y);
        rects = div->rects;
        size = div->size;

        for (n = i = 0; i < size; i++) {
            struct rectangle *rect = rects[i];
            if (rect->x0 <= x &&
                rect->y0 <= y &&
                rect->x1 >= x &&
                rect->y1 >= y) {
                XPUSHs(sv_2mortal(newSVsv(rect->name)));
                n++;
            }
        }
    }
    XSRETURN(n);
    
struct algorithm *
new(klass)
    SV *klass
CODE:
    RETVAL = allocate_algorithm(aTHX);
OUTPUT:
    RETVAL

void
DESTROY(self)
    struct algorithm *self
CODE:
    release_algorithm(aTHX_ self);
sv_unmagic(SvRV(ST(0)), '~');



( run in 1.075 second using v1.01-cache-2.11-cpan-71847e10f99 )