25 #include <cxmessages.h>
27 #include <cpl_matrix.h>
29 #include "gichebyshev.h"
40 struct GiChebyshev2D {
55 inline static cxdouble
56 _giraffe_chebyshev2d_eval(
const GiChebyshev2D *
self, cxdouble x, cxdouble y)
60 cxint nx =
self->xorder + 1;
61 cxint ny =
self->yorder + 1;
63 cxdouble xn = (2.0 * x -
self->ax -
self->bx) / (self->bx - self->ax);
64 cxdouble yn = (2.0 * y -
self->ay -
self->by) / (self->by - self->ay);
68 cxdouble *_coeffs = cpl_matrix_get_data(self->coeffs);
71 cx_assert(_coeffs != NULL);
73 for (i = 0, k = 0; i < nx; i++) {
77 register cxdouble cy0 = 1.0;
78 register cxdouble cy1 = yn;
79 register cxdouble cx2 = 0.;
86 cx2 = 2.0 * cx1 * xn - cx0;
89 for (j = 0; j < ny; j++) {
97 cy2 = 2.0 * cy1 * yn - cy0;
100 sum += cx2 * cy2 * _coeffs[k++];
118 giraffe_chebyshev2d_new(cxint xorder, cxint yorder)
121 GiChebyshev2D *
self = cx_calloc(1,
sizeof *
self);
126 self->xorder = xorder;
127 self->yorder = yorder;
129 self->coeffs = cpl_matrix_new((xorder + 1), (yorder + 1));
131 if (self->coeffs == NULL) {
132 giraffe_chebyshev2d_delete(
self);
144 giraffe_chebyshev2d_clone(
const GiChebyshev2D *other)
147 GiChebyshev2D *
self = NULL;
152 self = giraffe_chebyshev2d_new(other->xorder, other->yorder);
154 self->ax = other->ax;
155 self->bx = other->bx;
156 self->ay = other->ay;
157 self->by = other->by;
159 self->coeffs = cpl_matrix_duplicate(other->coeffs);
169 giraffe_chebyshev2d_delete(GiChebyshev2D *
self)
175 cpl_matrix_delete(self->coeffs);
188 void giraffe_chebyshev2d_get_order(
const GiChebyshev2D *
self, cxint *xorder,
192 cx_assert(
self != NULL);
194 if (xorder != NULL) {
195 *xorder =
self->xorder;
198 if (yorder != NULL) {
199 *yorder =
self->yorder;
208 giraffe_chebyshev2d_get_range(
const GiChebyshev2D *
self, cxdouble *ax,
209 cxdouble *bx, cxdouble *ay, cxdouble *by)
212 cx_assert(
self != NULL);
236 giraffe_chebyshev2d_coeffs(
const GiChebyshev2D *
self)
239 cx_assert(
self != NULL);
247 giraffe_chebyshev2d_set(GiChebyshev2D *
self, cxdouble ax, cxdouble bx,
248 cxdouble ay, cxdouble by, cpl_matrix *coeffs)
251 cx_assert(
self != NULL);
258 if (cpl_matrix_get_nrow(coeffs) <= self->xorder ||
259 cpl_matrix_get_ncol(coeffs) <= self->yorder) {
266 for (i = 0; i <=
self->xorder; i++) {
270 for (j = 0; j <=
self->yorder; j++) {
272 cxdouble c = cpl_matrix_get(coeffs, i, j);
274 cpl_matrix_set(self->coeffs, i, j, c);
288 giraffe_chebyshev2d_set_coeff(GiChebyshev2D *
self, cxint i, cxint j,
292 cx_assert(
self != NULL);
294 if (i > self->xorder || j > self->yorder) {
298 cpl_matrix_set(self->coeffs, i, j, value);
306 giraffe_chebyshev2d_eval(
const GiChebyshev2D *
self, cxdouble x, cxdouble y)
309 cx_assert(
self != NULL);
310 return _giraffe_chebyshev2d_eval(
self, x, y);