summaryrefslogtreecommitdiff
path: root/support/dktools/dk3bb.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk3bb.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk3bb.ctr')
-rw-r--r--support/dktools/dk3bb.ctr225
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"
+}
+
+
+