32 #include <cxmessages.h>
34 #include <cpl_matrix.h>
36 #include "gichebyshev.h"
47 struct GiChebyshev2D {
62 inline static cxdouble
63 _giraffe_chebyshev2d_eval(
const GiChebyshev2D *
self, cxdouble x, cxdouble y)
67 cxint nx =
self->xorder + 1;
68 cxint ny =
self->yorder + 1;
70 cxdouble xn = (2.0 * x -
self->ax -
self->bx) / (self->bx - self->ax);
71 cxdouble yn = (2.0 * y -
self->ay -
self->by) / (self->by - self->ay);
75 cxdouble *_coeffs = cpl_matrix_get_data(self->coeffs);
78 cx_assert(_coeffs != NULL);
80 for (i = 0, k = 0; i < nx; i++) {
84 register cxdouble cy0 = 1.0;
85 register cxdouble cy1 = yn;
86 register cxdouble cx2 = 0.;
93 cx2 = 2.0 * cx1 * xn - cx0;
96 for (j = 0; j < ny; j++) {
104 cy2 = 2.0 * cy1 * yn - cy0;
107 sum += cx2 * cy2 * _coeffs[k++];
125 giraffe_chebyshev2d_new(cxint xorder, cxint yorder)
128 GiChebyshev2D *
self = cx_calloc(1,
sizeof *
self);
133 self->xorder = xorder;
134 self->yorder = yorder;
136 self->coeffs = cpl_matrix_new((xorder + 1), (yorder + 1));
138 if (self->coeffs == NULL) {
139 giraffe_chebyshev2d_delete(
self);
151 giraffe_chebyshev2d_clone(
const GiChebyshev2D *other)
154 GiChebyshev2D *
self = NULL;
159 self = giraffe_chebyshev2d_new(other->xorder, other->yorder);
161 self->ax = other->ax;
162 self->bx = other->bx;
163 self->ay = other->ay;
164 self->by = other->by;
166 self->coeffs = cpl_matrix_duplicate(other->coeffs);
176 giraffe_chebyshev2d_delete(GiChebyshev2D *
self)
182 cpl_matrix_delete(self->coeffs);
195 void giraffe_chebyshev2d_get_order(
const GiChebyshev2D *
self, cxint *xorder,
199 cx_assert(
self != NULL);
201 if (xorder != NULL) {
202 *xorder =
self->xorder;
205 if (yorder != NULL) {
206 *yorder =
self->yorder;
215 giraffe_chebyshev2d_get_range(
const GiChebyshev2D *
self, cxdouble *ax,
216 cxdouble *bx, cxdouble *ay, cxdouble *by)
219 cx_assert(
self != NULL);
243 giraffe_chebyshev2d_coeffs(
const GiChebyshev2D *
self)
246 cx_assert(
self != NULL);
254 giraffe_chebyshev2d_set(GiChebyshev2D *
self, cxdouble ax, cxdouble bx,
255 cxdouble ay, cxdouble by, cpl_matrix *coeffs)
258 cx_assert(
self != NULL);
265 if (cpl_matrix_get_nrow(coeffs) <= self->xorder ||
266 cpl_matrix_get_ncol(coeffs) <= self->yorder) {
273 for (i = 0; i <=
self->xorder; i++) {
277 for (j = 0; j <=
self->yorder; j++) {
279 cxdouble c = cpl_matrix_get(coeffs, i, j);
281 cpl_matrix_set(self->coeffs, i, j, c);
295 giraffe_chebyshev2d_set_coeff(GiChebyshev2D *
self, cxint i, cxint j,
299 cx_assert(
self != NULL);
301 if (i > self->xorder || j > self->yorder) {
305 cpl_matrix_set(self->coeffs, i, j, value);
313 giraffe_chebyshev2d_eval(
const GiChebyshev2D *
self, cxdouble x, cxdouble y)
316 cx_assert(
self != NULL);
317 return _giraffe_chebyshev2d_eval(
self, x, y);