// File: mandelbrot-451.cxx // Written by Michael, Dmitry and an anonymous student who designed 451 colors. // This is a start on a program to draw Mandelbrot's fractal. //---------------------------------------------------------------------------- #include // All the graphics functions #include // In case I want to debug with cout using namespace std; //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- const int S = 400; // Size of a square graphics window const int MAX_ESCAPE_TIME=451; // We won't let escape time exceed this //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // Function prototypes // double distance(double x0, double y0, double x1, double y1); // Returns the distance between (x0, y0) and (x1, y1) double distance(double x0, double y0, double x1, double y1); // draw_fractal will draw a portion of Mandelbrot's fractal centered on // (midx, midy) with the specified width and height. void draw_fractal(double midx, double midy, double width, double height); // int mandelbrot_color(double wx, double wy); // Compute the number of jumps that are required to leave the circle of radius // 2 that is centered around the origin when we: // -- start at location (wx, wy) // -- jump to a new location according to Mandelbrot's equations // If we hit the LIMIT (declared as a constant) without leaving the circle, // then we just return the number LIMIT rather than continuing to jump! int mandelbrot_color(double wx, double wy); // The shift_mid function checks whether there has been a left mouse // click. If so, then the location of that click is calculated // in world coordinates, and (midx, midy) is moved to that spot. void shift_mid(double& midx, double& midy, double width, double height); // This function waits until there is a left mouse click or keyboard hit. void wait_for_input( ); // The return value of this function is the color used for a pixel that // has a given escape time (et). int what_color(int et); // world(p, v0, v1, pmax) converts p from an interval that ranges from 0 to // pmax into a double number interval that ranges from v0 to v1. double world(int p, double v0, double v1, int pmax); // The zoom function checks whether the + or - key has been pressed. // If so, then the width and height are cut in half (for the + key) or // doubled (for the - key). void zoom(double& width, double& height); //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- int main() { double midx, midy, width, height; // To define world coordinates // Open a graphics window and set the initial world coordinates: initwindow(S, S, "Mandelbrot's Fractal"); midx = midy = 0.0; width = height = 4.0; // Fill each pixel with a color that depends on Mandelbrot's fractal. for (;;) { // Draw the current fractal draw_fractal(midx, midy, width, height); // Wait for some input: wait_for_input( ); // Process the input: shift_mid(midx, midy, width, height); zoom(width, height); } delay(200000); return EXIT_SUCCESS; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- double distance(double x0, double y0, double x1, double y1) { double dx = x1 - x0; double dy = y1 - y0; return sqrt(dx*dx + dy*dy); } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void draw_fractal(double midx, double midy, double width, double height) { int px, py; // Pixel coordinates on the screen double wx, wy; // Corresponding world coordinates int et; // Escape time depends on wx and wy for (px = 0; px < S; ++px) { for (py = 0; py < S; ++py) { // convert px and py wx = world(px, midx - width/2, midx + width/2, S); wy = world(py, midy + height/2, midy - height/2, S); et = mandelbrot_color(wx, wy); // Draw the pixel with that color putpixel(px, py, what_color(et)); } } } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- int mandelbrot_color(double wx, double wy) { const double sx = wx, sy = wy; // Where we started jumping double wx_new, wy_new; // The next spot to jump to int jumps = 0; // How many jumps we've taken while ((distance(wx, wy, 0, 0) < 2) && (jumps < MAX_ESCAPE_TIME)) { wx_new = wx*wx - wy*wy + sx; wy_new = 2*wx*wy + sy; ++jumps; wx = wx_new; wy = wy_new; } return jumps; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void shift_mid(double& midx, double& midy, double width, double height) { int px, py; if (ismouseclick(WM_LBUTTONDOWN)) { getmouseclick(WM_LBUTTONDOWN, px, py); midx = world(px, midx - width/2, midx + width/2, S); midy = world(py, midy + height/2, midy - height/2, S); } } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void wait_for_input( ) { while (!kbhit() && !ismouseclick(WM_LBUTTONDOWN)) { delay(100); } } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- double world(int p, double v0, double v1, int pmax) { double fraction = double(p)/double(pmax); double distance_from_v0 = fraction*(v1 - v0); return v0 + distance_from_v0; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void zoom(double& width, double& height) { char key; if (kbhit()) { key = getch(); if (key == '+') { width = width/2; height = height/2; } else if (key == '-') { width = width*2; height = height*2; } } } //---------------------------------------------------------------------------- //--------------------------------------------------------------------------- int what_color(int et) { switch (et) { case 0: return COLOR(100,0,0); case 1: return COLOR(113,13,0); case 2: return COLOR(126,26,0); case 3: return COLOR(139,39,0); case 4: return COLOR(152,52,0); case 5: return COLOR(165,65,0); case 6: return COLOR(178,78,0); case 7: return COLOR(191,91,0); case 8: return COLOR(204,104,0); case 9: return COLOR(217,117,0); case 10: return COLOR(230,130,0); case 11: return COLOR(207,123,0); case 12: return COLOR(184,116,0); case 13: return COLOR(161,109,0); case 14: return COLOR(138,102,0); case 15: return COLOR(115,95,0); case 16: return COLOR(92,88,0); case 17: return COLOR(69,81,0); case 18: return COLOR(46,74,0); case 19: return COLOR(23,67,0); case 20: return COLOR(0,60,0); case 21: return COLOR(2,56,20); case 22: return COLOR(4,52,40); case 23: return COLOR(6,48,60); case 24: return COLOR(8,44,80); case 25: return COLOR(10,40,100); case 26: return COLOR(12,36,120); case 27: return COLOR(14,32,140); case 28: return COLOR(16,28,160); case 29: return COLOR(18,24,180); case 30: return COLOR(20,20,200); case 31: return COLOR(31,31,203); case 32: return COLOR(42,42,207); case 33: return COLOR(53,53,210); case 34: return COLOR(64,64,214); case 35: return COLOR(75,75,217); case 36: return COLOR(86,86,221); case 37: return COLOR(97,97,224); case 38: return COLOR(108,108,228); case 39: return COLOR(119,119,231); case 40: return COLOR(130,130,235); case 41: return COLOR(137,137,214); case 42: return COLOR(144,144,192); case 43: return COLOR(151,151,171); case 44: return COLOR(158,158,149); case 45: return COLOR(165,165,128); case 46: return COLOR(172,172,106); case 47: return COLOR(179,179,85); case 48: return COLOR(186,186,63); case 49: return COLOR(193,193,42); case 50: return COLOR(200,200,20); case 51: return COLOR(205,205,26); case 52: return COLOR(210,210,32); case 53: return COLOR(215,215,39); case 54: return COLOR(220,220,45); case 55: return COLOR(226,226,52); case 56: return COLOR(231,231,58); case 57: return COLOR(236,236,64); case 58: return COLOR(241,241,71); case 59: return COLOR(246,246,77); case 60: return COLOR(252,252,84); case 61: return COLOR(252,252,84); case 62: return COLOR(252,252,84); case 63: return COLOR(252,252,84); case 64: return COLOR(252,252,84); case 65: return COLOR(252,252,84); case 66: return COLOR(252,252,84); case 67: return COLOR(252,252,84); case 68: return COLOR(252,252,84); case 69: return COLOR(252,252,84); case 70: return COLOR(252,252,84); case 71: return COLOR(252,252,84); case 72: return COLOR(252,252,84); case 73: return COLOR(252,252,84); case 74: return COLOR(252,252,84); case 75: return COLOR(252,252,84); case 76: return COLOR(252,252,84); case 77: return COLOR(252,252,84); case 78: return COLOR(252,252,84); case 79: return COLOR(252,252,84); case 80: return COLOR(252,252,84); case 81: return COLOR(227,227,76); case 82: return COLOR(202,202,68); case 83: return COLOR(177,177,59); case 84: return COLOR(152,152,51); case 85: return COLOR(126,126,42); case 86: return COLOR(101,101,34); case 87: return COLOR(76,76,26); case 88: return COLOR(51,51,17); case 89: return COLOR(26,26,9); case 90: return COLOR(0,0,0); case 91: return COLOR(25,0,0); case 92: return COLOR(51,0,0); case 93: return COLOR(76,0,0); case 94: return COLOR(102,0,0); case 95: return COLOR(127,0,0); case 96: return COLOR(153,0,0); case 97: return COLOR(178,0,0); case 98: return COLOR(204,0,0); case 99: return COLOR(229,0,0); case 100: return COLOR(255,0,0); case 101: return COLOR(255,0,0); case 102: return COLOR(255,0,0); case 103: return COLOR(255,0,0); case 104: return COLOR(255,0,0); case 105: return COLOR(255,0,0); case 106: return COLOR(255,0,0); case 107: return COLOR(255,0,0); case 108: return COLOR(255,0,0); case 109: return COLOR(255,0,0); case 110: return COLOR(255,0,0); case 111: return COLOR(255,0,0); case 112: return COLOR(255,0,0); case 113: return COLOR(255,0,0); case 114: return COLOR(255,0,0); case 115: return COLOR(255,0,0); case 116: return COLOR(255,0,0); case 117: return COLOR(255,0,0); case 118: return COLOR(255,0,0); case 119: return COLOR(255,0,0); case 120: return COLOR(255,0,0); case 121: return COLOR(255,0,0); case 122: return COLOR(255,0,0); case 123: return COLOR(255,0,0); case 124: return COLOR(255,0,0); case 125: return COLOR(255,0,0); case 126: return COLOR(255,0,0); case 127: return COLOR(255,0,0); case 128: return COLOR(255,0,0); case 129: return COLOR(255,0,0); case 130: return COLOR(255,0,0); case 131: return COLOR(255,0,0); case 132: return COLOR(255,0,0); case 133: return COLOR(255,0,0); case 134: return COLOR(255,0,0); case 135: return COLOR(255,0,0); case 136: return COLOR(255,0,0); case 137: return COLOR(255,0,0); case 138: return COLOR(255,0,0); case 139: return COLOR(255,0,0); case 140: return COLOR(255,0,0); case 141: return COLOR(255,0,0); case 142: return COLOR(255,0,0); case 143: return COLOR(255,0,0); case 144: return COLOR(255,0,0); case 145: return COLOR(255,0,0); case 146: return COLOR(255,0,0); case 147: return COLOR(255,0,0); case 148: return COLOR(255,0,0); case 149: return COLOR(255,0,0); case 150: return COLOR(255,0,0); case 151: return COLOR(255,0,0); case 152: return COLOR(255,0,0); case 153: return COLOR(255,0,0); case 154: return COLOR(255,0,0); case 155: return COLOR(255,0,0); case 156: return COLOR(255,0,0); case 157: return COLOR(255,0,0); case 158: return COLOR(255,0,0); case 159: return COLOR(255,0,0); case 160: return COLOR(255,0,0); case 161: return COLOR(255,0,0); case 162: return COLOR(255,0,0); case 163: return COLOR(255,0,0); case 164: return COLOR(255,0,0); case 165: return COLOR(255,0,0); case 166: return COLOR(255,0,0); case 167: return COLOR(255,0,0); case 168: return COLOR(255,0,0); case 169: return COLOR(255,0,0); case 170: return COLOR(255,0,0); case 171: return COLOR(255,0,0); case 172: return COLOR(255,0,0); case 173: return COLOR(255,0,0); case 174: return COLOR(255,0,0); case 175: return COLOR(255,0,0); case 176: return COLOR(255,0,0); case 177: return COLOR(255,0,0); case 178: return COLOR(255,0,0); case 179: return COLOR(255,0,0); case 180: return COLOR(255,0,0); case 181: return COLOR(255,0,0); case 182: return COLOR(255,0,0); case 183: return COLOR(255,0,0); case 184: return COLOR(255,0,0); case 185: return COLOR(255,0,0); case 186: return COLOR(255,0,0); case 187: return COLOR(255,0,0); case 188: return COLOR(255,0,0); case 189: return COLOR(255,0,0); case 190: return COLOR(255,0,0); case 191: return COLOR(255,0,0); case 192: return COLOR(255,0,0); case 193: return COLOR(255,0,0); case 194: return COLOR(255,0,0); case 195: return COLOR(255,0,0); case 196: return COLOR(255,0,0); case 197: return COLOR(255,0,0); case 198: return COLOR(255,0,0); case 199: return COLOR(255,0,0); case 200: return COLOR(255,0,0); case 201: return COLOR(255,6,0); case 202: return COLOR(255,12,0); case 203: return COLOR(255,18,0); case 204: return COLOR(255,24,0); case 205: return COLOR(255,30,0); case 206: return COLOR(255,36,0); case 207: return COLOR(255,42,0); case 208: return COLOR(255,48,0); case 209: return COLOR(255,54,0); case 210: return COLOR(255,60,0); case 211: return COLOR(255,60,0); case 212: return COLOR(255,60,0); case 213: return COLOR(255,60,0); case 214: return COLOR(255,60,0); case 215: return COLOR(255,60,0); case 216: return COLOR(255,60,0); case 217: return COLOR(255,60,0); case 218: return COLOR(255,60,0); case 219: return COLOR(255,60,0); case 220: return COLOR(255,60,0); case 221: return COLOR(255,60,0); case 222: return COLOR(255,60,0); case 223: return COLOR(255,60,0); case 224: return COLOR(255,60,0); case 225: return COLOR(255,60,0); case 226: return COLOR(255,60,0); case 227: return COLOR(255,60,0); case 228: return COLOR(255,60,0); case 229: return COLOR(255,60,0); case 230: return COLOR(255,60,0); case 231: return COLOR(255,60,0); case 232: return COLOR(255,60,0); case 233: return COLOR(255,60,0); case 234: return COLOR(255,60,0); case 235: return COLOR(255,60,0); case 236: return COLOR(255,60,0); case 237: return COLOR(255,60,0); case 238: return COLOR(255,60,0); case 239: return COLOR(255,60,0); case 240: return COLOR(255,60,0); case 241: return COLOR(255,60,0); case 242: return COLOR(255,60,0); case 243: return COLOR(255,60,0); case 244: return COLOR(255,60,0); case 245: return COLOR(255,60,0); case 246: return COLOR(255,60,0); case 247: return COLOR(255,60,0); case 248: return COLOR(255,60,0); case 249: return COLOR(255,60,0); case 250: return COLOR(255,60,0); case 251: return COLOR(255,60,0); case 252: return COLOR(255,60,0); case 253: return COLOR(255,60,0); case 254: return COLOR(255,60,0); case 255: return COLOR(255,60,0); case 256: return COLOR(255,60,0); case 257: return COLOR(255,60,0); case 258: return COLOR(255,60,0); case 259: return COLOR(255,60,0); case 260: return COLOR(255,60,0); case 261: return COLOR(255,60,0); case 262: return COLOR(255,60,0); case 263: return COLOR(255,60,0); case 264: return COLOR(255,60,0); case 265: return COLOR(255,60,0); case 266: return COLOR(255,60,0); case 267: return COLOR(255,60,0); case 268: return COLOR(255,60,0); case 269: return COLOR(255,60,0); case 270: return COLOR(255,60,0); case 271: return COLOR(255,60,0); case 272: return COLOR(255,60,0); case 273: return COLOR(255,60,0); case 274: return COLOR(255,60,0); case 275: return COLOR(255,60,0); case 276: return COLOR(255,60,0); case 277: return COLOR(255,60,0); case 278: return COLOR(255,60,0); case 279: return COLOR(255,60,0); case 280: return COLOR(255,60,0); case 281: return COLOR(255,60,0); case 282: return COLOR(255,60,0); case 283: return COLOR(255,60,0); case 284: return COLOR(255,60,0); case 285: return COLOR(255,60,0); case 286: return COLOR(255,60,0); case 287: return COLOR(255,60,0); case 288: return COLOR(255,60,0); case 289: return COLOR(255,60,0); case 290: return COLOR(255,60,0); case 291: return COLOR(255,60,0); case 292: return COLOR(255,60,0); case 293: return COLOR(255,60,0); case 294: return COLOR(255,60,0); case 295: return COLOR(255,60,0); case 296: return COLOR(255,60,0); case 297: return COLOR(255,60,0); case 298: return COLOR(255,60,0); case 299: return COLOR(255,60,0); case 300: return COLOR(255,60,0); case 301: return COLOR(255,60,0); case 302: return COLOR(255,60,0); case 303: return COLOR(255,60,0); case 304: return COLOR(255,60,0); case 305: return COLOR(255,60,0); case 306: return COLOR(255,60,0); case 307: return COLOR(255,60,0); case 308: return COLOR(255,60,0); case 309: return COLOR(255,60,0); case 310: return COLOR(255,60,0); case 311: return COLOR(232,56,20); case 312: return COLOR(208,52,40); case 313: return COLOR(185,48,60); case 314: return COLOR(161,44,80); case 315: return COLOR(138,40,100); case 316: return COLOR(114,36,120); case 317: return COLOR(91,32,140); case 318: return COLOR(67,28,160); case 319: return COLOR(44,24,180); case 320: return COLOR(20,20,200); case 321: return COLOR(41,41,205); case 322: return COLOR(62,62,211); case 323: return COLOR(83,83,216); case 324: return COLOR(104,104,222); case 325: return COLOR(125,125,227); case 326: return COLOR(146,146,233); case 327: return COLOR(167,167,238); case 328: return COLOR(188,188,244); case 329: return COLOR(209,209,249); case 330: return COLOR(230,230,255); case 331: return COLOR(209,209,250); case 332: return COLOR(188,188,244); case 333: return COLOR(167,167,239); case 334: return COLOR(146,146,233); case 335: return COLOR(125,125,228); case 336: return COLOR(104,104,222); case 337: return COLOR(83,83,217); case 338: return COLOR(62,62,211); case 339: return COLOR(41,41,206); case 340: return COLOR(20,20,200); case 341: return COLOR(41,41,205); case 342: return COLOR(62,62,211); case 343: return COLOR(83,83,216); case 344: return COLOR(104,104,222); case 345: return COLOR(125,125,227); case 346: return COLOR(146,146,233); case 347: return COLOR(167,167,238); case 348: return COLOR(188,188,244); case 349: return COLOR(209,209,249); case 350: return COLOR(230,230,255); case 351: return COLOR(209,209,250); case 352: return COLOR(188,188,244); case 353: return COLOR(167,167,239); case 354: return COLOR(146,146,233); case 355: return COLOR(125,125,228); case 356: return COLOR(104,104,222); case 357: return COLOR(83,83,217); case 358: return COLOR(62,62,211); case 359: return COLOR(41,41,206); case 360: return COLOR(20,20,200); case 361: return COLOR(41,41,205); case 362: return COLOR(62,62,211); case 363: return COLOR(83,83,216); case 364: return COLOR(104,104,222); case 365: return COLOR(125,125,227); case 366: return COLOR(146,146,233); case 367: return COLOR(167,167,238); case 368: return COLOR(188,188,244); case 369: return COLOR(209,209,249); case 370: return COLOR(230,230,255); case 371: return COLOR(209,209,250); case 372: return COLOR(188,188,244); case 373: return COLOR(167,167,239); case 374: return COLOR(146,146,233); case 375: return COLOR(125,125,228); case 376: return COLOR(104,104,222); case 377: return COLOR(83,83,217); case 378: return COLOR(62,62,211); case 379: return COLOR(41,41,206); case 380: return COLOR(20,20,200); case 381: return COLOR(41,41,205); case 382: return COLOR(62,62,211); case 383: return COLOR(83,83,216); case 384: return COLOR(104,104,222); case 385: return COLOR(125,125,227); case 386: return COLOR(146,146,233); case 387: return COLOR(167,167,238); case 388: return COLOR(188,188,244); case 389: return COLOR(209,209,249); case 390: return COLOR(230,230,255); case 391: return COLOR(209,209,250); case 392: return COLOR(188,188,244); case 393: return COLOR(167,167,239); case 394: return COLOR(146,146,233); case 395: return COLOR(125,125,228); case 396: return COLOR(104,104,222); case 397: return COLOR(83,83,217); case 398: return COLOR(62,62,211); case 399: return COLOR(41,41,206); case 400: return COLOR(20,20,200); case 401: return COLOR(41,41,205); case 402: return COLOR(62,62,211); case 403: return COLOR(83,83,216); case 404: return COLOR(104,104,222); case 405: return COLOR(125,125,227); case 406: return COLOR(146,146,233); case 407: return COLOR(167,167,238); case 408: return COLOR(188,188,244); case 409: return COLOR(209,209,249); case 410: return COLOR(230,230,255); case 411: return COLOR(209,209,250); case 412: return COLOR(188,188,244); case 413: return COLOR(167,167,239); case 414: return COLOR(146,146,233); case 415: return COLOR(125,125,228); case 416: return COLOR(104,104,222); case 417: return COLOR(83,83,217); case 418: return COLOR(62,62,211); case 419: return COLOR(41,41,206); case 420: return COLOR(20,20,200); case 421: return COLOR(20,33,205); case 422: return COLOR(20,46,211); case 423: return COLOR(20,59,216); case 424: return COLOR(20,72,222); case 425: return COLOR(20,85,227); case 426: return COLOR(20,98,233); case 427: return COLOR(20,111,238); case 428: return COLOR(20,124,244); case 429: return COLOR(20,137,249); case 430: return COLOR(20,150,255); case 431: return COLOR(20,137,250); case 432: return COLOR(20,124,244); case 433: return COLOR(20,111,239); case 434: return COLOR(20,98,233); case 435: return COLOR(20,85,228); case 436: return COLOR(20,72,222); case 437: return COLOR(20,59,217); case 438: return COLOR(20,46,211); case 439: return COLOR(20,33,206); case 440: return COLOR(20,20,200); case 441: return COLOR(18,18,180); case 442: return COLOR(16,16,160); case 443: return COLOR(14,14,140); case 444: return COLOR(12,12,120); case 445: return COLOR(10,10,100); case 446: return COLOR(8,8,80); case 447: return COLOR(6,6,60); case 448: return COLOR(4,4,40); case 449: return COLOR(2,2,20); case 450: return COLOR(0,0,0); case 451: return COLOR(0,0,0); case 452: return COLOR(0,0,0); case 453: return COLOR(0,0,0); case 454: return COLOR(0,0,0); case 455: return COLOR(0,0,0); case 456: return COLOR(0,0,0); case 457: return COLOR(0,0,0); case 458: return COLOR(0,0,0); case 459: return COLOR(0,0,0); default: return BLACK; } } //---------------------------------------------------------------------------