117 lines
2.7 KiB
C++
117 lines
2.7 KiB
C++
#include <string>
|
|
#include "pgm.hh"
|
|
|
|
// Komplexe Zahl
|
|
struct Complex
|
|
{
|
|
double real;
|
|
double imag;
|
|
};
|
|
|
|
class Canvas
|
|
{
|
|
public :
|
|
// Konstruktor, erzeuge int* _pixels
|
|
Canvas(double center_x, double center_y,
|
|
double width, double height,
|
|
int horPixels, int vertPixels);
|
|
|
|
// Desktruktor, raeume int* _pixels auf
|
|
~Canvas();
|
|
|
|
// gibt die Breite des Bildes zurueck
|
|
double width();
|
|
|
|
// gibt die Hoehe des Bildes zurueck
|
|
double height();
|
|
|
|
// gibt die Anzahl an horizontalen Pixeln
|
|
int horPixels();
|
|
|
|
// gibt die Anzahl an vertikalen Pixeln
|
|
int vertPixels();
|
|
|
|
// gebe die Koordinaten des Pixels (i,j) als Complex zurueck
|
|
Complex coord(int i, int j);
|
|
|
|
// schreibe value an den Pixel (i,j)
|
|
// Ueberlegen Sie wie aus (i,j) den flachen Index bei row-major bekommen
|
|
void writePixel(int i, int j, int value);
|
|
|
|
// Zugang zum Pixel (i,j) im 1D Array
|
|
// Ueberlegen Sie wie aus (i,j) den flachen Index bei row-major bekommen
|
|
int operator()(int i, int j);
|
|
|
|
// schreibe Bild mit Dateinamen filename
|
|
void write(std::string filename);
|
|
private :
|
|
double _center_x;
|
|
double _center_y;
|
|
double _width;
|
|
double _height;
|
|
int _horPixels;
|
|
int _vertPixels;
|
|
int* _pixels;
|
|
};
|
|
|
|
// diese Methode ist bereits implementiert
|
|
void Canvas::write(std::string filename)
|
|
{
|
|
write_pgm(_pixels,_horPixels,_vertPixels,filename);
|
|
}
|
|
|
|
Canvas::Canvas(double center_x, double center_y, double width, double height, int horPixels,
|
|
int vertPixels) {
|
|
// initialize all values
|
|
_center_x = center_x;
|
|
_center_y = center_y;
|
|
_width = width;
|
|
_height = height;
|
|
_horPixels = horPixels;
|
|
_vertPixels = vertPixels;
|
|
_pixels = new int[horPixels * vertPixels];
|
|
}
|
|
|
|
Canvas::~Canvas() {
|
|
_pixels = 0;
|
|
}
|
|
|
|
double Canvas::width() {
|
|
return _width;
|
|
}
|
|
|
|
double Canvas::height() {
|
|
return _height;
|
|
}
|
|
|
|
int Canvas::horPixels() {
|
|
return _horPixels;
|
|
}
|
|
|
|
int Canvas::vertPixels() {
|
|
return _vertPixels;
|
|
}
|
|
|
|
Complex Canvas::coord(int i, int j) {
|
|
Complex c;
|
|
// Bringe die Pixel mit den echten Laengen ins Verhaeltnis
|
|
double y = i * (_height / _vertPixels) - _height / 2;
|
|
double x = j * (_width / _horPixels) - _width / 2;
|
|
// Gebe die Koordinaten in Relation zum gewuenschten Zentrum aus
|
|
c.imag = y + _center_y;
|
|
c.real = x + _center_x;
|
|
return c;
|
|
}
|
|
|
|
void Canvas::writePixel(int i, int j, int value) {
|
|
// i = Zeile und wegen row-major Konvention muss i mit der Zahl der horizontalen
|
|
// Pixel multipliziert werden
|
|
_pixels[i*_horPixels + j] = value;
|
|
}
|
|
|
|
int Canvas::operator()(int i, int j) {
|
|
// i = Zeile und wegen row-major Konvention muss i mit der Zahl der horizontalen
|
|
// Pixel multipliziert werden
|
|
return _pixels[i*_horPixels + j];
|
|
}
|