34 #include <cxmessages.h>
48 inline static cxdouble
49 _giraffe_chebyshev2d_eval(cxdouble ax, cxdouble bx, cxdouble ay, cxdouble by,
50 const cpl_matrix* coeffs, cxdouble x, cxdouble y)
57 const cxdouble* _coeffs = NULL;
59 cxdouble x_n = (2.0 * x - ax - bx) / (bx - ax);
60 cxdouble y_n = (2.0 * y - ay - by) / (by - ay);
66 cx_assert(coeffs != NULL);
68 xorder = cpl_matrix_get_nrow(coeffs);
69 yorder = cpl_matrix_get_ncol(coeffs);
71 _coeffs = cpl_matrix_get_data_const(coeffs);
72 cx_assert(_coeffs != NULL);
74 for (i = 0, k = 0; i < xorder; i++) {
78 register cxdouble cx2 = 0.;
79 register cxdouble cy0 = 1.0;
80 register cxdouble cy1 = y_n;
87 cx2 = 2.0 * cx1 * x_n - cx0;
90 for (j = 0; j < yorder; j++) {
98 cy2 = 2.0 * cy1 * y_n - cy0;
101 sum += cx2 * cy2 * _coeffs[k++];
119 giraffe_interpolate_linear(cxdouble x, cxdouble x_0, cxdouble y_0,
120 cxdouble x_1, cxdouble y_1)
123 register cxdouble t = (x - x_0) / (x_1 - x_0);
125 return (1. - t) * y_0 + t * y_1;
145 giraffe_chebyshev_base1d(cxdouble start, cxdouble size, cxint order,
149 register cxint32 i, j, x_nrow, t_ncol;
151 register cxdouble xn, dsize2, d2size;
155 cpl_matrix *m_t = NULL;
165 x_nrow = cpl_matrix_get_nrow(m_x);
167 m_t = cpl_matrix_new(order, x_nrow);
175 pmx = cpl_matrix_get_data(m_x);
176 pmt = cpl_matrix_get_data(m_t);
183 for (j = 0; j < t_ncol; j++) {
190 xn = (pmx[j] - start - dsize2) * d2size;
208 for (i = 2; i < order; i++) {
215 pmt[j+i*t_ncol] = 2.0 * xn * pmt[j+(i-1)*t_ncol] -
247 giraffe_chebyshev_base2d(cxdouble xstart, cxdouble ystart, cxdouble xsize,
248 cxdouble ysize, cxint xorder, cxint yorder,
249 cpl_matrix *m_x, cpl_matrix *m_y)
252 register cxint32 i, j, k, l;
254 cxint32 x_nrow, y_nrow, t_nrow, t_ncol;
256 register cxdouble dxsize2, d2xsize;
257 register cxdouble dysize2, d2ysize;
258 register cxdouble x_n, y_n;
259 register cxdouble bx0, bx1, bx2, by0, by1, by2;
261 cxdouble *pmx, *pmy, *pmt;
263 cpl_matrix *m_t = NULL;
270 dxsize2 = xsize / 2.0;
271 d2xsize = 2.0 / xsize;
272 dysize2 = ysize / 2.0;
273 d2ysize = 2.0 / ysize;
275 x_nrow = cpl_matrix_get_nrow(m_x);
276 y_nrow = cpl_matrix_get_nrow(m_y);
278 if (x_nrow != y_nrow) {
282 m_t = cpl_matrix_new(xorder * yorder, x_nrow);
288 t_nrow = cpl_matrix_get_nrow(m_t);
289 t_ncol = cpl_matrix_get_ncol(m_t);
291 pmx = cpl_matrix_get_data(m_x);
292 pmy = cpl_matrix_get_data(m_y);
293 pmt = cpl_matrix_get_data(m_t);
300 for (j = 0; j < t_ncol; j++) {
307 x_n = (pmx[j] - xstart - dxsize2) * d2xsize;
308 y_n = (pmy[j] - ystart - dysize2) * d2ysize;
313 for (l = 0,i = 0; i < xorder; i++) {
319 bx2 = 2.0 * bx1 * x_n - bx0;
325 for (k = 0; k < yorder; k++) {
331 by2 = 2.0 * by1 * y_n - by0;
334 pmt[j + (l++) * t_ncol] = bx2 * by2;
371 giraffe_chebyshev_base2dt(cxdouble xstart, cxdouble ystart, cxdouble xsize,
372 cxdouble ysize, cxint xorder, cxint yorder,
373 cpl_matrix *m_x, cpl_matrix *m_y)
376 register cxint32 i, j, k, l;
378 cxint32 x_nrow, y_nrow, t_nrow, t_ncol;
380 register cxdouble dxsize2, d2xsize;
381 register cxdouble dysize2, d2ysize;
382 register cxdouble x_n, y_n;
383 register cxdouble bx0, bx1, bx2, by0, by1, by2;
385 cxdouble *pmx, *pmy, *pmt;
387 cpl_matrix *m_t = NULL;
394 dxsize2 = xsize / 2.0;
395 d2xsize = 2.0 / xsize;
396 dysize2 = ysize / 2.0;
397 d2ysize = 2.0 / ysize;
399 x_nrow = cpl_matrix_get_nrow(m_x);
400 y_nrow = cpl_matrix_get_nrow(m_y);
402 if (x_nrow != y_nrow) {
406 m_t = cpl_matrix_new(x_nrow, xorder * yorder);
412 t_nrow = cpl_matrix_get_nrow(m_t);
413 t_ncol = cpl_matrix_get_ncol(m_t);
415 pmx = cpl_matrix_get_data(m_x);
416 pmy = cpl_matrix_get_data(m_y);
417 pmt = cpl_matrix_get_data(m_t);
424 for (j = 0; j < t_nrow; j++) {
431 x_n = (pmx[j] - xstart - dxsize2) * d2xsize;
432 y_n = (pmy[j] - ystart - dysize2) * d2ysize;
437 for (l = 0, i = 0; i < xorder; i++) {
443 bx2 = 2.0 * bx1 * x_n - bx0;
449 for (k = 0; k < yorder; k++) {
455 by2 = 2.0 * by1 * y_n - by0;
458 pmt[j * t_ncol + (l++)] = bx2 * by2;
490 giraffe_chebyshev_fit1d(cxdouble start, cxdouble size, cpl_matrix *m_c,
494 register cxint32 i, j, jj, order;
496 cxint32 x_nrow, c_nrow, c_ncol, t_nrow, t_ncol;
498 register cxdouble xn;
499 register cxdouble dsize2, d2size;
500 register cxdouble *f0 = NULL;
501 register cxdouble *t0 = NULL;
502 register cxdouble *c0 = NULL;
504 cxdouble *pmc, *pmx, *pmt, *pmf;
517 c_nrow = cpl_matrix_get_nrow(m_c);
518 c_ncol = cpl_matrix_get_ncol(m_c);
519 x_nrow = cpl_matrix_get_nrow(m_x);
522 m_t = cpl_matrix_new(x_nrow, order);
528 m_f = cpl_matrix_new(c_nrow, x_nrow);
534 t_nrow = cpl_matrix_get_nrow(m_t);
535 t_ncol = cpl_matrix_get_ncol(m_t);
537 pmc = cpl_matrix_get_data(m_c);
538 pmx = cpl_matrix_get_data(m_x);
539 pmt = cpl_matrix_get_data(m_t);
540 pmf = cpl_matrix_get_data(m_f);
547 for (j = 0; j < t_nrow; j++) {
554 xn = (pmx[j] - start - dsize2) * d2size;
574 for (i = 2; i < order; i++) {
581 pmt[jj + i] = 2.0 * xn * pmt[jj + (i - 1)] - pmt[jj + (i - 2)];
586 for (i = 0, f0 = pmf ; i < c_nrow; i++) {
587 for (j = 0, t0 = pmt; j < t_nrow; j++, f0++) {
588 for (jj = 0, *f0 = 0, c0 = pmc + i * c_ncol; jj < c_ncol; jj++) {
589 *f0 += *c0++ * *t0++;
594 cpl_matrix_delete(m_t);
619 giraffe_chebyshev_fit2d(cxdouble xstart, cxdouble ystart, cxdouble xsize,
620 cxdouble ysize,
const cpl_matrix* m_c,
621 const cpl_matrix* m_x,
const cpl_matrix* m_y)
627 const cxdouble* _x = NULL;
628 const cxdouble* _y = NULL;
630 cxdouble bx = xstart + xsize;
631 cxdouble by = ystart + ysize;
633 cpl_matrix *f = NULL;
636 if (m_c == NULL || m_x == NULL || m_y == NULL) {
640 nx = cpl_matrix_get_nrow(m_x);
642 if (nx != cpl_matrix_get_nrow(m_y)) {
646 f = cpl_matrix_new(nx, 1);
652 _x = cpl_matrix_get_data_const(m_x);
653 _y = cpl_matrix_get_data_const(m_y);
656 for (i = 0; i < nx; i++) {
658 cxdouble sum = _giraffe_chebyshev2d_eval(xstart, bx, ystart, by,
660 cpl_matrix_set(f, i, 0, sum);
669 #define SWAP(a,b) {swap=(a);(a)=(b);(b)=swap;}
699 giraffe_gauss_jordan(
706 cxint *indxc, *indxr, *ipiv;
707 register cxint i, icol = 0, irow = 0, j, jj, k, l, ll;
708 register cxdouble big, dum, pivinv, swap;
710 cxdouble *pd_mA = NULL, *pd_mB = NULL;
713 pd_mA = cpl_matrix_get_data(mA);
714 pd_mB = cpl_matrix_get_data(mB);
715 nr_mA = cpl_matrix_get_nrow(mA);
716 nr_mB = cpl_matrix_get_nrow(mB);
718 indxc = (cxint *) cx_calloc(n,
sizeof(cxint));
719 indxr = (cxint *) cx_calloc(n,
sizeof(cxint));
720 ipiv = (cxint *) cx_calloc(n,
sizeof(cxint));
722 for (i = 0; i < n; i++) {
725 for (j = 0; j < n; j++) {
729 for (k = 0; k < n; k++) {
731 if (fabs(pd_mA[jj + k]) >= big) {
732 big = fabs(pd_mA[jj + k]);
736 }
else if (ipiv[k] > 1) {
737 cx_free((cxptr) ipiv);
738 cx_free((cxptr) indxr);
739 cx_free((cxptr) indxc);
755 for (l = 0; l < n; l++) {
756 SWAP(pd_mA[irow * nr_mA + l], pd_mA[icol * nr_mA + l])
758 for (l = 0; l < m; l++) {
759 SWAP(pd_mB[irow * nr_mB + l], pd_mB[icol * nr_mB + l])
766 if (pd_mA[icol * nr_mA + icol] == 0.0) {
767 cx_free((cxptr) ipiv);
768 cx_free((cxptr) indxr);
769 cx_free((cxptr) indxc);
775 pivinv = 1.0 / pd_mA[icol * nr_mA + icol];
776 pd_mA[icol * nr_mA + icol] = 1.0;
778 for (l = 0; l < n; l++) {
779 pd_mA[icol * nr_mA + l] *= pivinv;
782 for (l = 0; l < m; l++) {
783 pd_mB[icol * nr_mB + l] *= pivinv;
786 for (ll = 0; ll < n; ll++) {
789 dum = pd_mA[ll * nr_mA + icol];
790 pd_mA[ll * nr_mA + icol] = 0.0;
792 for (l = 0; l < n; l++) {
793 pd_mA[ll * nr_mA + l] -= pd_mA[icol * nr_mA + l] * dum;
796 for (l = 0; l < m; l++) {
797 pd_mB[ll * nr_mB + l] -= pd_mB[icol * nr_mB + l] * dum;
803 cx_free((cxptr) ipiv);
806 for (l = (n-1); l >= 0; l--) {
807 if (indxr[l] != indxc[l]) {
808 for (k = 0; k < n; k++) {
809 SWAP(pd_mA[k * nr_mA + indxr[l]], pd_mA[k * nr_mA + indxc[l]]);
813 cx_free((cxptr)indxr);
814 cx_free((cxptr)indxc);
849 giraffe_compute_image_coordinates(
856 register cxlong i, j, k;
857 register cxdouble *pd_mXi = NULL, *pd_mYi = NULL;
859 if ((mXi != NULL) && (mYi != NULL)) {
861 pd_mXi = cpl_matrix_get_data(mXi);
862 pd_mYi = cpl_matrix_get_data(mYi);
864 for (j = 0; j < nx; j++) {
865 for (k = 0; k < ny; k++) {
867 pd_mXi[i] = (cxdouble) j;
868 pd_mYi[i] = (cxdouble) k;
871 }
else if (mXi != NULL) {
873 pd_mXi = cpl_matrix_get_data(mXi);
875 for (j = 0; j < nx; j++) {
876 for (k = 0; k < ny; k++) {
878 pd_mXi[i] = (cxdouble) j;
881 }
else if (mYi != NULL) {
883 pd_mYi = cpl_matrix_get_data(mYi);
885 for (j = 0; j < nx; j++) {
886 for (k = 0; k < ny; k++) {
888 pd_mYi[i] = (cxdouble) k;