diff options
Diffstat (limited to 'support/dktools/dk3bb.ctr')
-rw-r--r-- | support/dktools/dk3bb.ctr | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/support/dktools/dk3bb.ctr b/support/dktools/dk3bb.ctr new file mode 100644 index 0000000000..9316c415ad --- /dev/null +++ b/support/dktools/dk3bb.ctr @@ -0,0 +1,225 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2012-xxxx +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" +} + + + |