summaryrefslogtreecommitdiff
path: root/support/dktools/dk3xsp.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
committerNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
commit1f457376b478257b88d4a857f5ec1b6155442dd7 (patch)
tree2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/dk3xsp.c
parentac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff)
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/dk3xsp.c')
-rw-r--r--support/dktools/dk3xsp.c536
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;
}