29#define EPSILON 2 * FLT_MIN
36float catmull_rom_val(
int n,
float x[],
float xval,
float y[],
float tangents[]);
42float (*
spline_val[])(int,
float[], float,
float[],
float[])
104 for(
int i = 0; i < n; i++)
106 if(a[1 + i * 3] == 0.0E+00)
111 float *x = (
float *)calloc(n,
sizeof(
float));
114 for(
int i = 0; i < n; i++)
119 for(
int i = 1; i < n; i++)
121 const float xmult = a[2 + (i - 1) * 3] / a[1 + (i - 1) * 3];
122 a[1 + i * 3] = a[1 + i * 3] - xmult * a[0 + i * 3];
123 x[i] = x[i] - xmult * x[i - 1];
126 x[n - 1] = x[n - 1] / a[1 + (n - 1) * 3];
127 for(
int i = n - 2; 0 <= i; i--)
129 x[i] = (x[i] - a[0 + (i + 1) * 3] * x[i + 1]) / a[1 + i * 3];
259 for(
int i = 0; i < n - 1; i++)
269 float *a = (
float *)calloc(3 * n,
sizeof(
float));
271 float *b = (
float *)calloc(n,
sizeof(
float));
279 a[1 + 0 * 3] = 1.0E+00;
280 a[0 + 1 * 3] = -1.0E+00;
284 b[0] = (y[1] - y[0]) / (t[1] - t[0]) - ybcbeg;
285 a[1 + 0 * 3] = (t[1] - t[0]) / 3.0E+00;
286 a[0 + 1 * 3] = (t[1] - t[0]) / 6.0E+00;
291 a[1 + 0 * 3] = 1.0E+00;
292 a[0 + 1 * 3] = 0.0E+00;
305 for(
int i = 1; i < n - 1; i++)
307 b[i] = (y[i + 1] - y[i]) / (t[i + 1] - t[i]) - (y[i] - y[i - 1]) / (t[i] - t[i - 1]);
308 a[2 + (i - 1) * 3] = (t[i] - t[i - 1]) / 6.0E+00;
309 a[1 + i * 3] = (t[i + 1] - t[i - 1]) / 3.0E+00;
310 a[0 + (i + 1) * 3] = (t[i + 1] - t[i]) / 6.0E+00;
318 a[2 + (n - 2) * 3] = -1.0E+00;
319 a[1 + (n - 1) * 3] = 1.0E+00;
323 b[n - 1] = ybcend - (y[n - 1] - y[n - 2]) / (t[n - 1] - t[n - 2]);
324 a[2 + (n - 2) * 3] = (t[n - 1] - t[n - 2]) / 6.0E+00;
325 a[1 + (n - 1) * 3] = (t[n - 1] - t[n - 2]) / 3.0E+00;
330 a[2 + (n - 2) * 3] = 0.0E+00;
331 a[1 + (n - 1) * 3] = 1.0E+00;
346 if(n == 2 && ibcbeg == 0 && ibcend == 0)
348 ypp = (
float *)calloc(2,
sizeof(
float));
403 for(
int i = 0; i < n - 1; i++)
414 float *delta = (
float *)calloc(n,
sizeof(
float));
416 float *
m = (
float *)calloc(n + 1,
sizeof(
float));
419 for(
int i = 0; i < n - 1; i++)
421 delta[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
423 delta[n - 1] = delta[n - 2];
426 m[n - 1] = delta[n - 1];
428 for(
int i = 1; i < n - 1; i++)
430 m[i] = (delta[i - 1] + delta[i]) * .5f;
432 for(
int i = 0; i < n; i++)
441 const float alpha =
m[i] / delta[i];
442 const float beta =
m[i + 1] / delta[i];
443 const float tau = alpha * alpha + beta * beta;
446 m[i] = 3.0f * alpha * delta[i] / sqrtf(tau);
447 m[i + 1] = 3.0f * beta * delta[i] / sqrtf(tau);
477 for(
int i = 0; i < n - 1; i++)
488 float *
m = (
float *)calloc(n,
sizeof(
float));
492 m[0] = (y[1] - y[0]) / (x[1] - x[0]);
493 for(
int i = 1; i < n - 1; i++)
495 m[i] = (y[i + 1] - y[i - 1]) / (x[i + 1] - x[i - 1]);
497 m[n - 1] = (y[n - 1] - y[n - 2]) / (x[n - 1] - x[n - 2]);
533 for(
int i = 0; i < n - 2; i++)
542 const float m0 = tangents[ival];
543 const float m1 = tangents[ival + 1];
548 const float h = x[ival + 1] - x[ival];
549 const float dx = (xval - x[ival]) / h;
550 const float dx2 = dx * dx;
551 const float dx3 = dx * dx2;
553 const float h00 = (2.0 * dx3) - (3.0 * dx2) + 1.0;
554 const float h10 = (1.0 * dx3) - (2.0 * dx2) + dx;
555 const float h01 = (-2.0 * dx3) + (3.0 * dx2);
556 const float h11 = (1.0 * dx3) - (1.0 * dx2);
558 return (h00 * y[ival]) + (h10 * h * m0) + (h01 * y[ival + 1]) + (h11 * h * m1);
626 for(
int i = 0; i < n - 1; i++)
638 const float dt = tval - t[ival];
639 const float h = t[ival + 1] - t[ival];
641 const float yval = y[ival]
642 + dt * ((y[ival + 1] - y[ival]) / h - (ypp[ival + 1] / 6.0E+00 + ypp[ival] / 3.0E+00) * h
643 + dt * (0.5E+00 * ypp[ival] + dt * ((ypp[ival + 1] - ypp[ival]) / (6.0E+00 * h))));
699 const int firstPointY = y[0] * (sample->
m_outputRes - 1);
700 const int lastPointX = x[n - 1] * (sample->
m_samplingRes - 1);
701 const int lastPointY = y[n - 1] * (sample->
m_outputRes - 1);
722 else if(i > lastPointX)
730 if(val > maxY) val = maxY;
731 if(val < minY) val = minY;
#define m
Definition basecurve.c:231
float x
Definition curve_tools.h:51
float y
Definition curve_tools.h:52
Definition curve_tools.h:56
CurveAnchorPoint m_anchors[20]
Definition curve_tools.h:71
float m_min_x
Definition curve_tools.h:61
float m_max_x
Definition curve_tools.h:62
unsigned char m_numAnchors
Definition curve_tools.h:67
unsigned int m_spline_type
Definition curve_tools.h:58
float m_max_y
Definition curve_tools.h:64
float m_min_y
Definition curve_tools.h:63
Definition curve_tools.h:76
unsigned int m_outputRes
Definition curve_tools.h:79
unsigned int m_samplingRes
Definition curve_tools.h:78
unsigned short int * m_Samples
Definition curve_tools.h:82