|
|
|
#include "../Logger.hpp"
|
|
|
|
#include <fstream>
|
|
|
|
#include <cmath>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <cassert>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <numeric>
|
|
|
|
#include <functional>
|
|
|
|
|
|
|
|
#include "Raw.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
Raw::Raw(const unsigned int dimension, const unsigned int* sizes_)
|
|
|
|
: Canvas(dimension)
|
|
|
|
, sizes(0)
|
|
|
|
, sizesMultiplied(0)
|
|
|
|
, pixelArray(0)
|
|
|
|
, arraySize(1)
|
|
|
|
{
|
|
|
|
|
|
|
|
sizes = new unsigned int[dimension];
|
|
|
|
assert(sizes != NULL);
|
|
|
|
std::copy(sizes_, sizes_ + dimension, sizes);
|
|
|
|
|
|
|
|
sizesMultiplied = new unsigned int[dimension];
|
|
|
|
assert(sizesMultiplied != NULL);
|
|
|
|
sizesMultiplied[0] = 1;
|
|
|
|
for(unsigned int i = 1; i < dimension; ++i) {
|
|
|
|
sizesMultiplied[i] = sizesMultiplied[i-1]*sizes[i-1];
|
|
|
|
}
|
|
|
|
|
|
|
|
for(unsigned int i = 0; i < dimension; ++i) {
|
|
|
|
arraySize *= sizes[i];
|
|
|
|
}
|
|
|
|
pixelArray = new unsigned int[arraySize];
|
|
|
|
assert(pixelArray != NULL);
|
|
|
|
|
|
|
|
clear();
|
|
|
|
|
|
|
|
LogDebug("New RawCanvas of dimension %d\n", dimension);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Raw::clear() {
|
|
|
|
std::fill_n(pixelArray, arraySize, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Raw::plot(const double* position) {
|
|
|
|
unsigned int index = 0;
|
|
|
|
for(unsigned int i = 0; i < dimension; ++i) {
|
|
|
|
index += (unsigned int)(position[i]*sizes[i] + 0.5*sizes[i])*sizesMultiplied[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
if(index < arraySize) {
|
|
|
|
pixelArray[index]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
I/O functions
|
|
|
|
*/
|
|
|
|
|
|
|
|
void Raw::output_file(const char* filename) const {
|
|
|
|
std::ofstream outfile(filename, std::ofstream::binary);
|
|
|
|
outfile.write(reinterpret_cast<char*>(pixelArray), sizeof(unsigned int)*arraySize);
|
|
|
|
}
|