int main(int argc, char *argv[]){ screen(320, 240, 0, "Mandelbrot Explorer"); //each iteration, it calculates: new = old*old + c, where c is a constant and old starts at current pixel double pr, pi; //real and imaginary part of the pixel p double newRe, newIm, oldRe, oldIm; //real and imaginary parts of new and old double zoom = 1, moveX = -0.5, moveY = 0; //you can change these to zoom and change position ColorRGB color; //the RGB color value for the pixel int maxIterations = 128; //after how much iterations the function should stop double time, oldTime, frameTime; //current and old time, and their difference (for input) bool keyReleased, keyPressed; //two bools for keys int showText = 0; //begin main program loop while(!done()) { //draw the fractal for(int x = 0; x < w; x++) for(int 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; } //use color model conversion to get rainbow palette, make brightness black if maxIterations reached color = HSVtoRGB(ColorHSV(i % 256, 255, 255 * (i < maxIterations))); //draw the pixel pset(x, y, color); } //print the values of all variables on screen if that option is enabled if(showText <= 1) { print("X:", 1, 1, RGB_White, 1); fprint(moveX, 0, 17, 1, RGB_White, 1); print("Y:", 1, 9, RGB_White, 1); fprint(moveY, 0, 17, 9, RGB_White, 1); print("Z:", 1, 17, RGB_White, 1); fprint(zoom, 0, 17, 17, RGB_White, 1); print("N:", 1, 25, RGB_White, 1); fprint(maxIterations, 0, 17, 25, RGB_White, 1); } //print the help text on screen if that option is enabled if(showText == 0) { print("Arrows move (X,Y), Keypad +,- zooms (Z)", 1, h - 25, RGB_White, 1); print("Keypad *,/ changes iterations (N) ", 1, h - 17, RGB_White, 1); print("a to z=presets (qwerty), F1=cycle texts", 1, h - 9, RGB_White, 1); } redraw(); //get the time and old time for time dependent input oldTime = time; time = getTime(); frameTime = time - oldTime; //no key was pressed yet keyPressed = 0; readKeys(); //ZOOM keys if(inkeys[SDLK_KP_PLUS]) {zoom *= pow(1.001, frameTime); keyPressed = 1;} if(inkeys[SDLK_KP_MINUS]) {zoom /= pow(1.001, frameTime); keyPressed = 1;} //MOVE keys if(inkeys[SDLK_DOWN]) {moveY += 0.0003 * frameTime / zoom; keyPressed = 1;} if(inkeys[SDLK_UP]) {moveY -= 0.0003 * frameTime / zoom; keyPressed = 1;} if(inkeys[SDLK_RIGHT]) {moveX += 0.0003 * frameTime / zoom; keyPressed = 1;} if(inkeys[SDLK_LEFT]) {moveX -= 0.0003 * frameTime / zoom; keyPressed = 1;} //keys to change number of iterations if(inkeys[SDLK_KP_MULTIPLY] && keyReleased) {maxIterations *= 2; keyReleased = 0;} if(inkeys[SDLK_KP_DIVIDE] && keyReleased) {if(maxIterations > 2) maxIterations /= 2; keyReleased = 0;} //key to change the text options if(inkeys[SDLK_F1] && keyReleased) {showText++; showText %= 3; keyReleased = 0;} //enable keyReleased again if the keys above are released if(!inkeys[SDLK_KP_MULTIPLY] && !inkeys[SDLK_KP_DIVIDE] && !inkeys[SDLK_F1]) keyReleased = 1; } return 0;}