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.
97 lines
1.9 KiB
97 lines
1.9 KiB
14 years ago
|
#include "Normalizer.hpp"
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark memory
|
||
|
|
||
|
Normalizer::Normalizer(unsigned int dimension) : Projector(dimension, dimension) {
|
||
|
ready = false;
|
||
|
|
||
|
try {
|
||
|
allocate();
|
||
|
} catch (std::exception& e) {
|
||
|
LogError("Couldn't construct Normalizer (Projector): %s\n", e.what());
|
||
|
deallocate();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Normalizer::~Normalizer() {
|
||
|
//dtor
|
||
|
}
|
||
|
|
||
|
void Normalizer::allocate(){
|
||
|
range_min = new double[outputDimension];
|
||
|
range_max = new double[outputDimension];
|
||
|
offset = new double[outputDimension]
|
||
|
}
|
||
|
|
||
|
void Normalizer::deallocate(){
|
||
|
delete[] range_min;
|
||
|
range_min = 0;
|
||
|
delete[] range_max;
|
||
|
range_max = 0;
|
||
|
delete[] offset;
|
||
|
offset = 0;
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark plot
|
||
|
|
||
|
void Normalizer::project(const double * point) {
|
||
|
projectedPoint[0] = point[0]*factor + offset[0];
|
||
|
projectedPoint[1] = point[1]*factor + offset[1];
|
||
|
projectedPoint[2] = point[2]*factor + offset[2];
|
||
|
|
||
|
if(!ready){
|
||
|
static unsigned int state = 0;
|
||
|
|
||
|
switch(state) {
|
||
|
case 0:
|
||
|
init_range();
|
||
|
state = kUpdate;
|
||
|
break;
|
||
|
case 20000:
|
||
|
finish_range();
|
||
|
ready = true;
|
||
|
break;
|
||
|
default:
|
||
|
update_range();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#pragma mark -
|
||
|
#pragma mark setting up
|
||
|
|
||
|
void Projector::init_range() {
|
||
|
for ( unsigned int i = 0; i < intern_dim; i++ ) {
|
||
|
range_min[i] = range_max[i] = project_point[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Projector::update_range() {
|
||
|
for ( unsigned int i = 0; i < intern_dim; i++ ) {
|
||
|
if ( project_point[i] < range_min[i] ) {
|
||
|
range_min[i] = project_point[i];
|
||
|
} else if ( project_point[i] > range_max[i] ) {
|
||
|
range_max[i] = project_point[i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Projector::finish_range() {
|
||
|
factor = 2.0 / (range_max[0] - range_min[0]);
|
||
|
for ( unsigned int i = 1; i < intern_dim; i++ ) {
|
||
|
double dist = range_max[i] - range_min[i];
|
||
|
if ( factor * dist > 2.0 ) {
|
||
|
factor = 2.0 / dist;
|
||
|
//teh_size = canvas->size[i];
|
||
|
LogDebug("Crap for dimension %d\n", i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for ( unsigned int i = 0; i < intern_dim; i++ ) {
|
||
|
offset[i] = -0.5*factor*(range_min[i] + range_max[i]);
|
||
|
}
|
||
|
}
|