2022-09-05 15:19:34 +00:00
|
|
|
#ifndef BBGE_INTERPOLATORS_H
|
|
|
|
#define BBGE_INTERPOLATORS_H
|
|
|
|
|
|
|
|
#include <algorithm> // std::pair
|
|
|
|
#include <vector>
|
|
|
|
#include "Vector.h"
|
|
|
|
|
|
|
|
class CosineInterpolator
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CosineInterpolator();
|
|
|
|
void clear();
|
|
|
|
void setPoints(const Vector *p, size_t n);
|
|
|
|
float operator()(float x) const;
|
|
|
|
void interpolateRange(float *ys, const float *xs, size_t n);
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
std::vector<std::pair<float, float> > pxy;
|
|
|
|
};
|
|
|
|
|
2022-09-13 16:38:44 +00:00
|
|
|
class BSpline2D
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
BSpline2D();
|
|
|
|
|
|
|
|
// # of control points on each axis
|
2022-09-23 16:10:44 +00:00
|
|
|
void resize(size_t cx, size_t cy, unsigned degx, unsigned degy);
|
|
|
|
void recalc(Vector *dst, size_t xres, size_t yres, const Vector *controlpoints);
|
2022-09-13 16:38:44 +00:00
|
|
|
|
2022-09-23 16:10:44 +00:00
|
|
|
void reset(Vector *controlpoints);
|
2022-09-13 16:38:44 +00:00
|
|
|
|
|
|
|
inline size_t ctrlX() const { return _cpx; }
|
|
|
|
inline size_t ctrlY() const { return _cpy; }
|
|
|
|
|
|
|
|
inline unsigned degX() const { return _degx; }
|
|
|
|
inline unsigned degY() const { return _degy; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
size_t _cpx, _cpy; // # of control points
|
|
|
|
unsigned _degx, _degy;
|
|
|
|
float _tmin, _tmax;
|
|
|
|
std::vector<float> knotsX, knotsY;
|
|
|
|
};
|
2022-09-23 16:10:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
class BSpline2DWithPoints : public BSpline2D
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
void resize(size_t cx, size_t cy, unsigned degx, unsigned degy);
|
|
|
|
void recalc(Vector *dst, size_t xres, size_t yres);
|
|
|
|
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
std::vector<Vector> controlpoints;
|
|
|
|
|
|
|
|
inline Vector& controlpoint(size_t x, size_t y)
|
|
|
|
{
|
|
|
|
return controlpoints[y * ctrlX() + x];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|