27 #include <cxmessages.h>
41 inline static cxdouble
42 _giraffe_chebyshev2d_eval(cxdouble ax, cxdouble bx, cxdouble ay, cxdouble by,
43 const cpl_matrix* coeffs, cxdouble x, cxdouble y)
50 const cxdouble* _coeffs = NULL;
52 cxdouble x_n = (2.0 * x - ax - bx) / (bx - ax);
53 cxdouble y_n = (2.0 * y - ay - by) / (by - ay);
59 cx_assert(coeffs != NULL);
61 xorder = cpl_matrix_get_nrow(coeffs);
62 yorder = cpl_matrix_get_ncol(coeffs);
64 _coeffs = cpl_matrix_get_data_const(coeffs);
65 cx_assert(_coeffs != NULL);
67 for (i = 0, k = 0; i < xorder; i++) {
71 register cxdouble cx2 = 0.;
72 register cxdouble cy0 = 1.0;
73 register cxdouble cy1 = y_n;
80 cx2 = 2.0 * cx1 * x_n - cx0;
83 for (j = 0; j < yorder; j++) {
91 cy2 = 2.0 * cy1 * y_n - cy0;
94 sum += cx2 * cy2 * _coeffs[k++];
112 giraffe_interpolate_linear(cxdouble x, cxdouble x_0, cxdouble y_0,
113 cxdouble x_1, cxdouble y_1)
116 register cxdouble t = (x - x_0) / (x_1 - x_0);
118 return (1. - t) * y_0 + t * y_1;
138 giraffe_chebyshev_base1d(cxdouble start, cxdouble size, cxint order,
142 register cxint32 i, j, x_nrow, t_ncol;
144 register cxdouble xn, dsize2, d2size;
148 cpl_matrix *m_t = NULL;
158 x_nrow = cpl_matrix_get_nrow(m_x);
160 m_t = cpl_matrix_new(order, x_nrow);
168 pmx = cpl_matrix_get_data(m_x);
169 pmt = cpl_matrix_get_data(m_t);
176 for (j = 0; j < t_ncol; j++) {
183 xn = (pmx[j] - start - dsize2) * d2size;
201 for (i = 2; i < order; i++) {
208 pmt[j+i*t_ncol] = 2.0 * xn * pmt[j+(i-1)*t_ncol] -
240 giraffe_chebyshev_base2d(cxdouble xstart, cxdouble ystart, cxdouble xsize,
241 cxdouble ysize, cxint xorder, cxint yorder,
242 cpl_matrix *m_x, cpl_matrix *m_y)
245 register cxint32 i, j, k, l;
247 cxint32 x_nrow, y_nrow, t_ncol;
249 register cxdouble dxsize2, d2xsize;
250 register cxdouble dysize2, d2ysize;
251 register cxdouble x_n, y_n;
252 register cxdouble bx0, bx1, bx2, by0, by1, by2;
254 cxdouble *pmx, *pmy, *pmt;
256 cpl_matrix *m_t = NULL;
263 dxsize2 = xsize / 2.0;
264 d2xsize = 2.0 / xsize;
265 dysize2 = ysize / 2.0;
266 d2ysize = 2.0 / ysize;
268 x_nrow = cpl_matrix_get_nrow(m_x);
269 y_nrow = cpl_matrix_get_nrow(m_y);
271 if (x_nrow != y_nrow) {
275 m_t = cpl_matrix_new(xorder * yorder, x_nrow);
282 t_ncol = cpl_matrix_get_ncol(m_t);
284 pmx = cpl_matrix_get_data(m_x);
285 pmy = cpl_matrix_get_data(m_y);
286 pmt = cpl_matrix_get_data(m_t);
293 for (j = 0; j < t_ncol; j++) {
300 x_n = (pmx[j] - xstart - dxsize2) * d2xsize;
301 y_n = (pmy[j] - ystart - dysize2) * d2ysize;
306 for (l = 0,i = 0; i < xorder; i++) {
312 bx2 = 2.0 * bx1 * x_n - bx0;
318 for (k = 0; k < yorder; k++) {
324 by2 = 2.0 * by1 * y_n - by0;
327 pmt[j + (l++) * t_ncol] = bx2 * by2;
364 giraffe_chebyshev_base2dt(cxdouble xstart, cxdouble ystart, cxdouble xsize,
365 cxdouble ysize, cxint xorder, cxint yorder,
366 cpl_matrix *m_x, cpl_matrix *m_y)
369 register cxint32 i, j, k, l;
371 cxint32 x_nrow, y_nrow, t_nrow, t_ncol;
373 register cxdouble dxsize2, d2xsize;
374 register cxdouble dysize2, d2ysize;
375 register cxdouble x_n, y_n;
376 register cxdouble bx0, bx1, bx2, by0, by1, by2;
378 cxdouble *pmx, *pmy, *pmt;
380 cpl_matrix *m_t = NULL;
387 dxsize2 = xsize / 2.0;
388 d2xsize = 2.0 / xsize;
389 dysize2 = ysize / 2.0;
390 d2ysize = 2.0 / ysize;
392 x_nrow = cpl_matrix_get_nrow(m_x);
393 y_nrow = cpl_matrix_get_nrow(m_y);
395 if (x_nrow != y_nrow) {
399 m_t = cpl_matrix_new(x_nrow, xorder * yorder);
405 t_nrow = cpl_matrix_get_nrow(m_t);
406 t_ncol = cpl_matrix_get_ncol(m_t);
408 pmx = cpl_matrix_get_data(m_x);
409 pmy = cpl_matrix_get_data(m_y);
410 pmt = cpl_matrix_get_data(m_t);
417 for (j = 0; j < t_nrow; j++) {
424 x_n = (pmx[j] - xstart - dxsize2) * d2xsize;
425 y_n = (pmy[j] - ystart - dysize2) * d2ysize;
430 for (l = 0, i = 0; i < xorder; i++) {
436 bx2 = 2.0 * bx1 * x_n - bx0;
442 for (k = 0; k < yorder; k++) {
448 by2 = 2.0 * by1 * y_n - by0;
451 pmt[j * t_ncol + (l++)] = bx2 * by2;
483 giraffe_chebyshev_fit1d(cxdouble start, cxdouble size, cpl_matrix *m_c,
487 register cxint32 i, j, jj, order;
489 cxint32 x_nrow, c_nrow, c_ncol, t_nrow, t_ncol;
491 register cxdouble xn;
492 register cxdouble dsize2, d2size;
493 register cxdouble *f0 = NULL;
494 register cxdouble *t0 = NULL;
495 register cxdouble *c0 = NULL;
497 cxdouble *pmc, *pmx, *pmt, *pmf;
510 c_nrow = cpl_matrix_get_nrow(m_c);
511 c_ncol = cpl_matrix_get_ncol(m_c);
512 x_nrow = cpl_matrix_get_nrow(m_x);
515 m_t = cpl_matrix_new(x_nrow, order);
521 m_f = cpl_matrix_new(c_nrow, x_nrow);
524 cpl_matrix_delete(m_t);
528 t_nrow = cpl_matrix_get_nrow(m_t);
529 t_ncol = cpl_matrix_get_ncol(m_t);
531 pmc = cpl_matrix_get_data(m_c);
532 pmx = cpl_matrix_get_data(m_x);
533 pmt = cpl_matrix_get_data(m_t);
534 pmf = cpl_matrix_get_data(m_f);
541 for (j = 0; j < t_nrow; j++) {
548 xn = (pmx[j] - start - dsize2) * d2size;
568 for (i = 2; i < order; i++) {
575 pmt[jj + i] = 2.0 * xn * pmt[jj + (i - 1)] - pmt[jj + (i - 2)];
580 for (i = 0, f0 = pmf ; i < c_nrow; i++) {
581 for (j = 0, t0 = pmt; j < t_nrow; j++, f0++) {
582 for (jj = 0, *f0 = 0, c0 = pmc + i * c_ncol; jj < c_ncol; jj++) {
583 *f0 += *c0++ * *t0++;
588 cpl_matrix_delete(m_t);
613 giraffe_chebyshev_fit2d(cxdouble xstart, cxdouble ystart, cxdouble xsize,
614 cxdouble ysize,
const cpl_matrix* m_c,
615 const cpl_matrix* m_x,
const cpl_matrix* m_y)
621 const cxdouble* _x = NULL;
622 const cxdouble* _y = NULL;
624 cxdouble bx = xstart + xsize;
625 cxdouble by = ystart + ysize;
627 cpl_matrix *f = NULL;
630 if (m_c == NULL || m_x == NULL || m_y == NULL) {
634 nx = cpl_matrix_get_nrow(m_x);
636 if (nx != cpl_matrix_get_nrow(m_y)) {
640 f = cpl_matrix_new(nx, 1);
646 _x = cpl_matrix_get_data_const(m_x);
647 _y = cpl_matrix_get_data_const(m_y);
650 for (i = 0; i < nx; i++) {
652 cxdouble sum = _giraffe_chebyshev2d_eval(xstart, bx, ystart, by,
654 cpl_matrix_set(f, i, 0, sum);
663 #define SWAP(a,b) {swap=(a);(a)=(b);(b)=swap;}
693 giraffe_gauss_jordan(
700 cxint *indxc, *indxr, *ipiv;
701 register cxint i, icol = 0, irow = 0, j, jj, k, l, ll;
702 register cxdouble big, dum, pivinv, swap;
704 cxdouble *pd_mA = NULL, *pd_mB = NULL;
707 pd_mA = cpl_matrix_get_data(mA);
708 pd_mB = cpl_matrix_get_data(mB);
709 nr_mA = cpl_matrix_get_nrow(mA);
710 nr_mB = cpl_matrix_get_nrow(mB);
712 indxc = (cxint *) cx_calloc(n,
sizeof(cxint));
713 indxr = (cxint *) cx_calloc(n,
sizeof(cxint));
714 ipiv = (cxint *) cx_calloc(n,
sizeof(cxint));
716 for (i = 0; i < n; i++) {
719 for (j = 0; j < n; j++) {
723 for (k = 0; k < n; k++) {
725 if (fabs(pd_mA[jj + k]) >= big) {
726 big = fabs(pd_mA[jj + k]);
730 }
else if (ipiv[k] > 1) {
731 cx_free((cxptr) ipiv);
732 cx_free((cxptr) indxr);
733 cx_free((cxptr) indxc);
749 for (l = 0; l < n; l++) {
750 SWAP(pd_mA[irow * nr_mA + l], pd_mA[icol * nr_mA + l])
752 for (l = 0; l < m; l++) {
753 SWAP(pd_mB[irow * nr_mB + l], pd_mB[icol * nr_mB + l])
760 if (pd_mA[icol * nr_mA + icol] == 0.0) {
761 cx_free((cxptr) ipiv);
762 cx_free((cxptr) indxr);
763 cx_free((cxptr) indxc);
769 pivinv = 1.0 / pd_mA[icol * nr_mA + icol];
770 pd_mA[icol * nr_mA + icol] = 1.0;
772 for (l = 0; l < n; l++) {
773 pd_mA[icol * nr_mA + l] *= pivinv;
776 for (l = 0; l < m; l++) {
777 pd_mB[icol * nr_mB + l] *= pivinv;
780 for (ll = 0; ll < n; ll++) {
783 dum = pd_mA[ll * nr_mA + icol];
784 pd_mA[ll * nr_mA + icol] = 0.0;
786 for (l = 0; l < n; l++) {
787 pd_mA[ll * nr_mA + l] -= pd_mA[icol * nr_mA + l] * dum;
790 for (l = 0; l < m; l++) {
791 pd_mB[ll * nr_mB + l] -= pd_mB[icol * nr_mB + l] * dum;
797 cx_free((cxptr) ipiv);
800 for (l = (n-1); l >= 0; l--) {
801 if (indxr[l] != indxc[l]) {
802 for (k = 0; k < n; k++) {
803 SWAP(pd_mA[k * nr_mA + indxr[l]], pd_mA[k * nr_mA + indxc[l]]);
807 cx_free((cxptr)indxr);
808 cx_free((cxptr)indxc);
843 giraffe_compute_image_coordinates(
850 register cxlong i, j, k;
851 register cxdouble *pd_mXi = NULL, *pd_mYi = NULL;
853 if ((mXi != NULL) && (mYi != NULL)) {
855 pd_mXi = cpl_matrix_get_data(mXi);
856 pd_mYi = cpl_matrix_get_data(mYi);
858 for (j = 0; j < nx; j++) {
859 for (k = 0; k < ny; k++) {
861 pd_mXi[i] = (cxdouble) j;
862 pd_mYi[i] = (cxdouble) k;
865 }
else if (mXi != NULL) {
867 pd_mXi = cpl_matrix_get_data(mXi);
869 for (j = 0; j < nx; j++) {
870 for (k = 0; k < ny; k++) {
872 pd_mXi[i] = (cxdouble) j;
875 }
else if (mYi != NULL) {
877 pd_mYi = cpl_matrix_get_data(mYi);
879 for (j = 0; j < nx; j++) {
880 for (k = 0; k < ny; k++) {
882 pd_mYi[i] = (cxdouble) k;