42#define EPSILON 2 * FLT_MIN
55float (*
spline_val[])(int,
float[], float,
float[],
float[])
117 for(
int i = 0;
i <
n;
i++)
119 if(a[1 +
i * 3] == 0.0E+00)
124 float *
x = (
float *)calloc(
n,
sizeof(
float));
127 for(
int i = 0;
i <
n;
i++)
132 for(
int i = 1;
i <
n;
i++)
134 const float xmult = a[2 + (
i - 1) * 3] / a[1 + (
i - 1) * 3];
135 a[1 +
i * 3] = a[1 +
i * 3] - xmult * a[0 +
i * 3];
136 x[
i] =
x[
i] - xmult *
x[
i - 1];
139 x[
n - 1] =
x[
n - 1] / a[1 + (
n - 1) * 3];
140 for(
int i =
n - 2; 0 <=
i;
i--)
142 x[
i] = (
x[
i] - a[0 + (
i + 1) * 3] *
x[
i + 1]) / a[1 +
i * 3];
272 for(
int i = 0;
i <
n - 1;
i++)
282 float *a = (
float *)calloc(3 *
n,
sizeof(
float));
284 float *b = (
float *)calloc(
n,
sizeof(
float));
292 a[1 + 0 * 3] = 1.0E+00;
293 a[0 + 1 * 3] = -1.0E+00;
297 b[0] = (y[1] - y[0]) / (
t[1] -
t[0]) - ybcbeg;
298 a[1 + 0 * 3] = (
t[1] -
t[0]) / 3.0E+00;
299 a[0 + 1 * 3] = (
t[1] -
t[0]) / 6.0E+00;
304 a[1 + 0 * 3] = 1.0E+00;
305 a[0 + 1 * 3] = 0.0E+00;
318 for(
int i = 1;
i <
n - 1;
i++)
320 b[
i] = (y[
i + 1] - y[
i]) / (
t[
i + 1] -
t[
i]) - (y[
i] - y[
i - 1]) / (
t[
i] -
t[
i - 1]);
321 a[2 + (
i - 1) * 3] = (
t[
i] -
t[
i - 1]) / 6.0E+00;
322 a[1 +
i * 3] = (
t[
i + 1] -
t[
i - 1]) / 3.0E+00;
323 a[0 + (
i + 1) * 3] = (
t[
i + 1] -
t[
i]) / 6.0E+00;
331 a[2 + (
n - 2) * 3] = -1.0E+00;
332 a[1 + (
n - 1) * 3] = 1.0E+00;
336 b[
n - 1] = ybcend - (y[
n - 1] - y[
n - 2]) / (
t[
n - 1] -
t[
n - 2]);
337 a[2 + (
n - 2) * 3] = (
t[
n - 1] -
t[
n - 2]) / 6.0E+00;
338 a[1 + (
n - 1) * 3] = (
t[
n - 1] -
t[
n - 2]) / 3.0E+00;
343 a[2 + (
n - 2) * 3] = 0.0E+00;
344 a[1 + (
n - 1) * 3] = 1.0E+00;
359 if(
n == 2 && ibcbeg == 0 && ibcend == 0)
361 ypp = (
float *)calloc(2,
sizeof(
float));
416 for(
int i = 0;
i <
n - 1;
i++)
427 float *
delta = (
float *)calloc(
n,
sizeof(
float));
429 float *
m = (
float *)calloc(
n + 1,
sizeof(
float));
432 for(
int i = 0;
i <
n - 1;
i++)
441 for(
int i = 1;
i <
n - 1;
i++)
445 for(
int i = 0;
i <
n;
i++)
454 const float alpha =
m[
i] /
delta[
i];
455 const float beta =
m[
i + 1] /
delta[
i];
456 const float tau = alpha * alpha + beta * beta;
459 m[
i] = 3.0f * alpha *
delta[
i] / sqrtf(tau);
460 m[
i + 1] = 3.0f * beta *
delta[
i] / sqrtf(tau);
490 for(
int i = 0;
i <
n - 1;
i++)
501 float *
m = (
float *)calloc(
n,
sizeof(
float));
505 m[0] = (y[1] - y[0]) / (
x[1] -
x[0]);
506 for(
int i = 1;
i <
n - 1;
i++)
508 m[
i] = (y[
i + 1] - y[
i - 1]) / (
x[
i + 1] -
x[
i - 1]);
510 m[
n - 1] = (y[
n - 1] - y[
n - 2]) / (
x[
n - 1] -
x[
n - 2]);
546 for(
int i = 0;
i <
n - 2;
i++)
555 const float m0 = tangents[ival];
556 const float m1 = tangents[ival + 1];
561 const float h =
x[ival + 1] -
x[ival];
562 const float dx = (xval -
x[ival]) / h;
563 const float dx2 = dx * dx;
564 const float dx3 = dx * dx2;
566 const float h00 = (2.0 * dx3) - (3.0 * dx2) + 1.0;
567 const float h10 = (1.0 * dx3) - (2.0 * dx2) + dx;
568 const float h01 = (-2.0 * dx3) + (3.0 * dx2);
569 const float h11 = (1.0 * dx3) - (1.0 * dx2);
571 return (h00 * y[ival]) + (h10 * h * m0) + (h01 * y[ival + 1]) + (h11 * h * m1);
639 for(
int i = 0;
i <
n - 1;
i++)
651 const float dt = tval -
t[ival];
652 const float h =
t[ival + 1] -
t[ival];
654 const float yval = y[ival]
655 + dt * ((y[ival + 1] - y[ival]) / h - (ypp[ival + 1] / 6.0E+00 + ypp[ival] / 3.0E+00) * h
656 + dt * (0.5E+00 * ypp[ival] + dt * ((ypp[ival + 1] - ypp[ival]) / (6.0E+00 * h))));
712 const int firstPointY = y[0] * (sample->
m_outputRes - 1);
714 const int lastPointY = y[
n - 1] * (sample->
m_outputRes - 1);
735 else if(
i > lastPointX)
743 if(val > maxY) val = maxY;
744 if(val < minY) val = minY;
_lib_location_type_t type
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
CurveAnchorPoint m_anchors[20]
unsigned char m_numAnchors
unsigned int m_spline_type
unsigned int m_samplingRes
unsigned short int * m_Samples