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

  1. //
  2. //+----------------------------------------------------------------------+
  3. //+ Program SIEGEL.CPP                                                   +
  4. //+ By Fausto A. A. Barbuto, BJ06@C53000.PETROBRAS.ANRJ.BR               +
  5. //+ Rio de Janeiro, BRAZIL, on May 13, 1994.                             +
  6. //+                                                                      +
  7. //+ Plots a Julia set of the type z -> z^2 + lambda*z, where lambda =    +
  8. //+ exp(2*Pi*GM*i) and GM = (5^(1/2) - 1)/2 (Golden Mean). Siegel disks  +
  9. //+ (are they in fact Siegel disks? I'm not sure) are shown in the inner +
  10. //+ part of the plot.                                                    +
  11. //+                                                                      +
  12. //+ Case with z -> z^2 + 1.001*z*exp(2*Pi*i/20) added Sunday, May 15.    +
  13. //+ (see Fig. 30, pg. 40)                                                +
  14. //+                                                                      +
  15. //+                                                                      +
  16. //+ REFERENCE: Peitgen, H.-O. & Richter, P.H.: "The Beauty of Fractals", +
  17. //+            Springer-Verlag, 1986, pg. 30-31, pg. 77 (Map 25).        +
  18. //+                                                                      +
  19. //+ Needs SVGA256.BGI and SVGA256.H (from SVGABG50 package by Jordan     +
  20. //+ Hargrave).                                                           +
  21. //+                                                                      +
  22. //+ Authorized version for spanky.triumf.ca site (Vancouver, BC, CANADA).+
  23. //+----------------------------------------------------------------------+
  24. //
  25. #include <stdio.h>
  26. #include <conio.h>
  27. #include <graphics.h>
  28. #include <math.h>
  29. #include <stdlib.h>
  30. #include <complex.h>
  31. #include "Svga256.h"
  32.  
  33. //void far initgraph(int far *,int far *,char far *);
  34.  
  35. int Vid;  //* Global variable *//
  36.  
  37. int huge DetectSVGA256()
  38. {
  39.   printf("\n  Which video mode would you like to use? \n\n");
  40.   printf("  0 - 320x200x256\n");
  41.   printf("  1 - 640x400x256\n");
  42.   printf("  2 - 640x480x256\n");
  43.   printf("  3 - 800x600x256\n");
  44.   printf("  4 - 1024x768x256\n\n  ==> ");
  45.   scanf("%d",&Vid);
  46.   return Vid;
  47. }
  48.  
  49. void main(void)
  50. {
  51.       complex lambda, i;
  52.       double xmin, xmax, ymin, ymax, r, R1, I1, RL, IL;
  53.       double x,y, x0,y0, GM, deltax,deltay, s1, s2, Pi=3.1415926535897932;
  54.       register int npix, npiy, kcolor=1024, k, np, nq, ipen;
  55.       int graphdriver=DETECT, graphmode, icase;
  56.  
  57.       clrscr();
  58.       printf("\n  Program SIEGEL.CPP \n");
  59.       printf("\n\n  By Fausto A. A. Barbuto, May 14, 1994");
  60.       printf("\n  Rio de Janeiro, Federal Republic of Brazil");
  61.       printf("\n  E-mail: BJ06@C53000.PETROBRAS.ANRJ.BR\n\n");
  62.       printf("\n  Reference: Peitgen, H.-O., and Richter, P.H. :");
  63.       printf("\n  'The Beauty of Fractals', Springer-Verlag, 1986");
  64.       printf("\n  Section 2, pp. 27-32\n\n");
  65.       printf("\n  Enter the case:\n");
  66.       printf("\n  (1) z -> z*z +   lambda*z  [lambda=exp(2*Pi*i*GM)]\n");
  67.       printf("                   [GM = Golden Mean = (5^(1/2) - 1.0)/2]\n");
  68.       printf("\n  (2) z -> z*z + s*lambda*z (lambda=exp(2*Pi*i/20), s=1.001");
  69.       printf("\n\n > ");
  70.       scanf("%d",&icase);
  71.       if ((icase < 1) || (icase > 2)) icase = 1;
  72.       clrscr();
  73.  
  74.       installuserdriver("Svga256",DetectSVGA256);
  75.       initgraph(&graphdriver, &graphmode, "C:\\Borlandc\\Bgi");
  76.  
  77.       if (Vid == 0) {npix = 320; npiy = 200;}
  78.       if (Vid == 1) {npix = 640; npiy = 400;}
  79.       if (Vid == 2) {npix = 640; npiy = 480;}
  80.       if (Vid == 3) {npix = 800; npiy = 600;}
  81.       if (Vid == 4) {npix =1024; npiy = 768;}
  82.       if((Vid<0) || (Vid)>4) Vid = 2;
  83.  
  84.       GM = 0.5*(sqrt(5.0) - 1.0);  //* The Golden Mean *//
  85.       i = complex(0.0,1.0);
  86.  
  87.       if (icase == 1) {
  88.     lambda = exp(2.0*Pi*GM*i);
  89.     xmin = -1.05; xmax = 1.75;
  90.     ymin = -0.75; ymax = 1.45;
  91.       }
  92.       else {
  93.     lambda = 1.001*exp(0.1*Pi*i);
  94.     xmin = -1.75; xmax = 0.75;
  95.     ymin = -1.40; ymax = 1.15;
  96.       }
  97.       RL = real(lambda);
  98.       IL = imag(lambda);
  99.       deltax = (xmax-xmin)/(npix-1);
  100.       deltay = (ymax-ymin)/(npiy-1);
  101.  
  102.       cleardevice();
  103.       for (np=0; np<=npix-1; np++) {
  104.     x0 = xmin + (double)np*deltax;
  105.     for (nq=0; nq<=npiy-1; nq++) {
  106.     y0 = ymin + (double)nq*deltay;
  107.     x = x0;
  108.     y = y0;
  109.     k  = 0;
  110.  
  111.      do {
  112.        s1 = (x+RL);
  113.        s2 = (y+IL);
  114.        R1 = x*s1 - y*s2;
  115.        I1 = x*s2 + y*s1;
  116.        r = sqrt(R1*R1 + I1*I1);
  117.        k++;
  118. //*
  119. //*        If r >= kcolor the point escapes towards infinity.
  120. //*
  121.        if (r >= kcolor) {
  122.          ipen = 29 + k;
  123.          putpixel(np,nq,ipen);
  124.        }
  125. //*
  126. //*        Converging points.
  127. //*
  128.        if (k == kcolor) {
  129. //*
  130. //*          The colour shades of the "Siegel disks" (?) are defined here.
  131. //*          (as function of the  distance between the present point [x,y]
  132. //*          and the "invariant" point [x=0,y=0])
  133. //*
  134.          ipen = 17 + (int)(25.0*sqrt(x*x+y*y));
  135.          putpixel(np,nq,ipen);
  136.        }
  137. //*
  138. //*        Returns if no convergence's achieved on either escape or atraction.
  139. //*
  140.        x = R1;
  141.        y = I1;
  142.      } while (r<=kcolor && k<=kcolor);
  143.        }
  144.        if(kbhit()) break;
  145.      }
  146. //*
  147. //*  Clean-up.
  148. //*
  149.      getch();
  150.      closegraph();
  151. }
  152.