My old project for strange attractors
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

73 lines
1.3 KiB

#ifndef PROJECTOR_HPP
#define PROJECTOR_HPP
#include "Logger.hpp"
#include <algorithm>
#include "stfu/stf.hpp"
#include "Canvas.hpp"
class Projector {
public:
// SHOULD NOT BE HERE
Canvas* canvas;
Projector(unsigned int inputDimension, unsigned int outputDimension) :
canvas(0), projector(0), projectedPoint(0),
inputDimension(inputDimension), outputDimension(outputDimension),
ready(true) {
try {
allocate();
} catch(std::exception& e) {
LogError("Couldn't construct Projector: %s\n", e.what());
deallocate();
}
std::fill_n(projectedPoint, outputDimension, 0.0);
}
virtual ~Projector() {
deallocate();
}
void plot(const double* point) {
project(point);
if(ready) {
if(canvas != NULL) {
canvas->plot(projectedPoint);
}
if(projector != NULL) {
projector->plot(projectedPoint);
}
}
}
static Projector* createProjector(stfu::node& projector, unsigned int input_dimension);
protected:
Projector* projector;
double* projectedPoint;
unsigned int inputDimension;
unsigned int outputDimension;
bool ready;
virtual void project(const double* point) = 0;
private:
void allocate() {
projectedPoint = new double[outputDimension];
}
void deallocate() {
delete[] projectedPoint;
projectedPoint = NULL;
}
};
#endif // PROJECTOR_HPP