diff options
author | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
commit | 1f457376b478257b88d4a857f5ec1b6155442dd7 (patch) | |
tree | 2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/dk3xsp.c | |
parent | ac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff) |
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/dk3xsp.c')
-rw-r--r-- | support/dktools/dk3xsp.c | 536 |
1 files changed, 362 insertions, 174 deletions
diff --git a/support/dktools/dk3xsp.c b/support/dktools/dk3xsp.c index 8d731aeb32..c84f570e9d 100644 --- a/support/dktools/dk3xsp.c +++ b/support/dktools/dk3xsp.c @@ -1,43 +1,21 @@ /* - WARNING: This file was generated by dkct. - Changes you make here will be lost if dkct is run again! - You should modify the original source and run dkct on it. - Original source: dk3xsp.ctr +Copyright (C) 2012-2020, Dirk Krause +SPDX-License-Identifier: BSD-3-Clause */ /* -Copyright (C) 2012-2017, Dirk Krause - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above opyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -* Neither the name of the author nor the names of contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + WARNING: This file was generated by the dkct program (see + http://dktools.sourceforge.net/ for details). + Changes you make here will be lost if dkct is run again! + You should modify the original source and run dkct on it. + Original source: dk3xsp.ctr */ /** @file dk3xsp.c The dk3xsp module. */ -#line 260 "dk3xsp.ctr" +#line 285 "dk3xsp.ctr" #include "dk3all.h" #include "dk3fig.h" @@ -45,7 +23,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#line 266 "dk3xsp.ctr" +#line 291 "dk3xsp.ctr" + @@ -56,13 +35,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* ************************************************************************ */ -#line 272 "dk3xsp.ctr" - - +#line 298 "dk3xsp.ctr" -#line 276 "dk3xsp.ctr" @@ -141,7 +117,7 @@ dk3xsp_f(double u, double p) back = u * u * u *(10.0 - p + u * (2.0 * p - 15.0 + u * (6.0 - p))); -#line 353 "dk3xsp.ctr" +#line 378 "dk3xsp.ctr" return back; } @@ -160,7 +136,7 @@ dk3xsp_dfdu(double u, double p) back = u * u * (30.0 - 3.0*p + u * (8.0*p - 60.0 + u * (30.0 - 5.0*p))); -#line 370 "dk3xsp.ctr" +#line 395 "dk3xsp.ctr" return back; } @@ -180,7 +156,7 @@ dk3xsp_g(double u, double p, double q) back = u*(q+u*(2.0*q+u*(10.0-12.0*q-p+u*(2.0*p+14.0*q-15+u*(6.0-5.0*q-p))))); -#line 388 "dk3xsp.ctr" +#line 413 "dk3xsp.ctr" return back; } @@ -201,7 +177,7 @@ dk3xsp_dgdu(double u, double p, double q) q+u*(4.0*q+u*(30.0-3.0*p-36.0*q+u*(56.0*q+8.0*p-60.0+u*(30.0-5.0*p-25.0*q)))); -#line 407 "dk3xsp.ctr" +#line 432 "dk3xsp.ctr" return back; } @@ -220,7 +196,7 @@ dk3xsp_h(double u, double q) back = u*(q+u*(2.0*q-u*u*(q*(u+2.0)))); -#line 424 "dk3xsp.ctr" +#line 449 "dk3xsp.ctr" return back; } @@ -239,7 +215,7 @@ dk3xsp_dhdu(double u, double q) back = q+u*(4.0*q-u*u*(q*(8.0+5.0*u))); -#line 441 "dk3xsp.ctr" +#line 466 "dk3xsp.ctr" return back; } @@ -304,7 +280,7 @@ dk3xsp_set( { -#line 504 "dk3xsp.ctr" +#line 529 "dk3xsp.ctr" if(pseg) { pseg->ha = ((a) ? 1 : 0); pseg->hd = ((d) ? 1 : 0); @@ -341,19 +317,19 @@ dk3xsp_set( } -#line 539 "dk3xsp.ctr" +#line 564 "dk3xsp.ctr" -#line 540 "dk3xsp.ctr" +#line 565 "dk3xsp.ctr" -#line 541 "dk3xsp.ctr" +#line 566 "dk3xsp.ctr" -#line 542 "dk3xsp.ctr" +#line 567 "dk3xsp.ctr" } -#line 543 "dk3xsp.ctr" +#line 568 "dk3xsp.ctr" } @@ -388,7 +364,7 @@ dk3xsp_calculate( int back = 0; -#line 576 "dk3xsp.ctr" +#line 601 "dk3xsp.ctr" if(pseg) { back = 1; /* @@ -416,16 +392,16 @@ dk3xsp_calculate( } -#line 602 "dk3xsp.ctr" +#line 627 "dk3xsp.ctr" -#line 603 "dk3xsp.ctr" +#line 628 "dk3xsp.ctr" -#line 604 "dk3xsp.ctr" +#line 629 "dk3xsp.ctr" -#line 605 "dk3xsp.ctr" +#line 630 "dk3xsp.ctr" /* Calculate fa, fb, fc, fd. */ @@ -449,16 +425,16 @@ dk3xsp_calculate( } -#line 627 "dk3xsp.ctr" +#line 652 "dk3xsp.ctr" -#line 628 "dk3xsp.ctr" +#line 653 "dk3xsp.ctr" -#line 629 "dk3xsp.ctr" +#line 654 "dk3xsp.ctr" -#line 630 "dk3xsp.ctr" +#line 655 "dk3xsp.ctr" /* Calculate counters and denominator. */ @@ -495,13 +471,13 @@ dk3xsp_calculate( ); -#line 665 "dk3xsp.ctr" +#line 690 "dk3xsp.ctr" -#line 666 "dk3xsp.ctr" +#line 691 "dk3xsp.ctr" -#line 667 "dk3xsp.ctr" +#line 692 "dk3xsp.ctr" /* Calculate x and y value. */ @@ -509,10 +485,10 @@ dk3xsp_calculate( pseg->y = dk3ma_d_div_ok(zy, n, &ec); -#line 673 "dk3xsp.ctr" +#line 698 "dk3xsp.ctr" -#line 674 "dk3xsp.ctr" +#line 699 "dk3xsp.ctr" /* Calculate derivatives if required. */ @@ -552,16 +528,16 @@ dk3xsp_calculate( } -#line 712 "dk3xsp.ctr" +#line 737 "dk3xsp.ctr" -#line 713 "dk3xsp.ctr" +#line 738 "dk3xsp.ctr" -#line 714 "dk3xsp.ctr" +#line 739 "dk3xsp.ctr" -#line 715 "dk3xsp.ctr" +#line 740 "dk3xsp.ctr" /* Calculate counters and denominator. */ @@ -599,16 +575,16 @@ dk3xsp_calculate( nsq = n * n; -#line 751 "dk3xsp.ctr" +#line 776 "dk3xsp.ctr" -#line 752 "dk3xsp.ctr" +#line 777 "dk3xsp.ctr" -#line 753 "dk3xsp.ctr" +#line 778 "dk3xsp.ctr" -#line 754 "dk3xsp.ctr" +#line 779 "dk3xsp.ctr" pseg->dxdt = dk3ma_d_div_ok( dk3ma_d_sub_ok( dk3ma_d_mul_ok(n, zxder, &ec), @@ -629,17 +605,17 @@ dk3xsp_calculate( ); -#line 773 "dk3xsp.ctr" +#line 798 "dk3xsp.ctr" -#line 774 "dk3xsp.ctr" +#line 799 "dk3xsp.ctr" } if(ec) { back = 0; } } -#line 779 "dk3xsp.ctr" +#line 804 "dk3xsp.ctr" return back; } @@ -652,7 +628,7 @@ dk3xsp_calculate( /* ************************************************************************ */ -#line 787 "dk3xsp.ctr" +#line 812 "dk3xsp.ctr" @@ -668,12 +644,6 @@ dk3xsp_is_null(double s) - - -#line 803 "dk3xsp.ctr" - - - /** Convert long to double. @param l Long value to convert. @return Conversion result. @@ -710,7 +680,7 @@ dk3xsp_segment_length( int cc = 1; /* Flag: Can continue. */ -#line 841 "dk3xsp.ctr" +#line 862 "dk3xsp.ctr" if((pseg) && (prec > 0.0)) { if(dk3xsp_is_null((pseg->b).s) && dk3xsp_is_null((pseg->c).s)) { /* @@ -726,10 +696,10 @@ dk3xsp_segment_length( ) ); -#line 855 "dk3xsp.ctr" +#line 876 "dk3xsp.ctr" } else { -#line 856 "dk3xsp.ctr" +#line 877 "dk3xsp.ctr" /* Spline calculation really necessary. */ @@ -737,7 +707,7 @@ dk3xsp_segment_length( if(lastpassres > -1.0) { lastpassres = -1.0; } while((cc) && (mc) && (!(mec))) { -#line 862 "dk3xsp.ctr" +#line 883 "dk3xsp.ctr" passres = 0.0; if(dk3xsp_calculate(pseg, 0.0, 0)) { lastx = dk3xsp_get_x(pseg); @@ -774,20 +744,23 @@ dk3xsp_segment_length( } } -#line 897 "dk3xsp.ctr" +#line 918 "dk3xsp.ctr" if(fabs(passres - lastpassres) < prec) { -#line 898 "dk3xsp.ctr" +#line 919 "dk3xsp.ctr" mc = 0; /* Finished successfully. */ back = passres; + + +#line 922 "dk3xsp.ctr" } else { -#line 901 "dk3xsp.ctr" +#line 923 "dk3xsp.ctr" lastpassres = passres; segs = segs * 2L; if(segs > DK3XSP_MAX_ITERATION_SEGMENTS) { -#line 904 "dk3xsp.ctr" +#line 926 "dk3xsp.ctr" cc = 0; if(ec) { *ec = DK3_ERROR_ITERATION; } } @@ -803,7 +776,7 @@ dk3xsp_segment_length( if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } } -#line 918 "dk3xsp.ctr" +#line 940 "dk3xsp.ctr" return back; } @@ -837,17 +810,17 @@ dk3xsp_segment_partial_length( int cc = 1; /* Flag: Can continue. */ -#line 950 "dk3xsp.ctr" +#line 972 "dk3xsp.ctr" if((pseg) && (prec > 0.0) && (tstart >= 0.0) && (tstart<= 1.0)) { -#line 951 "dk3xsp.ctr" +#line 973 "dk3xsp.ctr" if(dk3xsp_is_null((pseg->b).s) && dk3xsp_is_null((pseg->c).s)) { /* Simple line. */ -#line 956 "dk3xsp.ctr" +#line 978 "dk3xsp.ctr" if(dk3xsp_calculate(pseg, tstart, 0)) { x = dk3xsp_get_x(pseg); y = dk3xsp_get_y(pseg); @@ -877,10 +850,10 @@ dk3xsp_segment_partial_length( */ -#line 984 "dk3xsp.ctr" +#line 1006 "dk3xsp.ctr" if(dir) { -#line 985 "dk3xsp.ctr" +#line 1007 "dk3xsp.ctr" lastpassres = 0.0 - 2.0 * prec; if(lastpassres > -1.0) { lastpassres = -1.0; } while((cc) && (mc) && (!(mec))) { @@ -896,29 +869,29 @@ dk3xsp_segment_partial_length( t = (tstart * dk3xsp_l_to_d(i)) / dsegs; } -#line 999 "dk3xsp.ctr" +#line 1021 "dk3xsp.ctr" if(dk3xsp_calculate(pseg, t, 0)) { -#line 1001 "dk3xsp.ctr" +#line 1023 "dk3xsp.ctr" -#line 1002 "dk3xsp.ctr" +#line 1024 "dk3xsp.ctr" x = dk3xsp_get_x(pseg); -#line 1003 "dk3xsp.ctr" +#line 1025 "dk3xsp.ctr" y = dk3xsp_get_y(pseg); -#line 1004 "dk3xsp.ctr" +#line 1026 "dk3xsp.ctr" deltax = dk3ma_d_sub_ok(x, lastx, &mec); -#line 1005 "dk3xsp.ctr" +#line 1027 "dk3xsp.ctr" deltay = dk3ma_d_sub_ok(y, lasty, &mec); -#line 1006 "dk3xsp.ctr" +#line 1028 "dk3xsp.ctr" -#line 1007 "dk3xsp.ctr" +#line 1029 "dk3xsp.ctr" passres = dk3ma_d_add_ok( passres, sqrt( @@ -931,7 +904,7 @@ dk3xsp_segment_partial_length( &mec ); -#line 1018 "dk3xsp.ctr" +#line 1040 "dk3xsp.ctr" lastx = x; lasty = y; } else { cc = 0; @@ -956,7 +929,7 @@ dk3xsp_segment_partial_length( } } else { -#line 1041 "dk3xsp.ctr" +#line 1063 "dk3xsp.ctr" tdiff = 1.0 - tstart; lastpassres = 0.0 - 2.0 * prec; if(lastpassres > -1.0) { lastpassres = -1.0; } @@ -969,47 +942,47 @@ dk3xsp_segment_partial_length( for(i = 1L; i <= segs; i++) { if(i == segs) { -#line 1052 "dk3xsp.ctr" +#line 1074 "dk3xsp.ctr" t = 1.0; } else { t = tstart + ((tdiff * dk3xsp_l_to_d(i)) / dsegs); } -#line 1057 "dk3xsp.ctr" +#line 1079 "dk3xsp.ctr" if(dk3xsp_calculate(pseg, t, 0)) { x = dk3xsp_get_x(pseg); y = dk3xsp_get_y(pseg); } else { -#line 1061 "dk3xsp.ctr" +#line 1083 "dk3xsp.ctr" cc = 0; mec = DK3_ERROR_MATH_OVERFLOW; } if(cc) { -#line 1066 "dk3xsp.ctr" +#line 1088 "dk3xsp.ctr" -#line 1067 "dk3xsp.ctr" +#line 1089 "dk3xsp.ctr" -#line 1068 "dk3xsp.ctr" +#line 1090 "dk3xsp.ctr" -#line 1069 "dk3xsp.ctr" +#line 1091 "dk3xsp.ctr" deltax = dk3ma_d_sub_ok(x, lastx, &mec); deltay = dk3ma_d_sub_ok(y, lasty, &mec); -#line 1072 "dk3xsp.ctr" +#line 1094 "dk3xsp.ctr" -#line 1073 "dk3xsp.ctr" +#line 1095 "dk3xsp.ctr" -#line 1074 "dk3xsp.ctr" +#line 1096 "dk3xsp.ctr" passres = dk3ma_d_add_ok( passres, sqrt( @@ -1022,7 +995,7 @@ dk3xsp_segment_partial_length( &mec ); -#line 1085 "dk3xsp.ctr" +#line 1107 "dk3xsp.ctr" lastx = x; lasty = y; } } @@ -1050,7 +1023,7 @@ dk3xsp_segment_partial_length( } -#line 1111 "dk3xsp.ctr" +#line 1133 "dk3xsp.ctr" return back; } @@ -1063,7 +1036,7 @@ dk3xsp_segment_partial_length( /* ************************************************************************ */ -#line 1119 "dk3xsp.ctr" +#line 1141 "dk3xsp.ctr" @@ -1084,14 +1057,14 @@ dk3xsp_open_spline_length( int mec = 0; -#line 1138 "dk3xsp.ctr" +#line 1160 "dk3xsp.ctr" if((points) && (1 < np) && (prec > 0.0)) { dk3xsp_reset(&seg); if(cb) { dk3xsp_set_cb(&seg, 1); } for(i = 0; ((i < (np - 1)) && (back > -1.0)); i++) { -#line 1143 "dk3xsp.ctr" +#line 1165 "dk3xsp.ctr" val = -1.0; if(fslc) { val = fslc[i]; @@ -1125,7 +1098,7 @@ dk3xsp_open_spline_length( if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } } -#line 1175 "dk3xsp.ctr" +#line 1197 "dk3xsp.ctr" return back; } @@ -1146,7 +1119,7 @@ dk3xsp_find_segment_start(double tstart, int *ec) int mec = 0; -#line 1194 "dk3xsp.ctr" +#line 1216 "dk3xsp.ctr" ul = dk3ma_d_to_ul_ok(floor(tstart), &mec); if(mec) { *ec = mec; @@ -1157,19 +1130,19 @@ dk3xsp_find_segment_start(double tstart, int *ec) } } -#line 1203 "dk3xsp.ctr" +#line 1225 "dk3xsp.ctr" return back; #else size_t back = 0; int mec = 0; -#line 1208 "dk3xsp.ctr" +#line 1230 "dk3xsp.ctr" back = dk3ma_d_to_sz_ok(floor(tstart), &mec); if (mec) { if (ec) { *ec = mec; } } -#line 1211 "dk3xsp.ctr" +#line 1233 "dk3xsp.ctr" return back; #endif } @@ -1250,7 +1223,7 @@ dk3xsp_open_spline_partial_length( int mec = 0; -#line 1290 "dk3xsp.ctr" +#line 1312 "dk3xsp.ctr" if((points) && (1 < np) && (prec > 0.0)) { if((tstart >= 0.0) && (tstart <= ((double)(np - 1)))) { dk3xsp_reset(&seg); @@ -1258,14 +1231,14 @@ dk3xsp_open_spline_partial_length( startseg = dk3xsp_find_segment_start(tstart, &mec); if(mec) { -#line 1296 "dk3xsp.ctr" +#line 1318 "dk3xsp.ctr" if(ec) { *ec = mec; } } else { -#line 1298 "dk3xsp.ctr" +#line 1320 "dk3xsp.ctr" if(startseg == (np - 1)) { -#line 1299 "dk3xsp.ctr" +#line 1321 "dk3xsp.ctr" /* tstart points to the final point. So we have 0 for forward length or the full @@ -1273,19 +1246,19 @@ dk3xsp_open_spline_partial_length( */ if(dir) { -#line 1305 "dk3xsp.ctr" +#line 1327 "dk3xsp.ctr" back = dk3xsp_open_spline_length(points, np, prec, fslc, cb, ec); } else { -#line 1307 "dk3xsp.ctr" +#line 1329 "dk3xsp.ctr" back = 0.0; } } else { -#line 1310 "dk3xsp.ctr" +#line 1332 "dk3xsp.ctr" if(tstart > 0.0) { -#line 1311 "dk3xsp.ctr" +#line 1333 "dk3xsp.ctr" /* tstart points to somewhere in the spline. We have to calculate one segment partially, all other @@ -1303,7 +1276,7 @@ dk3xsp_open_spline_partial_length( ); if(val >= 0.0) { -#line 1327 "dk3xsp.ctr" +#line 1349 "dk3xsp.ctr" back = val; /* Partial segment calculated successfully. @@ -1311,14 +1284,14 @@ dk3xsp_open_spline_partial_length( */ if(dir) { -#line 1333 "dk3xsp.ctr" +#line 1355 "dk3xsp.ctr" /* Calculate all segments before the partial one. */ for(i = 0; ((i < startseg) && (back > -1.0)); i++) { val = -1.0; -#line 1338 "dk3xsp.ctr" +#line 1360 "dk3xsp.ctr" if(fslc) { val = fslc[i]; } @@ -1341,7 +1314,7 @@ dk3xsp_open_spline_partial_length( } if(val >= 0.0) { -#line 1359 "dk3xsp.ctr" +#line 1381 "dk3xsp.ctr" back = dk3ma_d_add_ok(back, val, &mec); if(mec) { back = -1.0; i = np; @@ -1353,14 +1326,14 @@ dk3xsp_open_spline_partial_length( } } else { -#line 1369 "dk3xsp.ctr" +#line 1391 "dk3xsp.ctr" /* Calculate all segments after the partial one. */ for(i = (startseg + 1); ((i < (np - 1)) && (back > -1)); i++) { val = -1.0; -#line 1374 "dk3xsp.ctr" +#line 1396 "dk3xsp.ctr" if(fslc) { val = fslc[i]; } @@ -1383,7 +1356,7 @@ dk3xsp_open_spline_partial_length( } if(val >= 0.0) { -#line 1395 "dk3xsp.ctr" +#line 1417 "dk3xsp.ctr" back = dk3ma_d_add_ok(back, val, &mec); if(mec) { back = -1.0; i = np; @@ -1391,20 +1364,20 @@ dk3xsp_open_spline_partial_length( } } else { -#line 1401 "dk3xsp.ctr" +#line 1423 "dk3xsp.ctr" back = -1.0; i = np; } } } -#line 1405 "dk3xsp.ctr" +#line 1427 "dk3xsp.ctr" } else { -#line 1406 "dk3xsp.ctr" +#line 1428 "dk3xsp.ctr" } } else { -#line 1408 "dk3xsp.ctr" +#line 1430 "dk3xsp.ctr" /* tstart points to the start point. So we have the full spline length for forward length, @@ -1412,11 +1385,11 @@ dk3xsp_open_spline_partial_length( */ if(0 == dir) { -#line 1414 "dk3xsp.ctr" +#line 1436 "dk3xsp.ctr" back = dk3xsp_open_spline_length(points, np, prec, fslc, cb, ec); } else { -#line 1416 "dk3xsp.ctr" +#line 1438 "dk3xsp.ctr" back = 0.0; } } @@ -1429,14 +1402,14 @@ dk3xsp_open_spline_partial_length( if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } } -#line 1427 "dk3xsp.ctr" +#line 1449 "dk3xsp.ctr" return back; } double -dk3xsp_get_t_for_distance( +dk3xsp_get_t_for_distance_bisection( dk3_fig_spline_point_t const *points, size_t np, double dist, @@ -1464,13 +1437,13 @@ dk3xsp_get_t_for_distance( int mc = 1; /* Flag: Must continue. */ -#line 1460 "dk3xsp.ctr" +#line 1482 "dk3xsp.ctr" fprec = 0.2 * prec; if((points) && (1 < np) && (prec > 0.0) && (dist >= 0.0)) { l = dk3xsp_open_spline_length(points, np, fprec, fslc, cb, &mec); -#line 1464 "dk3xsp.ctr" +#line 1486 "dk3xsp.ctr" if(l > dist) { xl = 0.0; xr = (double)(np - 1); @@ -1478,18 +1451,18 @@ dk3xsp_get_t_for_distance( yl = 0.0 - dist; yr = dk3ma_d_sub_ok(l, dist, &mec); -#line 1470 "dk3xsp.ctr" +#line 1492 "dk3xsp.ctr" } else { yl = dk3ma_d_sub_ok(l, dist, &mec); -#line 1472 "dk3xsp.ctr" +#line 1494 "dk3xsp.ctr" yr = 0.0 - dist; } while((cc) && (mc) && (!(mec))) { xc = 0.5 * dk3ma_d_add_ok(xl, xr, &mec); -#line 1477 "dk3xsp.ctr" +#line 1499 "dk3xsp.ctr" yc = dk3ma_d_sub_ok( dk3xsp_open_spline_partial_length( points, np, fprec, xc, fslc, dir, cb, ec @@ -1498,16 +1471,16 @@ dk3xsp_get_t_for_distance( &mec ); -#line 1484 "dk3xsp.ctr" +#line 1506 "dk3xsp.ctr" -#line 1485 "dk3xsp.ctr" +#line 1507 "dk3xsp.ctr" -#line 1486 "dk3xsp.ctr" +#line 1508 "dk3xsp.ctr" -#line 1487 "dk3xsp.ctr" +#line 1509 "dk3xsp.ctr" if(dir) { if(yc > 0.0) { xr = xc; yr = yc; @@ -1528,10 +1501,10 @@ dk3xsp_get_t_for_distance( } else { passno++; -#line 1506 "dk3xsp.ctr" +#line 1528 "dk3xsp.ctr" if(passno > 1000UL) { -#line 1507 "dk3xsp.ctr" +#line 1529 "dk3xsp.ctr" mec = DK3_ERROR_ITERATION; } else { } @@ -1539,12 +1512,12 @@ dk3xsp_get_t_for_distance( } if((cc) && (!(mec))) { -#line 1513 "dk3xsp.ctr" +#line 1535 "dk3xsp.ctr" back = xl + ((xr - xl) * ayl)/(ayl + ayr); } if(mec) { -#line 1516 "dk3xsp.ctr" +#line 1538 "dk3xsp.ctr" back = -1.0; if(ec) { *ec = mec; } } @@ -1555,12 +1528,227 @@ dk3xsp_get_t_for_distance( if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } } -#line 1525 "dk3xsp.ctr" +#line 1547 "dk3xsp.ctr" + return back; +} + + + +#if DK3_HAVE_ISFINITE +#define MY_ISFINITE(x) (isfinite(x)) +#else +#if DK3_HAVE__FINITE +#define MY_ISFINITE(x) (_finite(x)) +#else +#define MY_ISFINITE(x) (1) +#endif +#endif + +#if DK3_HAVE_ISLESS +#define MY_ISLESS(a,b) (isless((a),(b))) +#else +#define MY_ISLESS(a,b) (((MY_ISFINITE(a)) && (MY_ISFINITE(b))) && ((a) < (b))) +#endif + + +static +double +dk3xsp_gamma(double fg, double fx) +{ + double back; + back = 1.0 - fx / fg; + if (!(MY_ISFINITE(back))) { + back = 0.5; + } else { + if (0.0 >= back) { + back = 0.5; + } else { + if (1.0 < back) { + back = 1.0; + } + } + } + return back; +} + + + +double +dk3xsp_get_t_for_distance( + dk3_fig_spline_point_t const *points, + size_t np, + double dist, + double prec, + double *fslc, + int dir, + int cb, + int *ec +) +{ + double back = -1.0; + double x = 0.0; + double xo; + double a; + double b; + double ya; + double yb; + double yx; + double fprec; + double l; + double gamma; + unsigned long passno = 0UL; + int ls = 0; + int mec = 0; + int cc = 1; + + +#line 1619 "dk3xsp.ctr" + fprec = prec / 8.0; + if((points) && (1 < np) && (prec > 0.0) && (dist >= 0.0)) { + l = dk3xsp_open_spline_length(points, np, fprec, fslc, cb, &mec); + if ((l > dist) && (0 == mec)) { + a = 0.0; + b = (double)(np - 1); + if(dir) { + ya = 0.0 - dist; + yb = dk3ma_d_sub_ok(l, dist, &mec); + } else { + ya = dk3ma_d_sub_ok(l, dist, &mec); + yb = 0.0 - dist; + } + if (0 == mec) { + while (1 == cc) { + + +#line 1635 "dk3xsp.ctr" + + +#line 1636 "dk3xsp.ctr" + + +#line 1637 "dk3xsp.ctr" + xo = x; + x = (a * yb - b * ya) / (yb - ya); + + +#line 1640 "dk3xsp.ctr" + if (MY_ISFINITE(x)) { + yx = dk3ma_d_sub_ok( + dk3xsp_open_spline_partial_length( + points, np, fprec, x, fslc, dir, cb, ec + ), dist, &mec + ); + + +#line 1647 "dk3xsp.ctr" + if (MY_ISFINITE(yx)) { + if ((passno > 0UL) && (MY_ISLESS((x-xo),prec)) && (fabs(yx) < prec)) + { + cc = 0; + +#line 1651 "dk3xsp.ctr" + back = x; + } + else + { + if (passno >= 1000UL) { + +#line 1656 "dk3xsp.ctr" + cc = -1; + /* ##### ERROR: TOO MANY PASSES */ + } else { + if (dir) { + if (yx > 0.0) { + +#line 1661 "dk3xsp.ctr" + if (1 == ls) { + +#line 1662 "dk3xsp.ctr" + gamma = dk3xsp_gamma(yb, yx); + ya *= gamma; + } + b = x; yb = yx; + ls = 1; + } else { + +#line 1668 "dk3xsp.ctr" + if (-1 == ls) { + +#line 1669 "dk3xsp.ctr" + gamma = dk3xsp_gamma(ya, yx); + yb *= gamma; + } + a = x; ya = yx; + ls = -1; + } + } else { + if (yx > 0.0) { + +#line 1677 "dk3xsp.ctr" + if (-1 == ls) { + +#line 1678 "dk3xsp.ctr" + gamma = dk3xsp_gamma(ya, yx); + yb *= gamma; + } + a = x; ya = yx; + ls = -1; + } else { + +#line 1684 "dk3xsp.ctr" + if (1 == ls) { + +#line 1685 "dk3xsp.ctr" + gamma = dk3xsp_gamma(yb, yx); + ya *= gamma; + } + b = x; yb = yx; + ls = 1; + } + } + } + } + } else { + +#line 1695 "dk3xsp.ctr" + cc = -1; + /* ##### MATH ERROR */ + } + } else { + +#line 1699 "dk3xsp.ctr" + cc = -1; + /* ##### MATH ERROR */ + } + if (ULONG_MAX > passno) { passno++; } + } + } else { + +#line 1705 "dk3xsp.ctr" + /* ##### ERROR: Math error */ + } + } else { + +#line 1708 "dk3xsp.ctr" + if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } + } + } else { + +#line 1711 "dk3xsp.ctr" + if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } + } + + +#line 1714 "dk3xsp.ctr" return back; } + +#line 1719 "dk3xsp.ctr" + + double dk3xsp_direction( dk3_fig_spline_point_t const *points, @@ -1584,7 +1772,7 @@ dk3xsp_direction( int mec = 0; -#line 1552 "dk3xsp.ctr" +#line 1743 "dk3xsp.ctr" if((points) && (1 < np)) { if((t >= 0.0) && (t <= ((double)(np - 1)))) { dk3xsp_reset(&seg); @@ -1596,7 +1784,7 @@ dk3xsp_direction( back = dk3ma_d_atan2(dydt, dxdt); } else { -#line 1562 "dk3xsp.ctr" +#line 1753 "dk3xsp.ctr" delta = 0.001; tleft = tright = t; if(t > delta) { tleft = t - delta; } @@ -1612,16 +1800,16 @@ dk3xsp_direction( back = dk3ma_d_atan2(dydt, dxdt); } else { -#line 1576 "dk3xsp.ctr" +#line 1767 "dk3xsp.ctr" } } else { -#line 1578 "dk3xsp.ctr" +#line 1769 "dk3xsp.ctr" } } } else { -#line 1581 "dk3xsp.ctr" +#line 1772 "dk3xsp.ctr" } if(mec) { if(ec) { *ec = mec; } } } else { @@ -1631,7 +1819,7 @@ dk3xsp_direction( if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } } -#line 1589 "dk3xsp.ctr" +#line 1780 "dk3xsp.ctr" return back; } @@ -1662,7 +1850,7 @@ dk3xsp_direction_and_position( int mec = 0; -#line 1618 "dk3xsp.ctr" +#line 1809 "dk3xsp.ctr" if((points) && (1 < np) && (xpos) && (ypos)) { if((t >= 0.0) && (t <= ((double)(np - 1)))) { dk3xsp_reset(&seg); @@ -1673,14 +1861,14 @@ dk3xsp_direction_and_position( dxdt = dk3xsp_get_dxdt(&seg); dydt = dk3xsp_get_dydt(&seg); -#line 1627 "dk3xsp.ctr" +#line 1818 "dk3xsp.ctr" if((fabs(dxdt) > 1.0e-6) || (fabs(dydt) > 1.0e-6)) { back = dk3ma_d_atan2(dydt, dxdt); -#line 1629 "dk3xsp.ctr" +#line 1820 "dk3xsp.ctr" } else { -#line 1630 "dk3xsp.ctr" +#line 1821 "dk3xsp.ctr" delta = 0.001; tleft = tright = t; if(t > delta) { tleft = t - delta; } @@ -1696,16 +1884,16 @@ dk3xsp_direction_and_position( back = dk3ma_d_atan2(dydt, dxdt); } else { -#line 1644 "dk3xsp.ctr" +#line 1835 "dk3xsp.ctr" } } else { -#line 1646 "dk3xsp.ctr" +#line 1837 "dk3xsp.ctr" } } } else { -#line 1649 "dk3xsp.ctr" +#line 1840 "dk3xsp.ctr" } if(mec) { if(ec) { *ec = mec; } } } else { @@ -1715,7 +1903,7 @@ dk3xsp_direction_and_position( if(ec) { *ec = DK3_ERROR_INVALID_ARGS; } } -#line 1657 "dk3xsp.ctr" +#line 1848 "dk3xsp.ctr" return back; } |