%% options copyright owner = Dirk Krause copyright year = 2012-2014 license = bsd %% header #ifdef __cplusplus extern "C" { #endif /** Reset a bounding box. @param bb Bounding box to reset. */ void dk3bb_reset(dk3_bb_t *bb); /** Add x value to bounding box. @param bb Bounding box to modify. @param x Value to add. */ void dk3bb_add_x(dk3_bb_t *bb, double x); /** Add y value to bounding box. @param bb Bounding box to modify. @param y Value to add. */ void dk3bb_add_y(dk3_bb_t *bb, double y); /** Add x value with radius. @param bb Bounding box to modify. @param x X value to add. @param r Radius. @return 1 on success, 0 on error. */ int dk3bb_add_x_width(dk3_bb_t *bb, double x, double r); /** Add y value with radius. @param bb Bounding box to modify. @param y Y value to add. @param r Radius. @return 1 on success, 0 on error. */ int dk3bb_add_y_width(dk3_bb_t *bb, double y, double r); /** Add point. @param bb Bouding box to grow. @param x X value of point. @param y Y value of point. */ void dk3bb_point(dk3_bb_t *bb, double x, double y); /** Add point with radius. @param bb @param x @param y @param r @return 1 on success, 0 on error (math overflow). */ int dk3bb_point_width(dk3_bb_t *bb, double x, double y, double r); /** Merge two bounding boxes. @param dbb Destination bounding box. @param sbb Source bounding box to merge into dbb. */ void dk3bb_merge(dk3_bb_t *dbb, dk3_bb_t const *sbb); #ifdef __cplusplus } #endif %% module #include "dk3all.h" #include "dk3bb.h" $!trace-include void dk3bb_reset(dk3_bb_t *bb) { $? "+ dk3bb_reset" if(bb) { bb->xmin = bb->xmax = bb->ymin = bb->ymax = 0.0; bb->xused = bb->yused = 0; } $? "- dk3bb_reset" } void dk3bb_add_x(dk3_bb_t *bb, double x) { $? "+ dk3bb_add_x x=%lg", x if(bb) { if(bb->xused) { if(x < bb->xmin) { bb->xmin = x; } if(x > bb->xmax) { bb->xmax = x; } } else { bb->xmin = x; bb->xmax = x; bb->xused = 1; } $? ". NOW xmin=%lg xmax=%lg", bb->xmin, bb->xmax } $? "- dk3bb_add_x" } void dk3bb_add_y(dk3_bb_t *bb, double y) { $? "+ dk3bb_add_y y=%lg", y if(bb) { if(bb->yused) { if(y < bb->ymin) { bb->ymin = y; } if(y > bb->ymax) { bb->ymax = y; } } else { bb->ymin = y; bb->ymax = y; bb->yused = 1; } $? ". NOW ymin=%lg ymax=%lg", bb->ymin, bb->ymax } $? "- dk3bb_add_y" } int dk3bb_add_x_width(dk3_bb_t *bb, double x, double r) { double x1; /* Minimum x value. */ double x2; /* Maximum x value. */ int ec = 0; /* Error code for mathematical operations. */ int back = 0; $? "+ dk3bb_add_x_width x=%lg r=%lg", x, r if(bb) { x1 = dk3ma_d_sub_ok(x, r, &ec); x2 = dk3ma_d_add_ok(x, r, &ec); if(0 == ec) { back = 1; dk3bb_add_x(bb, x1); dk3bb_add_x(bb, x2); } } $? "- dk3bb_add_x_width %d", back return back; } int dk3bb_add_y_width(dk3_bb_t *bb, double y, double r) { double y1; /* Minimum y value. */ double y2; /* Maximum y value. */ int ec = 0; /* Error code for mathematical operations. */ int back = 0; $? "+ dk3bb_add_y_width y=%lg r=%lg", y, r y1 = dk3ma_d_sub_ok(y, r, &ec); y2 = dk3ma_d_add_ok(y, r, &ec); if(0 == ec) { back = 1; dk3bb_add_y(bb, y1); dk3bb_add_y(bb, y2); } $? "- dk3bb_add_y_width %d", back return back; } void dk3bb_point(dk3_bb_t *bb, double x, double y) { $? "+ dk3bb_point x=%lg y=%lg", x ,y if(bb) { dk3bb_add_x(bb, x); dk3bb_add_y(bb, y); } $? "- dk3bb_point" } int dk3bb_point_width(dk3_bb_t *bb, double x, double y, double r) { int back = 0; $? "+ dk3bb_point_width x=%lg y=%lg r=%lg", x, y, r if(bb) { if(dk3bb_add_x_width(bb, x, r)) { if(dk3bb_add_y_width(bb, y, r)) { back = 1; } } } $? "- dk3bb_point_width %d", back return back; } void dk3bb_merge(dk3_bb_t *dbb, dk3_bb_t const *sbb) { $? "+ dk3bb_merge" if((dbb) && (sbb)) { if(sbb->xused) { dk3bb_add_x(dbb, sbb->xmin); dk3bb_add_x(dbb, sbb->xmax); } if(sbb->yused) { dk3bb_add_y(dbb, sbb->ymin); dk3bb_add_y(dbb, sbb->ymax); } } $? "- dk3bb_merge" }