#include #include #include // Datentyp Complex in der Datei canvas.hh #include "canvas.hh" // Summiert zwei komplexe Zahlen z und c und schreibt das Ergebnis in z void add_complex(Complex& z, Complex& c) { z.real += c.real; z.imag += c.imag; } // Multipliziert zwei komplexe Zahlen z und c und schreibt das Ergebnis in z void multiply_complex(Complex& z, Complex& c) { double re = z.real*c.real - z.imag*c.imag; double im = z.real*c.imag + z.imag*c.real; z.real = re; z.imag = im; } // Betrag einer komplexen Zahl double betrag(Complex z) { return std::sqrt(std::pow(z.real, 2) + std::pow(z.imag, 2)); } // Generiert die Mandelbrot Menge und speichert sie in canvas mit threshold als Entfernung, ab dem // ein Punkt ,,entkommt'', mit maxIt als maximale Anzahl an Iterationen, die für // die Folge durchgeführt werden soll. Wird als PGM Bild unter filename gespeichert void mandelbrot(Canvas& canvas, double threshold, int maxIt, std::string filename) { for (int i = 0; i < canvas.vertPixels(); i++) { for (int j = 0; j < canvas.horPixels(); j++) { Complex c = canvas.coord(i, j); Complex z; z.real = 0; z.imag = 0; int neededIterations = -1; for (int k = 1; k <= maxIt; k++) { multiply_complex(z, z); add_complex(z, c); if (betrag(z) > threshold) { neededIterations = k; break; } } if (neededIterations == -1) { canvas.writePixel(i, j, 0); } else { canvas.writePixel(i, j, std::log(neededIterations)*100); } } } canvas.write(filename); } int main() { Canvas canvas = Canvas(-1, 0, 4, 3, 4000, 3000); mandelbrot(canvas, 1000, 10000, "mandelbrot.pgm"); }