diff options
author | Norbert Preining <norbert@preining.info> | 2020-10-12 03:04:00 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-10-12 03:04:00 +0000 |
commit | 0ce40abb18ec02ec6fd6bcc5f21612c88daa7578 (patch) | |
tree | 416289fe1448873fd8ca33051f50ad85bffa8aaa /support/dktools/dk3figbb.ctr | |
parent | fdb18507cd80dc17f5a5256153d34668b4f4e61c (diff) |
CTAN sync 202010120303
Diffstat (limited to 'support/dktools/dk3figbb.ctr')
-rw-r--r-- | support/dktools/dk3figbb.ctr | 641 |
1 files changed, 0 insertions, 641 deletions
diff --git a/support/dktools/dk3figbb.ctr b/support/dktools/dk3figbb.ctr deleted file mode 100644 index dcecaa5597..0000000000 --- a/support/dktools/dk3figbb.ctr +++ /dev/null @@ -1,641 +0,0 @@ -%% options - -copyright owner = Dirk Krause -copyright year = 2012-xxxx -SPDX-License-Identifier: BSD-3-Clause - - - -%% header - -#ifdef __cplusplus -extern "C" { -#endif - -/** Calculate distance between a given point and a line through - the origin. - @param xp X coordinate of given point. - @param yp Y coordinate of given point. - @param beta Angle of line. - @param ec Pointer to error code variable. - @return Distance value. -*/ -double -dk3figbb_distance_point_line( - double xp, - double yp, - double beta, - int *ec -); - -/** Add ellipse data to bounding box. - @param bb Bounding box data to modify. - @param elli Details of ellipse to add. - @param lw Half line width. - @return 1 on success, 0 on error. -*/ -int -dk3fig_bb_add_ellipse( - dk3_bb_t *bb, - dk3_fig_det_ell_t const *elli, - double lw -); - -/** Add arc data to bounding box. - @param bb Bounding box data to modify. - @param arc Details of arc to add. - @param cl Flag: Closed arc. - @param lw Half line width. - @return 1 on success, 0 on error. -*/ -int -dk3fig_bb_add_arc( - dk3_bb_t *bb, - dk3_fig_det_arc_t const *arc, - int cl, - double lw -); - -/** Add polyline data to bounding box. - @param bb Bounding box data to modify. - @param pol Details of polyline to add. - @param lw Half line width. - @return 1 on success, 0 on error. -*/ -int -dk3fig_bb_add_polyline( - dk3_bb_t *bb, - dk3_fig_det_pol_t const *pol, - double lw -); - -/** Add spline data to bounding box. - @param drw Drawing structure. - @param bb Bounding box data to modify. - @param spl Details of spline object to add. - @param lw Half line width. - @param primobj Flag: Primary object (1=object, 0=arrowhead). - @param iscl Flag: Closed spline (1=closed, 0=open). - @return 1 on success, 0 on error. -*/ -int -dk3fig_bb_add_spline( - dk3_fig_drawing_t *drw, - dk3_bb_t *bb, - dk3_fig_det_spl_t const *spl, - double lw, - int primobj, - int iscl -); - -/** Add text data to bounding box. - @param bb Bounding box data to modify. - @param txt Details of text object to add. - @param res Fig file resolution. - @param bbts Flag: Use text size when calculating bounding box. - @return 1 on success, 0 on error. -*/ -int -dk3fig_bb_add_text( - dk3_bb_t *bb, - dk3_fig_det_txt_t const *txt, - double res, - int bbts -); - -/** Calculate bounding box for half-circle. - @param outbb Destination bounding box. - @param hci Half-circle details. - @param ra Radius around points. - @return 1 on success, 0 on error. -*/ -int -dk3fig_bb_add_hci( - dk3_bb_t *outbb, - dk3_fig_det_hci_t const *hci, - double ra -); - -#ifdef __cplusplus -} -#endif - - - -%% module - -#include "dk3all.h" -#include "dk3fig.h" -#include "dk3bb.h" -#include "dk3xsp.h" -#include "dk3bezcu.h" -#include "dk3figto.h" -#include "dk3figbb.h" - - - -$!trace-include - - - -/** Check whether a value is in a given range. - @param min Interval minimum. - @param max Interval maximum. - @param val Value to check. - @return 1 if the value is in the interval, 0 otherwise. -*/ -static -int -dk3fig_bb_in_range(double min, double max, double val) -{ - int back = 0; - if(min <= val) { - if(max >= val) { - back = 1; - } - } - return back; -} - - - -double -dk3figbb_distance_point_line( - double xp, - double yp, - double beta, - int *ec -) -{ - double sinbeta; /* Sinus of angle. */ - double cosbeta; /* Cosinus of angle. */ - double deltax; /* X difference. */ - double deltay; /* Y difference. */ - double back; - $? "+ dk3figbb_distance_point_line x=%lg y=%lg beta=%lg", xp, yp, beta - sinbeta = sin(beta); - cosbeta = cos(beta); - deltax = dk3ma_d_sub_ok( - xp, - (dk3ma_d_add_ok((yp * sinbeta), (xp * cosbeta), ec) * cosbeta), - ec - ); - deltay = dk3ma_d_sub_ok( - yp, - (dk3ma_d_add_ok((yp * sinbeta), (xp * cosbeta), ec) * sinbeta), - ec - ); - back = sqrt( - dk3ma_d_add_ok( - dk3ma_d_mul_ok(deltax, deltax, ec), - dk3ma_d_mul_ok(deltay, deltay, ec), - ec - ) - ); $? "- dk3figbb_distance_point_line %lg", back - return back; -} - - - -int -dk3fig_bb_add_ellipse( - dk3_bb_t *bb, - dk3_fig_det_ell_t const *elli, - double lw -) -{ - double h; /* Height. */ - double w; /* Width. */ - double x; /* X coordinate of point. */ - double y; /* Y coordinate of point. */ - double th; /* Parameter t for Ph. */ - double tw; /* Parameter t for Pw. */ - double pma; /* Pi minus alpha. */ - double hpma; /* Half pi minus alpha. */ - int back = 0; - int ec = 0; /* Error code for math. */ - int r; /* Result from dk3bb_add. */ - $? "+ dk3fig_bb_add_ellipse %lg", elli->an - if((bb) && (elli)) { - back = 1; - $? ". cx=%lg", elli->cx - $? ". cy=%lg", elli->cy - $? ". rx=%lg", elli->rx - $? ". ry=%lg", elli->ry - $? ". an=%lg (%lg degree)", elli->an, (180.0 * elli->an) / M_PI - if(fabs(elli->an) > 1.0e-6) { $? ". rotated" - pma = dk3ma_d_sub_ok(M_PI, elli->an, &ec); - hpma = dk3ma_d_sub_ok(M_PI_2, elli->an, &ec); - th = dk3ma_d_atan2( - (-1.0 * (elli->ry) * cos(pma)), - ((elli->rx) * sin(pma)) - ); $? ". th=%lg", th - x = (elli->rx) * cos(th); - y = (elli->ry) * sin(th); $? ". x=%lg y=%lg", x, y - h = dk3figbb_distance_point_line( - x, y, (-1.0 * (elli->an)), &ec - ); $? ". h=%lg", h - tw = dk3ma_d_atan2( - (-1.0 * (elli->ry) * cos(hpma)), - ((elli->rx) * sin(hpma)) - ); $? ". tw=%lg", tw - x = (elli->rx) * cos(tw); - y = (elli->ry) * cos(tw); $? ". x=%lg y=%lg", x ,y - w = dk3figbb_distance_point_line( - x, y, dk3ma_d_sub_ok(M_PI_2, (elli->an), &ec), &ec - ); $? ". w=%lg", w - r = dk3bb_add_y_width( - bb, - dk3ma_d_sub_ok(elli->cy, h, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - r = dk3bb_add_y_width( - bb, - dk3ma_d_add_ok(elli->cy, h, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - r = dk3bb_add_x_width( - bb, - dk3ma_d_sub_ok(elli->cx, w, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - r = dk3bb_add_x_width( - bb, - dk3ma_d_add_ok(elli->cx, w, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - } else { $? ". not rotated" - r = dk3bb_add_y_width( - bb, - dk3ma_d_sub_ok(elli->cy, elli->ry, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - r = dk3bb_add_y_width( - bb, - dk3ma_d_add_ok(elli->cy, elli->ry, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - r = dk3bb_add_x_width( - bb, - dk3ma_d_sub_ok(elli->cx, elli->rx, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - r = dk3bb_add_x_width( - bb, - dk3ma_d_add_ok(elli->cx, elli->rx, &ec), - (0.5 * lw) - ); - if(!(r)) { back = 0; } - } - } - if(ec) { back = 0; } $? "- dk3fig_bb_add_ellipse %d", back - return back; -} - - - -int -dk3fig_bb_add_arc( - dk3_bb_t *bb, - dk3_fig_det_arc_t const *arc, - int cl, - double lw -) -{ - double min; /* Minimum angle. */ - double max; /* Maximum angle. */ - int back = 0; - int ec = 0; /* Mathematical error code. */ - $? "+ dk3fig_bb_add_arc %lg", lw - if((bb) && (arc)) { - back = 1; - if(!dk3bb_point_width(bb, arc->x1, arc->y1, lw)) { back = 0; } - if(!dk3bb_point_width(bb, arc->x2, arc->y2, lw)) { back = 0; } - if(!dk3bb_point_width(bb, arc->x3, arc->y3, lw)) { back = 0; } - if(cl) { if(!dk3bb_point_width(bb, arc->xc, arc->yc, lw)) { back = 0; } } - if(arc->ae >= arc->as) { - min = arc->as; max = arc->ae; - } else { - min = arc->ae; max = arc->as; - } $? ". range %lg %lg", min, max - if(dk3fig_bb_in_range(min, max, 0.0)) { $? ". 0 in Fig space" - if(!dk3bb_add_x_width(bb, dk3ma_d_add_ok(arc->xc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, M_PI_2)) { $? ". 90 degree in Fig space" - if(!dk3bb_add_y_width(bb, dk3ma_d_add_ok(arc->yc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, M_PI)) { $? ". 180 degree in Fig space" - if(!dk3bb_add_x_width(bb, dk3ma_d_sub_ok(arc->xc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, (3.0 * M_PI_2))) { $? ". 270 degree in Fig space" - if(!dk3bb_add_y_width(bb, dk3ma_d_sub_ok(arc->yc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, (2.0 * M_PI))) { $? ". 360 degree in Fig space" - if(!dk3bb_add_x_width(bb, dk3ma_d_add_ok(arc->xc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, (5.0 * M_PI_2))) { $? ". 450 degree in Fig space" - if(!dk3bb_add_y_width(bb, dk3ma_d_add_ok(arc->yc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, (3.0 * M_PI))) { $? ". 540 degree in Fig space" - if(!dk3bb_add_x_width(bb, dk3ma_d_sub_ok(arc->xc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, (7.0 * M_PI_2))) { $? ". 630 degree in Fig space" - if(!dk3bb_add_y_width(bb, dk3ma_d_sub_ok(arc->yc, arc->ra, &ec), lw)) { - back = 0; - } - } - if(dk3fig_bb_in_range(min, max, (4.0 * M_PI))) { $? ". 720 degree in Fig space" - if(!dk3bb_add_x_width(bb, dk3ma_d_add_ok(arc->xc, arc->ra, &ec), lw)) { - back = 0; - } - } - } - if(ec) { - back = 0; - } $? "- dk3fig_bb_add_arc %d", back - return back; -} - - - - -int -dk3fig_bb_add_polyline( - dk3_bb_t *bb, - dk3_fig_det_pol_t const *pol, - double lw -) -{ - dk3_fig_poly_point_t const *ptr; /* Current point. */ - size_t num; /* Index of current point. */ - int back = 0; - $? "+ dk3fig_bb_add_polyline" - if((bb) && (pol)) { - if((pol->po) && (0 < pol->np)) { - back = 1; - ptr = pol->po; - num = pol->np; - while(num--) { - if(!dk3bb_point_width(bb, ptr->x, ptr->y, lw)) { back = 0; } - ptr++; - } - } - } $? "- dk3fig_bb_add_polyline %d", back - return back; -} - - - -int -dk3fig_bb_add_text( - dk3_bb_t *bb, - dk3_fig_det_txt_t const *txt, - double res, - int bbts -) -{ - double ymax; /* Maximum y. */ - int back = 0; - int ec = 0; /* Mathematical error code. */ - $? "+ dk3fig_bb_add_text" - if((bb) && (txt)) { - back = 1; - dk3bb_point(bb, txt->x, txt->y); - /* 2013-02-03: Y value is used only if bbts is set. - */ - /* 2012-12-01: Y values grow downwards in Fig space, so we - must substract instead of add. - */ - if(bbts) { - ymax = dk3ma_d_sub_ok( - txt->y, - dk3ma_d_mul_ok(res, (txt->fs / 72.72), &ec), - &ec - ); $? ". ymax = %lg", ymax - dk3bb_point(bb, txt->x, ymax); - } - if(ec) { - back = 0; - } - } $? "- dk3fig_bb_add_text %d", back - return back; -} - - - -/** Add X-spline segment to bounding box. - @param bb Bounding box structure to modify. - @param pa Point A (left neighbour of segment). - @param pb Point B (start of segment). - @param pc Point C (end of segment). - @param pd Point D (right neighbour of segment). - @param xssbs Number of Bezier spline segments per X-spline segment. - @param cb Flag: Compatibility to XFig interpolated spline bug. - @param ra Radius of points. - @return 1 on success, 0 on error. -*/ -static -int -dk3fig_bb_add_xpline_segment( - dk3_bb_t *bb, - dk3_fig_spline_point_t *pa, - dk3_fig_spline_point_t *pb, - dk3_fig_spline_point_t *pc, - dk3_fig_spline_point_t *pd, - size_t xssbs, - int cb, - double ra -) -{ - dk3_xspline_segment_t xseg; /* Spline segment. */ - double x; /* Current x. */ - double y; /* Current y. */ - double lastx; /* Previous x. */ - double lasty; /* Previous y. */ - double dxdt; /* X derived. */ - double dydt; /* Y derived. */ - double lastdxdt; /* X derived, previous value. */ - double lastdydt; /* Y derived, previous value. */ - double xp; /* Start control point x. */ - double yp; /* Start control point y. */ - double xm; /* End control point x. */ - double ym; /* End control point y. */ - double t; /* Current t value. */ - double dxssbs; /* Number of sub segments. */ - double d3; /* Scale factor for derivatives. */ - size_t i; /* Current sub segment. */ - int back = 1; - int mec = 0; /* Mathematical error code. */ - $? "+ dk3fig_bb_add_xpline_segment" - dk3xsp_reset(&xseg); - if(cb) { dk3xsp_set_cb(&xseg, cb); } - dk3xsp_set(&xseg, pa, pb, pc, pd); - if(dk3xsp_calculate(&xseg, 0.0, 1)) { $? ". first calc" - dxssbs = (double)xssbs; - d3 = dk3ma_d_mul_ok(3.0, dxssbs, &mec); - lastx = dk3xsp_get_x(&xseg); - lasty = dk3xsp_get_y(&xseg); - lastdxdt = dk3xsp_get_dxdt(&xseg); - lastdydt = dk3xsp_get_dydt(&xseg); - for(i = 1; i <= xssbs; i++) { - if(i < xssbs) { - t = (double)i / dxssbs; - } else { - t = 1.0; - } - if(dk3xsp_calculate(&xseg, t, 1)) { - x = dk3xsp_get_x(&xseg); - y = dk3xsp_get_y(&xseg); - dxdt = dk3xsp_get_dxdt(&xseg); - dydt = dk3xsp_get_dydt(&xseg); - xp = dk3ma_d_add_ok( - lastx, - dk3ma_d_div_ok(lastdxdt, d3, &mec), - &mec - ); - yp = dk3ma_d_add_ok( - lasty, - dk3ma_d_div_ok(lastdydt, d3, &mec), - &mec - ); - xm = dk3ma_d_sub_ok( - x, - dk3ma_d_div_ok(dxdt, d3, &mec), - &mec - ); - ym = dk3ma_d_sub_ok( - y, - dk3ma_d_div_ok(dydt, d3, &mec), - &mec - ); - if(!dk3bezier_bb(bb, lastx, lasty, xp, yp, xm, ym, x, y, ra, &mec)) { - back = 0; $? "! Bezier bb" - } - lastx = x; - lasty = y; - lastdxdt = dxdt; - lastdydt = dydt; - } else { $? "! calc" - back = 0; - } - } - } else { $? "! first calc" - back = 0; - } - if(mec) { $? "! math error" - back = 0; - } $? "- dk3fig_bb_add_xpline_segment %d", back - return back; -} - - - -int -dk3fig_bb_add_spline( - dk3_fig_drawing_t *drw, - dk3_bb_t *bb, - dk3_fig_det_spl_t const *spl, - double lw, - int primobj, - int iscl -) -{ - dk3_fig_spline_point_t *pa; /* Point A. */ - dk3_fig_spline_point_t *pb; /* Point B. */ - dk3_fig_spline_point_t *pc; /* Point C. */ - dk3_fig_spline_point_t *pd; /* Point D. */ - size_t xssbs; /* Bezier segments per X-spline segment. */ - size_t cs; /* Current X-spline segment. */ - int back = 0; - $? "+ dk3fig_bb_add_spline closed=%d", iscl - if((bb) && (spl)) { - if((spl->po) && (((iscl) ? (size_t)2 : (size_t)1) < spl->np)) { - back = 1; - xssbs = dk3fig_tool_xssbs(drw, primobj); - if(iscl) { $? ". closed spline" - for(cs = 0; cs < (spl->np); cs++) { - pb = &((spl->po)[cs]); - pc = &((spl->po)[((cs < (spl->np - 1)) ? (cs + 1) : 0)]); - pa = &((spl->po)[(cs > 0) ? (cs - 1) : ((spl->np) - 1)]); - pd = &((spl->po)[(cs < (spl->np - 2))?(cs + 2):(cs + 2 - spl->np)]); - if(!dk3fig_bb_add_xpline_segment(bb,pa,pb,pc,pd,xssbs,drw->cosp,lw)) { - back = 0; - } - } - } else { $? ". open spline" - for(cs = 0; cs < ((spl->np) - 1); cs++) { - pa = pd = NULL; - pb = &((spl->po)[cs]); - pc = &((spl->po)[cs + 1]); - if(0 < cs) { pa = &((spl->po)[cs - 1]); } - if(cs < ((spl->np) - 2)) { pd = &((spl->po)[cs + 2]); } - if(!dk3fig_bb_add_xpline_segment(bb,pa,pb,pc,pd,xssbs,drw->cosp,lw)) { - back = 0; - } - } - } - } else { $? "! no point data or too few points" - } - } $? "- dk3fig_bb_add_spline %d", back - return back; -} - - - -int -dk3fig_bb_add_hci( - dk3_bb_t *outbb, - dk3_fig_det_hci_t const *hci, - double ra -) -{ - dk3_fig_poly_point_t po[3]; /* End and middle point of arc. */ - size_t i; /* Used as index when rotating. */ - int back = 0; - int mec = 0; /* Mathematical error code. */ - if((outbb) && (hci)) { - po[0].x = 0.0; - po[0].y = hci->ra; - po[1].x = -1.0 * hci->ra; - po[1].y = 0.0; - po[2].x = 0.0; - po[2].y = -1.0 * hci->ra; - for(i = 0; i < 3; i++) { - dk3fig_tool_rotate_point(&(po[i]), hci->an, &mec); - dk3fig_tool_shift_point( - &(po[i]), hci->cx, hci->cy, &mec - ); - } - if(0 == mec) { - back = 1; - if(!dk3bb_point_width(outbb, po[0].x, po[0].y, ra)) { back = 0; } - if(!dk3bb_point_width(outbb, po[1].x, po[1].y, ra)) { back = 0; } - if(!dk3bb_point_width(outbb, po[2].x, po[2].y, ra)) { back = 0; } - /* ##### HIER WEITER: Weitere Punkte je nach Drehung */ - } - } - return back; -} - - |