#include #include #include #include void sierpinski0(float p[2]) { p[0] /= 2; p[1] /= 2; } void sierpinski1(float p[2]) { p[0] = (p[0]+1)/2; p[1] = p[1]/2; } void sierpinski2(float p[2]) { p[0] = p[0]/2; p[1] = (p[1]+1)/2; } void (*const sierpinski[3])(float p[2]) = {sierpinski0, sierpinski1, sierpinski2}; void iterate(char *screen, unsigned int width, unsigned int height, unsigned int num_iterations) { unsigned int i, x, y; float p[2]; //Zufaellige Zahlen p[0],p[1] in [0,1) p[0] = rand() / ((float)(RAND_MAX) + 1.0); p[1] = rand() / ((float)(RAND_MAX) + 1.0); //num_iterations mal neue sierpinski Punkte bestimmen for(i=0; i < num_iterations; i++) { //Zufaellige Auswahl einer der Funktionen zur Veraenderung von p1, p2 auswaehlen (*sierpinski[rand() % 3])(p); x = (unsigned int)(p[0] * width); y = (unsigned int)(p[1] * height); //Setze den Wert an der Position p[0], p[1] des Bildes auf Weiss (= 255) //screen[(unsigned int)(p[1]*height)*width + (unsigned int)(p[0]*width)] = 0; screen[y*width + x] = 0; } } //PGM Bild schreiben void writePGM(const char* filename, char *screen, unsigned int width, unsigned int height) { FILE* fp = fopen(filename, "wb"); fprintf(fp, "P5\n%u\n%u\n255\n", width, height); fwrite(screen, width*height, 1, fp); fclose(fp); } int main() { unsigned int i; //Von der Standardeingabe lesen unsigned int num_iterations = 10000000; unsigned int width = 1000; unsigned int height = 1000; //Einlesen und ueberpruefen der Eingabe. printf("Geben Sie die Anzahl der Iterationen ein: "); if( scanf("%u",&num_iterations) != 1 ) { printf( "Bitte geben Sie eine positive ganze Zahl ein!\n" ); return 1; } printf("Geben Sie die Breite ein: "); if( scanf("%u",&width) != 1 ) { printf( "Bitte geben Sie eine positive ganze Zahl ein!\n" ); return 1; } printf("Geben Sie die Hoehe ein: "); if( scanf("%u",&height) != 1 ) { printf( "Bitte geben Sie eine positive ganze Zahl ein!\n" ); return 1; } //Rand initialisieren srand(time(NULL)); //initialisieren char *screen = (char*) calloc( width*height, sizeof(char) ); for(i=0; i < width*height; i++) { screen[i] = 255; } iterate(screen, width, height, num_iterations); writePGM("sierpinski.pgm", screen, width, height); return 0; }