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_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);
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);
531 cpl_matrix_delete(m_t);
535 t_nrow = cpl_matrix_get_nrow(m_t);
536 t_ncol = cpl_matrix_get_ncol(m_t);
538 pmc = cpl_matrix_get_data(m_c);
539 pmx = cpl_matrix_get_data(m_x);
540 pmt = cpl_matrix_get_data(m_t);
541 pmf = cpl_matrix_get_data(m_f);
548 for (j = 0; j < t_nrow; j++) {
555 xn = (pmx[j] - start - dsize2) * d2size;
575 for (i = 2; i < order; i++) {
582 pmt[jj + i] = 2.0 * xn * pmt[jj + (i - 1)] - pmt[jj + (i - 2)];
587 for (i = 0, f0 = pmf ; i < c_nrow; i++) {
588 for (j = 0, t0 = pmt; j < t_nrow; j++, f0++) {
589 for (jj = 0, *f0 = 0, c0 = pmc + i * c_ncol; jj < c_ncol; jj++) {
590 *f0 += *c0++ * *t0++;
595 cpl_matrix_delete(m_t);
620 giraffe_chebyshev_fit2d(cxdouble xstart, cxdouble ystart, cxdouble xsize,
621 cxdouble ysize,
const cpl_matrix* m_c,
622 const cpl_matrix* m_x,
const cpl_matrix* m_y)
628 const cxdouble* _x = NULL;
629 const cxdouble* _y = NULL;
631 cxdouble bx = xstart + xsize;
632 cxdouble by = ystart + ysize;
634 cpl_matrix *f = NULL;
637 if (m_c == NULL || m_x == NULL || m_y == NULL) {
641 nx = cpl_matrix_get_nrow(m_x);
643 if (nx != cpl_matrix_get_nrow(m_y)) {
647 f = cpl_matrix_new(nx, 1);
653 _x = cpl_matrix_get_data_const(m_x);
654 _y = cpl_matrix_get_data_const(m_y);
657 for (i = 0; i < nx; i++) {
659 cxdouble sum = _giraffe_chebyshev2d_eval(xstart, bx, ystart, by,
661 cpl_matrix_set(f, i, 0, sum);
670 #define SWAP(a,b) {swap=(a);(a)=(b);(b)=swap;}
700 giraffe_gauss_jordan(
707 cxint *indxc, *indxr, *ipiv;
708 register cxint i, icol = 0, irow = 0, j, jj, k, l, ll;
709 register cxdouble big, dum, pivinv, swap;
711 cxdouble *pd_mA = NULL, *pd_mB = NULL;
714 pd_mA = cpl_matrix_get_data(mA);
715 pd_mB = cpl_matrix_get_data(mB);
716 nr_mA = cpl_matrix_get_nrow(mA);
717 nr_mB = cpl_matrix_get_nrow(mB);
719 indxc = (cxint *) cx_calloc(n,
sizeof(cxint));
720 indxr = (cxint *) cx_calloc(n,
sizeof(cxint));
721 ipiv = (cxint *) cx_calloc(n,
sizeof(cxint));
723 for (i = 0; i < n; i++) {
726 for (j = 0; j < n; j++) {
730 for (k = 0; k < n; k++) {
732 if (fabs(pd_mA[jj + k]) >= big) {
733 big = fabs(pd_mA[jj + k]);
737 }
else if (ipiv[k] > 1) {
738 cx_free((cxptr) ipiv);
739 cx_free((cxptr) indxr);
740 cx_free((cxptr) indxc);
756 for (l = 0; l < n; l++) {
757 SWAP(pd_mA[irow * nr_mA + l], pd_mA[icol * nr_mA + l])
759 for (l = 0; l < m; l++) {
760 SWAP(pd_mB[irow * nr_mB + l], pd_mB[icol * nr_mB + l])
767 if (pd_mA[icol * nr_mA + icol] == 0.0) {
768 cx_free((cxptr) ipiv);
769 cx_free((cxptr) indxr);
770 cx_free((cxptr) indxc);
776 pivinv = 1.0 / pd_mA[icol * nr_mA + icol];
777 pd_mA[icol * nr_mA + icol] = 1.0;
779 for (l = 0; l < n; l++) {
780 pd_mA[icol * nr_mA + l] *= pivinv;
783 for (l = 0; l < m; l++) {
784 pd_mB[icol * nr_mB + l] *= pivinv;
787 for (ll = 0; ll < n; ll++) {
790 dum = pd_mA[ll * nr_mA + icol];
791 pd_mA[ll * nr_mA + icol] = 0.0;
793 for (l = 0; l < n; l++) {
794 pd_mA[ll * nr_mA + l] -= pd_mA[icol * nr_mA + l] * dum;
797 for (l = 0; l < m; l++) {
798 pd_mB[ll * nr_mB + l] -= pd_mB[icol * nr_mB + l] * dum;
804 cx_free((cxptr) ipiv);
807 for (l = (n-1); l >= 0; l--) {
808 if (indxr[l] != indxc[l]) {
809 for (k = 0; k < n; k++) {
810 SWAP(pd_mA[k * nr_mA + indxr[l]], pd_mA[k * nr_mA + indxc[l]]);
814 cx_free((cxptr)indxr);
815 cx_free((cxptr)indxc);
850 giraffe_compute_image_coordinates(
857 register cxlong i, j, k;
858 register cxdouble *pd_mXi = NULL, *pd_mYi = NULL;
860 if ((mXi != NULL) && (mYi != NULL)) {
862 pd_mXi = cpl_matrix_get_data(mXi);
863 pd_mYi = cpl_matrix_get_data(mYi);
865 for (j = 0; j < nx; j++) {
866 for (k = 0; k < ny; k++) {
868 pd_mXi[i] = (cxdouble) j;
869 pd_mYi[i] = (cxdouble) k;
872 }
else if (mXi != NULL) {
874 pd_mXi = cpl_matrix_get_data(mXi);
876 for (j = 0; j < nx; j++) {
877 for (k = 0; k < ny; k++) {
879 pd_mXi[i] = (cxdouble) j;
882 }
else if (mYi != NULL) {
884 pd_mYi = cpl_matrix_get_data(mYi);
886 for (j = 0; j < nx; j++) {
887 for (k = 0; k < ny; k++) {
889 pd_mYi[i] = (cxdouble) k;