31 #pragma warning(disable:4244) // Conversion warnings
39 #define f(xc, yc) ((xc - factor*yc)*(xc - factor*yc))
41 #define g(oldyc, yc, oldxc, xc) (factor*factor*(oldyc - yc)*(oldyc - yc)/(abs(oldxc - xc) + 1))
45 fprintf (stderr,
"%s", s);
59 int i, z, j, matchflag;
65 F = (
float **) calloc (n,
sizeof (
float *));
66 ymin = (
int **) calloc (n,
sizeof (
int *));
70 for (i = 0; i < n; i++) {
71 F[i] = (
float *) calloc (ymax - n + i + 1,
sizeof (
float));
72 ymin[i] = (
int *) calloc (ymax - n + i + 1,
sizeof (
int));
73 if ((F[i] ==
NULL) || (ymin[i] ==
NULL))
77 F[0][0] =
f (x[0], 0);
80 while ((j < oldn) && (oldx[j] < x[0]))
84 else if ((j - 2 >= 0) && ((x[0] - oldx[j - 2]) < (oldx[j] - x[0])))
86 if (abs (oldx[j] - x[0]) < factor) {
88 F[0][0] +=
g (oldy[j], 0, oldx[j], x[0]);
94 for (z = 1; z < ymax - n + 1; z++) {
99 fz +=
g (oldy[j], z, oldx[j], x[0]);
100 if (fz < F[0][z - 1]) {
105 F[0][z] = F[0][z - 1];
106 ymin[0][z] = ymin[0][z - 1];
110 for (i = 1; i < n; i++) {
111 F[i][i] =
f (x[i], i) + F[i - 1][i - 1];
117 while ((j < oldn) && (oldx[j] < x[i]))
121 else if ((j - 2 >= 0) && ((x[i] - oldx[j - 2]) < (oldx[j] - x[i])))
123 if (abs (oldx[j] - x[i]) < factor) {
125 F[i][i] +=
g (oldy[j], i, oldx[j], x[i]);
130 for (z = i + 1; z < ymax - n + i + 1; z++) {
131 fz =
f (x[i], z) + F[i - 1][z - 1];
134 fz +=
g (oldy[j], z, oldx[j], x[i]);
135 if (fz < F[i][z - 1]) {
140 F[i][z] = F[i][z - 1];
141 ymin[i][z] = ymin[i][z - 1];
146 y[n - 1] = ymin[n - 1][ymax - 1];
147 for (i = n - 2; i >= 0; i--)
148 y[i] = ymin[i][y[i + 1] - 1];
150 for (i = 0; i < n; i++) {