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

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <graphics.h>
  4. #include <math.h>
  5. #include <complex.h>
  6. #include "svga256.h"
  7. //void far initgraph(int far *,int far *,char far *);
  8. //    PROGRAMA MANDELBROT_SHADINGS_1
  9. //
  10. //    By Fausto A. A. Barbuto, December 1993
  11. //    (After a program by Fausto Barbuto and Jay R. Hill, 1993)
  12. //
  13. //    Plots the Mandelbrot Set with period checking.
  14. //
  15. //    Period 1 (also known as Main Cardioid) ---> is in colour
  16. //    shadings from green to blue;
  17. //
  18. //    Formulation:
  19. //               abs(1.0 - sqrt(1.0-4.0*c)) <= 1.0
  20. //
  21. //    Period 2 (also known as Main Circle) ---> is in colour
  22. //    shadings from blue to orange;
  23. //
  24. //    Formulation:
  25. //               abs(4.0*(c+1.0)) <= 1.0
  26. //
  27. //    Period 3 Buds (no generic name: periodic detected by Fausto Barbuto
  28. //                   and Jay R. Hill, 1993) ---> is in dark blue;
  29. //    Formulation:
  30. //               p1*p1 + q1*q1 <= 0.0089138
  31. //               p1 = p + 0.12486
  32. //               q1 = fabs(q) - 0.7439
  33. //
  34. //    Period 4 (no generic name: periodic detected by Fausto Barbuto, 1993)
  35. //             ---> is in dark blue;
  36. //    Formulation:
  37. //               abs(c+1.309) <= 0.0588
  38. //
  39. //    Other MSet points which do not belong to any of these periods are
  40. //    coloured in dark blue.
  41. //
  42. //    Escaped points (external to the MSet) are in shadings from blue to
  43. //    yellow.
  44. //
  45. //    PS: Needs SVGA256.BGI Graphics Driver and SVGA screen with 1024 x 768
  46. //        points and 256 colours.
  47. //
  48.  
  49. int huge DetectVGA256()
  50. {
  51.   int Vid=4;
  52.   return Vid;
  53. }
  54.  
  55. void main()
  56. {
  57.       double pmin=-2.05, pmax=0.5, qmin=-1.125, qmax=1.125, fact=1.0;
  58.       double ypy,x,y,xp,yp,p,q,p1,q1,ya,xkp1,ykp1,r,c_scr=0.833333;
  59.       double deltap, deltaq, r1=8.9138e-3, r2=5.88e-2;
  60.       double test1, test2, test3, test4;
  61.       register int npix=1024, npiy=768;
  62.       register long int maxiter=512;
  63.       register int k, np, nq, npy, ipen, icolour;
  64.       complex c;
  65.       int graphdriver=DETECT, graphmode;
  66.  
  67.       installuserdriver("Svga256",DetectVGA256);
  68.       initgraph(&graphdriver, &graphmode, "c:\\borlandc\\bgi");
  69.       if(fact>=1.0 || fact <=0.0)
  70.         fact = 1.0;
  71.       else {
  72.         npix = (int)(npix*fact);
  73.         npiy = (int)(npiy*fact);
  74.       }
  75.       ypy = (double)npiy - 0.5;
  76.       deltap = (pmax-pmin)/(npix-1);
  77.       deltaq = (qmax-qmin)/(npiy-1);
  78.  
  79.       if(qmin==-qmax)
  80.          npy = npiy/2;
  81.       else
  82.          npy = npiy;
  83.  
  84.      cleardevice();
  85.      for (np=0; np<=npix-1; np++) {
  86.        p = pmin + (double)np*deltap;
  87.        for (nq=0; nq<=npy-1; nq++) {
  88.          q = qmin + (double)nq*deltaq;
  89.          k  = 0;
  90.          x = 0.0;
  91.          y = 0.0;
  92.          c = complex(p,q);
  93. //
  94. //-------Checks limits for Period 1.
  95. //
  96.          test1 = 2.0;
  97.          if ((p >= -7.55e-1) && (p <= 4.0e-1)) {
  98.            if ((q >= -6.6e-1) && (q <= 6.6e-1))
  99.               test1 = abs(1.0 - sqrt(1.0-4.0*c));
  100.          }
  101. //
  102. //-------Checks limits for Period 2.
  103. //
  104.          test2 = 2.0;
  105.          if ((p >= -1.255e0) && (p <= -7.45e-1)) {
  106.            if ((q >= -2.55e-1) && (q <= 2.55e-1)) test2 = abs(4.0*(c+1.0));
  107.          }
  108. //
  109. //-------Checks limits for Period Bud 3.
  110. //
  111.          test3 = 2.0;
  112.          if ((p >= -2.4e-1) && (p <= 0.0e0)) {
  113.            if ((q >= -8.5e-1) && (q <= 8.5e-1)) {
  114.              p1 = p + 1.2486e-1;
  115.              q1 = fabs(q) - 7.4396e-1;
  116.              test3 = p1*p1 + q1*q1;
  117.            }
  118.          }
  119. //
  120. //-------Checks limits for Period 4.
  121. //
  122.          test4 = 2.0;
  123.          if ((p >= -1.37e0) && (p <= -1.245e0)) {
  124.            if ((q >= -6.1e-2) && (q <= 6.1e-2)) test4 = abs(c+1.309);
  125.          }
  126. //
  127.          if((test1<=1.0) || (test2<=1.0) || (test3<=r1) || (test4<=r2)) {
  128.             if (test3<=r1)  ipen=1;
  129.             if (test4<=r2)  ipen=1;
  130.             xp = c_scr*(double)np;
  131.             yp = (double)nq;
  132.             if (test1<=1.0) {
  133.               ipen = 33 + (int)(15.0*test1);
  134.             }
  135.             if (test2<=1.0) {
  136.               ipen = 42 - (int)(10.0*test2);
  137.             }
  138.             if (qmin == -qmax) {
  139.               putpixel(xp,yp,ipen);
  140.               putpixel(xp,npiy-yp-1.0,ipen);
  141.             }
  142.             else
  143.               putpixel(xp,yp,ipen);
  144.             }
  145.          else {
  146.             do {
  147.              xkp1 = (x+y)*(x-y) + p;
  148.              ya   = x*y;
  149.              ykp1 = ya + ya + q;
  150.              r    = xkp1*xkp1 + ykp1*ykp1;
  151.              k++;
  152. //
  153. //    If R > M, points escape towards infinity.
  154. //    Se R > M, os pontos escapam para o infinito.
  155. //
  156.              if (r >= maxiter) {
  157.                ipen = 28 + k;
  158.                xp = c_scr*(double)np;
  159.                yp = (double)nq;
  160.                if (qmin == -qmax) {
  161.                  putpixel(xp,yp,ipen);
  162.                  putpixel(xp,npiy-yp-1.0,ipen);
  163.                }
  164.                else
  165.                  putpixel(xp,yp,ipen);
  166.              }
  167. //
  168. //    Points which do not belong to any period: Colour=1=Blue
  169. //    Pontos que nao pertencem a quaisquer periodos: coloracao negra.
  170. //
  171.              if (k == maxiter) {
  172.                xp = c_scr*(double)np;
  173.                yp = (double)nq;
  174.                ipen = 1;
  175.                if (qmin == -qmax) {
  176.                  ypy = double(npiy) - yp - 0.5;
  177.                  putpixel(xp,ypy,ipen);
  178.                  putpixel(xp,yp,ipen);
  179.                }
  180.                else
  181.                  putpixel(xp,yp,ipen);
  182.              }
  183. //
  184. //    Returns if no convergence is achieved on either escape or atraction.
  185. //    Retorna se nao houver convergencia na fuga ou atracao.
  186. //
  187.              x = xkp1;
  188.              y = ykp1;
  189.            } while (r <= maxiter && k<=maxiter);
  190.          }
  191.        }
  192.        if(kbhit()) break;
  193.      }
  194.      getch();
  195.      closegraph();
  196. }
  197.