home *** CD-ROM | disk | FTP | other *** search
/ Rat's Nest 1 / ratsnest1.iso / prgmming / c / newmags.cpp < prev    next >
C/C++ Source or Header  |  1996-02-19  |  20KB  |  593 lines

  1. //
  2. //+---------------------------------------------------------------+
  3. //+ Program MAGNETS.CPP                                           +
  4. //+ Plots 18 magnet-like fractals in the x-plane for different q. +
  5. //+ (16 for Model I, 2 for Model II)                              +
  6. //+                                                               +
  7. //+ By: Fausto Arinos de Almeida Barbuto                          +
  8. //+ E-mail: BJ06@C53000.PETROBRAS.ANRJ.BR                         +
  9. //+ Rio de Janeiro, BRAZIL, April 4th 1994                        +
  10. //+                                                               +
  11. //+ Modified by: Michael Sargent                                  +
  12. //+ E-mail: msargent@moose.uvm.edu                                +
  13. //+ Essex Junction, Vermont, USA, May 15, 1994                    +
  14. //+                                                               +
  15. //+ Needs SVGA256.H and SVGA256.BGI, supports up to four screens. +
  16. //+                                                               +
  17. //+ REFERENCE: Peitgen, H.-O. and Richter, P.H.                   +
  18. //+            "The Beauty of Fractals" (Springer-Verlag 1986)    +
  19. //+            pp. 129-37, 194.                                   +
  20. //+---------------------------------------------------------------+
  21. //
  22. #include <stdio.h>
  23. #include "svga256.h"
  24. #include <conio.h>
  25. #include <graphics.h>
  26. #include <math.h>
  27. #include <complex.h>
  28. #include <dos.h>
  29.  
  30. void introscreen(void);
  31. void userinput(void);
  32. void parameters(void);
  33. void calculate(void);
  34. void preliminary(void);
  35. void setVGApalette(char *buffer);
  36. //void far initgraph(int far *,int far *,char far *);
  37.  
  38. // Global variables //
  39. double xmin, xmax, ymin, ymax, fact=1.0, dist, xmag, ymag, zmag,
  40.    ypy, x, y, r, deltap, deltaq;
  41. int maxiter, Model, insidecolor=1, plotflag=0, npix, npiy, k, np, nq,
  42.    npy, ipen, graphdriver=DETECT, graphmode, Vid, index;
  43. complex c, z, q, a, b, ab, z2, secondz;
  44.  
  45. char palette[256][3]={
  46. { 0, 0, 0},{ 0, 17, 45},{ 0, 18, 45},{ 0, 19, 44},
  47. { 0, 20, 43},{ 0, 20, 42},{ 0, 21, 42},{ 0, 22, 41},
  48. { 0, 22, 40},{ 0, 23, 40},{ 0, 24, 39},{ 0, 25, 38},
  49. { 0, 25, 37},{ 0, 26, 37},{ 0, 27, 36},{ 0, 28, 35},
  50. { 0, 28, 34},{ 0, 29, 34},{ 0, 30, 33},{ 0, 31, 32},
  51. { 0, 31, 31},{ 0, 32, 31},{ 0, 33, 30},{ 0, 34, 29},
  52. { 0, 34, 28},{ 0, 35, 28},{ 0, 36, 27},{ 0, 37, 26},
  53. { 0, 37, 25},{ 0, 38, 25},{ 0, 39, 24},{ 0, 40, 23},
  54. { 0, 40, 22},{ 0, 41, 22},{ 0, 42, 21},{ 0, 42, 20},
  55. { 0, 43, 20},{ 0, 44, 19},{ 0, 45, 18},{ 0, 45, 17},
  56. { 0, 46, 17},{ 0, 47, 16},{ 0, 48, 15},{ 0, 48, 14},
  57. { 0, 49, 14},{ 0, 50, 13},{ 0, 51, 12},{ 0, 51, 11},
  58. { 0, 52, 11},{ 0, 53, 10},{ 0, 54, 9},{ 0, 54, 8},
  59. { 0, 55, 8},{ 0, 56, 7},{ 0, 57, 6},{ 0, 57, 5},
  60. { 0, 58, 5},{ 0, 59, 4},{ 0, 60, 3},{ 0, 60, 2},
  61. { 0, 61, 2},{ 0, 62, 1},{ 0, 63, 0},{ 0, 63, 0},
  62. { 1, 62, 0},{ 2, 61, 0},{ 2, 60, 0},{ 3, 60, 0},
  63. { 4, 59, 0},{ 5, 58, 0},{ 5, 57, 0},{ 6, 57, 0},
  64. { 7, 56, 0},{ 8, 55, 0},{ 8, 54, 0},{ 9, 54, 0},
  65. { 10, 53, 0},{ 11, 52, 0},{ 11, 51, 0},{ 12, 51, 0},
  66. { 13, 50, 0},{ 14, 49, 0},{ 14, 48, 0},{ 15, 48, 0},
  67. { 16, 47, 0},{ 17, 46, 0},{ 17, 45, 0},{ 18, 45, 0},
  68. { 19, 44, 0},{ 20, 43, 0},{ 20, 42, 0},{ 21, 42, 0},
  69. { 22, 41, 0},{ 22, 40, 0},{ 23, 40, 0},{ 24, 39, 0},
  70. { 25, 38, 0},{ 25, 37, 0},{ 26, 37, 0},{ 27, 36, 0},
  71. { 28, 35, 0},{ 28, 34, 0},{ 29, 34, 0},{ 30, 33, 0},
  72. { 31, 32, 0},{ 31, 31, 0},{ 32, 31, 0},{ 33, 30, 0},
  73. { 34, 29, 0},{ 34, 28, 0},{ 35, 28, 0},{ 36, 27, 0},
  74. { 37, 26, 0},{ 37, 25, 0},{ 38, 25, 0},{ 39, 24, 0},
  75. { 40, 23, 0},{ 40, 22, 0},{ 41, 22, 0},{ 42, 21, 0},
  76. { 42, 20, 0},{ 43, 20, 0},{ 44, 19, 0},{ 45, 18, 0},
  77. { 45, 17, 0},{ 46, 17, 0},{ 47, 16, 0},{ 48, 15, 0},
  78. { 48, 14, 0},{ 49, 14, 0},{ 50, 13, 0},{ 51, 12, 0},
  79. { 51, 11, 0},{ 52, 11, 0},{ 53, 10, 0},{ 54, 9, 0},
  80. { 54, 8, 0},{ 55, 8, 0},{ 56, 7, 0},{ 57, 6, 0},
  81. { 57, 5, 0},{ 58, 5, 0},{ 59, 4, 0},{ 60, 3, 0},
  82. { 60, 2, 0},{ 61, 2, 0},{ 62, 1, 0},{ 63, 0, 0},
  83. { 63, 0, 0},{ 62, 0, 1},{ 61, 0, 2},{ 60, 0, 2},
  84. { 60, 0, 3},{ 59, 0, 4},{ 58, 0, 5},{ 57, 0, 5},
  85. { 57, 0, 6},{ 56, 0, 7},{ 55, 0, 8},{ 54, 0, 8},
  86. { 54, 0, 9},{ 53, 0, 10},{ 52, 0, 11},{ 51, 0, 11},
  87. { 51, 0, 12},{ 50, 0, 13},{ 49, 0, 14},{ 48, 0, 14},
  88. { 48, 0, 15},{ 47, 0, 16},{ 46, 0, 17},{ 45, 0, 17},
  89. { 45, 0, 18},{ 44, 0, 19},{ 43, 0, 20},{ 42, 0, 20},
  90. { 42, 0, 21},{ 41, 0, 22},{ 40, 0, 22},{ 40, 0, 23},
  91. { 39, 0, 24},{ 38, 0, 25},{ 37, 0, 25},{ 37, 0, 26},
  92. { 36, 0, 27},{ 35, 0, 28},{ 34, 0, 28},{ 34, 0, 29},
  93. { 33, 0, 30},{ 32, 0, 31},{ 31, 0, 31},{ 31, 0, 32},
  94. { 30, 0, 33},{ 29, 0, 34},{ 28, 0, 34},{ 28, 0, 35},
  95. { 27, 0, 36},{ 26, 0, 37},{ 25, 0, 37},{ 25, 0, 38},
  96. { 24, 0, 39},{ 23, 0, 40},{ 22, 0, 40},{ 22, 0, 41},
  97. { 21, 0, 42},{ 20, 0, 42},{ 20, 0, 43},{ 19, 0, 44},
  98. { 18, 0, 45},{ 17, 0, 45},{ 17, 0, 46},{ 16, 0, 47},
  99. { 15, 0, 48},{ 14, 0, 48},{ 14, 0, 49},{ 13, 0, 50},
  100. { 12, 0, 51},{ 11, 0, 51},{ 11, 0, 52},{ 10, 0, 53},
  101. { 9, 0, 54},{ 8, 0, 54},{ 8, 0, 55},{ 7, 0, 56},
  102. { 6, 0, 57},{ 5, 0, 57},{ 5, 0, 58},{ 4, 0, 59},
  103. { 3, 0, 60},{ 2, 0, 60},{ 2, 0, 61},{ 1, 0, 62},
  104. { 0, 0, 63},{ 0, 0, 63},{ 0, 1, 62},{ 0, 2, 61},
  105. { 0, 2, 60},{ 0, 3, 60},{ 0, 4, 59},{ 0, 5, 58},
  106. { 0, 5, 57},{ 0, 6, 57},{ 0, 7, 56},{ 0, 8, 55},
  107. { 0, 8, 54},{ 0, 9, 54},{ 0, 10, 53},{ 0, 11, 52},
  108. { 0, 11, 51},{ 0, 12, 51},{ 0, 13, 50},{ 0, 14, 49},
  109. { 0, 14, 48},{ 0, 15, 48},{ 0, 16, 47},{ 0, 17, 46}
  110. };
  111.  
  112. //===========================================================================
  113. // Convoluted BGI stuff
  114. //===========================================================================
  115. int huge DetectVGA256()
  116. {
  117.    int mistake;
  118.    char key;
  119.  
  120.    printf("\n\n                      Which video mode would you like to use? \n\n");
  121.    printf("                      a: 640x400x256\n");
  122.    printf("                      b: 640x480x256\n");
  123.    printf("                      c: 800x600x256\n");
  124.    printf("                      d: 1024x768x256\n\n");
  125.    printf("                      > ");
  126.    do
  127.    {
  128.       mistake = 0;
  129.       key = getch();
  130.       Vid = ("%d",key) - 96;
  131.       if (Vid < 1 || Vid > 4)
  132.       {
  133.      mistake = 1;
  134.      printf("%c%c%c",7,7,7);
  135.      gotoxy(25,10);
  136.      printf("                                                          ");
  137.      gotoxy(25,10);
  138.       }
  139.     }
  140.     while(mistake == 1);
  141.     printf("%c",key);
  142.     delay(500);
  143.     return Vid;
  144. }
  145.  
  146. //===========================================================================
  147. // Main
  148. //===========================================================================
  149. void main()
  150. {
  151.      introscreen();
  152.      userinput();
  153.      parameters();
  154.      cleardevice();
  155.      setVGApalette(palette[0]);
  156.      calculate();
  157.      closegraph();
  158. }
  159.  
  160. //===========================================================================
  161. // Introduction & BOF credits
  162. //===========================================================================
  163. void introscreen(void)
  164. {
  165.    clrscr();
  166.    _setcursortype(_NOCURSOR);
  167.    gotoxy(31,4);
  168.    printf("MAGNET-LIKE MODELS");
  169.    gotoxy(15,6);
  170.    printf("Reference: Peitgen, H.-O., and Richter, P.H.");
  171.    gotoxy(15,7);
  172.    printf("The Beauty of Fractals (Springer-Verlag 1986) pp. 129-37, 194");
  173.    gotoxy(15,9);
  174.    printf("By Fausto A. A. Barbuto, April 4, 1994");
  175.    gotoxy(15,10);
  176.    printf("E-mail: BJ06@C53000.PETROBRAS.ANRJ.BR");
  177.    gotoxy(15,12);
  178.    printf("Modifications by Michael Sargent, May 15, 1994");
  179.    gotoxy(15,13);
  180.    printf("E-mail: msargent@moose.uvm.edu\n\n\n");
  181.    getch();
  182. }
  183.  
  184. //===========================================================================
  185. // Obtain input - who said user-proofing was fun?
  186. //===========================================================================
  187. void userinput(void)
  188. {
  189.    int i, mistake, status;
  190.    char key;
  191.  
  192.    clrscr();
  193.    _setcursortype(_NORMALCURSOR);
  194.    printf("\n\n                              SELECT A MODEL TYPE: \n\n\n");
  195.    printf("                              %c (z%c + q - 1) %c%c\n",218,253,191,253);
  196.    cprintf("     a: Model I:  z  %c",26);
  197.    gotoxy(31,7);
  198.    printf("%c ",179);
  199.    for (i=0;i<12;i++) putchar(196);
  200.    printf(" %c\n",179);
  201.    printf("                              %c (2z + q - 2) %c\n\n\n",192,217);
  202.    printf("                        %c     (z^3 + 3az + ab)      %c%c\n",218,191,253);
  203.    cprintf("     b: Model II: z  %c",26);
  204.    gotoxy(25,12);
  205.    printf("%c ",179);
  206.    for (i=0;i<25;i++) putchar(196);
  207.    printf(" %c\n",179);
  208.    printf("                        %c (3z%c + 3bz + q%c - 3q + 3) %c\n\n",192,253,253,217);
  209.    printf("                         (where a = q-1 and b = q-2) \n\n\n     > ");
  210.    do
  211.    {
  212.       mistake = 0;
  213.       key = getch();
  214.       Model = ("%d",key) - 96;
  215.       if (Model < 1 || Model > 2)
  216.       {
  217.      mistake = 1;
  218.      printf("%c%c%c",7,7,7);
  219.      gotoxy(8,18);
  220.      printf("                                                          ");
  221.      gotoxy(8,18);
  222.       }
  223.    }
  224.    while(mistake == 1);
  225.    printf("%c",key);
  226.    delay(500);
  227.  
  228.    clrscr();
  229.    if (Model == 1)
  230.    {
  231.     printf("\n                      Model I: Select a formulation:   \n\n\n");
  232.     printf("   a: q = -1.0       -6<=Re(z)<=4       -5<=Im(z)<=5       [Fig. 53a]\n");
  233.     printf("   b: q = -0.1       -6<=Re(z)<=4       -5<=Im(z)<=5       [Fig. 53b]\n");
  234.     printf("   c: q =  0.0       -6<=Re(z)<=4       -5<=Im(z)<=5       [Fig. 53c]\n");
  235.     printf("   d: q =  1.0       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53d]\n");
  236.     printf("   e: q =  1.2       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53e]\n");
  237.     printf("   f: q =  1.6       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53f]\n");
  238.     printf("   g: q =  2.0       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53g]\n");
  239.     printf("   h: q =  2.5       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53h]\n");
  240.     printf("   i: q =  2.9       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53i]\n");
  241.     printf("   j: q =  3.0       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53j]\n");
  242.     printf("   k: q =  3.1       -5<=Re(z)<=5       -5<=Im(z)<=5       [Fig. 53k]\n");
  243.     printf("   l: q =  4.0       -4<=Re(z)<=6       -5<=Im(z)<=5       [Fig. 53l]\n");
  244.     printf("   m: q =  4.0     -5.5<=Re(z)<=7.9     -5<=Im(z)<=5       [Map 3]\n");
  245.     printf("   n: q = -0.1      0.8<=Re(z)<=2.0  2.635<=Im(z)<=3.535   [Map 4]\n");
  246.     printf("   o: q=~1.1+2.07i -0.5<=Re(z)<=1.5  -1.45<=Im(z)<=0.7     [Map 5]\n");
  247.     printf("   p: q=1.21+0.01i -2.1<=Re(z)<=-0.3  -0.5<=Im(z)<=0.5625  [Map 6]");
  248.     printf("\n\n   > ");
  249.     do
  250.     {
  251.       mistake = 0;
  252.       key = getch();
  253.       index = ("%d",key) - 96;
  254.       if (index < 1 || index > 16)
  255.       {
  256.      mistake = 1;
  257.      printf("%c%c%c",7,7,7);
  258.      gotoxy(6,22);
  259.      printf("                                                          ");
  260.      gotoxy(6,22);
  261.       }
  262.     }
  263.     while(mistake == 1);
  264.     printf("%c",key);
  265.     delay(500);
  266.    }
  267.    else if (Model == 2)
  268.    {
  269.     printf("\n\n                      Model II: Select a formulation:   \n\n\n");
  270.     printf("   a: q = 2.0       -15<=Re(z)<=15     -11<=Im(z)<=11      [Map 7]\n");
  271.     printf("   b: q = 1.2+2i   -3.2<=Re(z)<=3.8   -3.3<=Im(z)<=1.9     [Map 8-10]\n\n   > ");
  272.     do
  273.     {
  274.       mistake = 0;
  275.       key = getch();
  276.       index = ("%d",key) - 96;
  277.       if (index < 1 || index > 2)
  278.       {
  279.      mistake = 1;
  280.      printf("%c%c%c",7,7,7);
  281.      gotoxy(6,9);
  282.      printf("                                                          ");
  283.      gotoxy(6,9);
  284.       }
  285.     }
  286.     while(mistake == 1);
  287.     printf("%c",key);
  288.     delay(500);
  289.    }
  290.  
  291.    clrscr();
  292.    printf("\n\n                      Enter number of iterations:\n\n");
  293.    printf("                      a: 16\n");
  294.    printf("                      b: 64\n");
  295.    printf("                      c: 128\n");
  296.    printf("                      d: 256\n");
  297.    printf("                      e: 512\n\n");
  298.    printf("                      > ");
  299.    do
  300.    {
  301.       mistake = 0;
  302.       key = getch();
  303.       maxiter = ("%d",key) - 96;
  304.       if (maxiter < 1 || maxiter > 5)
  305.       {
  306.      mistake = 1;
  307.      printf("%c%c%c",7,7,7);
  308.      gotoxy(25,11);
  309.      printf("                                                          ");
  310.      gotoxy(25,11);
  311.       }
  312.    }
  313.    while(mistake == 1);
  314.    printf("%c",key);
  315.    delay(500);
  316.    if (maxiter == 1) maxiter = 16;
  317.    if (maxiter == 2) maxiter = 64;
  318.    if (maxiter == 3) maxiter = 128;
  319.    if (maxiter == 4) maxiter = 256;
  320.    if (maxiter == 5) maxiter = 512;
  321.  
  322.    if (Model == 1)
  323.    {
  324.       printf("\n\n                      Select an inside-coloring scheme:\n");
  325.       printf("\n                      a: Standard target set method for finite attractor");
  326.       printf("\n                      b: Alternate subtle gradient scheme\n\n");
  327.       printf("                      > ");
  328.    do
  329.    {
  330.       mistake = 0;
  331.       key = getch();
  332.       insidecolor = ("%d",key) - 96;
  333.       if (insidecolor < 1 || insidecolor > 2)
  334.       {
  335.      mistake = 1;
  336.      printf("%c%c%c",7,7,7);
  337.      gotoxy(25,18);
  338.      printf("                                                          ");
  339.      gotoxy(25,18);
  340.       }
  341.    }
  342.    while(mistake == 1);
  343.    printf("%c",key);
  344.    delay(500);
  345.    }
  346.  
  347.    clrscr();
  348.    installuserdriver("Svga256",DetectVGA256);
  349. //
  350. // Change the directory below to fit your own .BGI requirements.
  351. //
  352.    initgraph(&graphdriver, &graphmode, "C:\\BORLANDC\\BGI");
  353. }
  354.  
  355. //===========================================================================
  356. // Initialize parameters
  357. //===========================================================================
  358. void parameters(void)
  359. {
  360.       if (Vid == 1) { npix = 640; npiy = 400;}
  361.       if (Vid == 2) { npix = 640; npiy = 480;}
  362.       if (Vid == 3) { npix = 800; npiy = 600;}
  363.       if (Vid == 4) { npix =1024; npiy = 768;}
  364. //
  365. //    Defaults for the plotting window.
  366. //
  367.       xmin = -5.0; xmax = 5.0; ymin = -5.0; ymax = 5.0;
  368.  
  369.       if (Model == 1) {
  370.     if (index == 1) {xmin=-6.0, xmax=4.0; q=complex(-1.0,0.0);}
  371.     else
  372.     if (index == 2) {xmin=-6.0, xmax=4.0; q=complex(-0.1,0.0);}
  373.     else
  374.     if (index == 3) {xmin=-6.0, xmax=4.0; q=complex(0.0,0.0);}
  375.     else
  376.     if (index == 4) q=complex(1.0,0.0);
  377.     else
  378.     if (index == 5) q=complex(1.2,0.0);
  379.     else
  380.     if (index == 6) q=complex(1.6,0.0);
  381.     else
  382.     if (index == 7) q=complex(2.0,0.0);
  383.     else
  384.     if (index == 8) q=complex(2.5,0.0);
  385.     else
  386.     if (index == 9) q=complex(2.9,0.0);
  387.     else
  388.     if (index ==10) q=complex(3.0,0.0);
  389.     else
  390.     if (index ==11) q=complex(3.1,0.0);
  391.     else
  392.     if (index ==12) {xmin=-4.0, xmax=6.0; q=complex(4.0,0.0);}
  393.     else
  394.     if (index ==13) {xmin=-5.5, xmax=7.9; q=complex(4.0,0.0);}
  395.     else
  396.     if (index ==14) {xmin=0.8, xmax=2.0; ymin=2.635; ymax=3.535;
  397.              q=complex(-0.1,0.0);}
  398.     else
  399.     if (index ==15) {xmin=-0.5, xmax=1.5; ymin=-1.45; ymax=0.7;
  400.              q=complex(1.09582,2.07142);}
  401.     else
  402.     if (index ==16) {xmin=-2.1, xmax=-0.3; ymin=-0.5; ymax=0.5625;
  403.              q=complex(1.21,0.01);}
  404.     else {q=complex(1.2,0.0);}
  405.       }
  406.       else if (Model == 2) {
  407.     if (index ==1) {xmin=-15.0, xmax=15.0; ymin=-11.0; ymax=11.0;
  408.             q=complex(2.0,0.0);}
  409.     else
  410.     if (index ==2) {xmin=-3.2, xmax=3.8; ymin=-3.3; ymax=1.9;
  411.             q=complex(1.20,2.0);}
  412.     else {xmin=-3.2, xmax=3.8; ymin=-3.3; ymax=1.9;
  413.           q=complex(1.20,2.0);}
  414.       }
  415.  
  416.       if(fact>=1.0 || fact <=0.0)
  417.     fact = 1.0;
  418.       else {
  419.     npix = (int)(npix*fact);
  420.     npiy = (int)(npiy*fact);
  421.       }
  422.       ypy = (double)npiy - 0.5;
  423.       deltap = (xmax-xmin)/(npix-1);
  424.       deltaq = (ymax-ymin)/(npiy-1);
  425.  
  426.       if(ymin==-ymax)
  427.      npy = npiy/2;
  428.       else
  429.      npy = npiy;
  430. }
  431.  
  432. //===========================================================================
  433. // Do the calculations
  434. //===========================================================================
  435. void calculate(void)
  436. {
  437.      for (np=0; np<=npix-1; np++)
  438.      {
  439.        x = xmin + (double)np*deltap;
  440.        for (nq=0; nq<=npy-1; nq++)
  441.        {
  442.      y = ymin + (double)nq*deltaq;
  443.      k  = 0;
  444.      z = complex(x,y);
  445. // - - - Standard target set coloring scheme - - - - - - - - - - - - - - -
  446.      if (insidecolor==1)
  447.      {
  448.        do
  449.        {
  450.          preliminary();
  451. //
  452. //           Points which escape towards infinity.
  453. //
  454.          if (r >= maxiter)
  455.          {
  456.            ipen = ((5 * k)%255) + 1;
  457.            if (ymin == -ymax)
  458.            {
  459.          putpixel(np,nq,ipen);
  460.          putpixel(np,npiy-nq-1,ipen);
  461.            }
  462.            else putpixel(np,nq,ipen);
  463.          }
  464. //
  465. //           Points converging to (1,0).
  466. //
  467.          else if (zmag<0.00001)
  468.          {
  469.         ipen = ((k << 2)%100) + 156;
  470.         plotflag = 1;
  471.          }
  472. //
  473. //           Points converging to (0,0) (for Model 2).
  474. //
  475.          else if (r<0.00001)
  476.          {
  477.            ipen = ((k << 2)%50)+206;
  478.            plotflag = 1;
  479.          }
  480. //
  481. //           Any leftover points.
  482. //
  483.          else if (k == maxiter)
  484.          {
  485.         ipen = ((k << 2)%100) + 156;
  486.         plotflag = 1;
  487.          }
  488.  
  489.          if (plotflag)
  490.          {
  491.            if (ymin == -ymax)
  492.            {
  493.          ypy = double(npiy) - nq - 0.5;
  494.          putpixel(np,ypy,ipen);
  495.          putpixel(np,nq,ipen);
  496.            }
  497.            else putpixel(np,nq,ipen);
  498.            plotflag = 0;
  499.          }
  500.        } while (r<=maxiter && k<maxiter && zmag>=0.00001 && r>=0.00001);
  501.      }
  502. // - - - Alternative inside-coloring scheme - - - - - - - - - - - - - - - -
  503.      if (insidecolor==2)
  504.      {
  505.        do
  506.        {
  507.          preliminary();
  508.          if (k == 2) secondz = z;
  509. //
  510. //           Points which escape towards infinity.
  511. //
  512.          if (r >= maxiter)
  513.          {
  514.            ipen = ((5 * k)%255) + 1;
  515.            if (ymin == -ymax)
  516.            {
  517.          putpixel(np,nq,ipen);
  518.          putpixel(np,npiy-nq-1,ipen);
  519.            }
  520.            else
  521.          putpixel(np,nq,ipen);
  522.          }
  523. //
  524. //           Converging points.
  525. //
  526.          if (k == maxiter)
  527.          {
  528.            xmag = real(secondz) - 1;
  529.            ymag = imag(secondz);
  530.            zmag = sqrt(xmag * xmag + ymag * ymag);
  531.            ipen = ((int)(16 * zmag)%86)+170;
  532.            if (ymin == -ymax)
  533.            {
  534.          ypy = double(npiy) - nq - 0.5;
  535.          putpixel(np,ypy,ipen);
  536.          putpixel(np,nq,ipen);
  537.            }
  538.            else
  539.          putpixel(np,nq,ipen);
  540.          }
  541.        } while (r <= maxiter && k<=maxiter);
  542.      }
  543. // - - - End of inside coloring routines - - - - - - - - - - - - - - - - -
  544.        }
  545.        if(kbhit()) break;
  546.      }
  547.      getch();
  548. }
  549.  
  550. //==========================================================================
  551. // Preliminary calculations before plotting colors
  552. //==========================================================================
  553. void preliminary(void)
  554. {
  555. //           Definition for Model I magnets.
  556. //
  557.          if (Model == 1) z = (z*z + q - 1.0)/(2.0*z + q - 2.0);
  558. //
  559. //           Definition for Model II magnets.
  560. //
  561.          else if (Model == 2)
  562.          {
  563.            a = q - 1.0;
  564.            b = q - 2.0;
  565.            ab = a*b;
  566.            z2 = z*z;
  567.            z = (z*z2 + 3.0*a*z + ab)/(3.0*z2 + 3.0*b*z + ab + 1.0);
  568.          }
  569.          z = z*z;
  570.          r = abs(z);
  571.          xmag = real(z) - 1;
  572.          ymag = imag(z);
  573.          zmag = sqrt(xmag * xmag + ymag * ymag);
  574.          k++;
  575. }
  576.  
  577. //==========================================================================
  578. // Function to set all 256 color registers
  579. //==========================================================================
  580. #pragma warn -eff
  581. void setVGApalette(char *buffer)
  582. {
  583.    int i, j;
  584.  
  585.    for (i=0;i<256;i++)
  586.    {
  587.       outp(0x3c8, i);
  588.       for (j=0;j<3;j++)
  589.      outp(0x3c9, *buffer++);
  590.    }
  591. }
  592. #pragma warn +eff
  593.