Verbesserung meiner Mandelbrot set code
Habe ich Folgendes Mandelbrot set code in C. ich mache die Berechnung und Erstellung eines .ppm-Datei für die Letzte fraktal Bild. Der Punkt ist, dass mein fractal Bild auf dem Kopf steht, d.h. es wird um 90 Grad gedreht. Sie können es durch ausführen meines Codes:
./mandel > test.ppm
Auf der anderen Seite möchte ich auch die Farben einstellen. Ich möchte erreichen, das Fraktale Bild:
Mein letztes Problem ist, dass mein code nicht überprüft, so dass die Laufzeit meines Codes. Ich habe den code für dieses Teil auch, aber wenn der code die Ausführung beendet, es drucken nicht die laufende Zeit. Wenn jemand die entsprechenden änderungen an meinem code und helft mir erreichen das fraktal-Bild, und stellen Sie die abgelaufene Zeit angezeigt ich würde mich freuen.
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
void color(int red, int green, int blue)
{
fputc((char)red, stdout);
fputc((char)green, stdout);
fputc((char)blue, stdout);
}
int main(int argc, char *argv[])
{
int w = 600, h = 400, x, y;
//each iteration, it calculates: newz = oldz*oldz + p, where p is the current pixel, and oldz stars at the origin
double pr, pi; //real and imaginary part of the pixel p
double newRe, newIm, oldRe, oldIm; //real and imaginary parts of new and old z
double zoom = 1, moveX = -0.5, moveY = 0; //you can change these to zoom and change position
int maxIterations = 1000;//after how much iterations the function should stop
clock_t begin, end;
double time_spent;
printf("P6\n# CREATOR: E.T /mandel program\n");
printf("%d %d\n255\n",w,h);
begin = clock();
//loop through every pixel
for(x = 0; x < w; x++)
for(y = 0; y < h; y++)
{
//calculate the initial real and imaginary part of z, based on the pixel location and zoom and position values
pr = 1.5 * (x - w / 2) / (0.5 * zoom * w) + moveX;
pi = (y - h / 2) / (0.5 * zoom * h) + moveY;
newRe = newIm = oldRe = oldIm = 0; //these should start at 0,0
//"i" will represent the number of iterations
int i;
//start the iteration process
for(i = 0; i < maxIterations; i++)
{
//remember value of previous iteration
oldRe = newRe;
oldIm = newIm;
//the actual iteration, the real and imaginary part are calculated
newRe = oldRe * oldRe - oldIm * oldIm + pr;
newIm = 2 * oldRe * oldIm + pi;
//if the point is outside the circle with radius 2: stop
if((newRe * newRe + newIm * newIm) > 4) break;
}
color(i % 256, 255, 255 * (i < maxIterations));
}
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Elapsed time: %.2lf seconds.\n", time_spent);
return 0;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Teil 1:
Sie müssen swap die Reihenfolge der Schleifen:
Geben Sie die korrekte Ausrichtung der Fraktale.
Teil 2:
Um die Zeit zu drucken, drucken Sie es auf stderr, da Sie den Druck der ppm-Ausgabe auf stdout:
Teil 3:
Um eine kontinuierliche glatte Färbung, müssen Sie die Verwendung der Normalized Iteration Count-Methode oder etwas ähnliches. Hier ist ein Ersatz für Ihre Färbung Abschnitt, gibt Ihnen etwas ähnlich, was Sie sich wünschen:
Es ist nicht ganz da, weil ich Art haben eine einfache, Ungefähre Implementierung des Normalized Iteration Count-Methode.
Es ist nicht eine voll ständige färben, aber es ist Art von Nähe.