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

  1. //
  2. //+---------------------------------------------------------------------+
  3. //+ PROGRAM SPIRAL.CPP                                                  +
  4. //+ By Fausto A. A. Barbuto - Rio de Janeiro, BRAZIL, June 25, 1994.    +
  5. //+ E-mail: BJ06@C53000.PETROBRAS.ANRJ.BR                               +
  6. //+                                                                     +
  7. //+ Plots spiral plant forms from a randomic complex number u = v + wi. +
  8. //+                                                                     +
  9. //+ REFERENCE: Pickover, Clifford A.: "Computers, Pattern, Chaos and    +
  10. //+            Beauty", St. Martin's Press, New York, 1990;  pg. 203    +
  11. //+            (Pseudocode 12.1)                                        +
  12. //+                                                                     +
  13. //+ Random number generator by Michael Sargent, msargent@moose.uvm.edu. +
  14. //+ SVGA256.BGI graphic driver by Jordan Powell Hargrave.               +
  15. //+                                                                     +
  16. //+ Press ESC at any time to stop execution, or PAUSE to freeze.        +
  17. //+                                                                     +
  18. //+---------------------------------------------------------------------+
  19. //
  20. #include <stdio.h>
  21. #include <conio.h>
  22. #include <graphics.h>
  23. #include <math.h>
  24. #include <stdlib.h>
  25. #include <complex.h>
  26. #include "svga256.h"
  27.  
  28. double qsrandom(void);
  29. int Vid;  //* Global variable *//
  30.  
  31. int huge DetectVGA256()
  32. {
  33.   printf("\n Which video mode would you like to use? \n\n");
  34.   printf(" 0 - 320x200x256\n");
  35.   printf(" 1 - 640x400x256\n");
  36.   printf(" 2 - 640x480x256\n");
  37.   printf(" 3 - 800x600x256\n");
  38.   printf(" 4 - 1024x768x256\n\n> ");
  39.   scanf("%d",&Vid);
  40.   return Vid;
  41. }
  42.  
  43. void main(void)
  44. {
  45.      double x, xmin, xmax, y, ymin, ymax, deltax, deltay;
  46.      double v, w, Tolerance=10.0;
  47.      complex a, b, c, d, e, f, u, z;
  48.      int npix, npiy, nx, ny, k, icount;
  49.      int graphdriver=DETECT, graphmode;
  50.  
  51.      clrscr();
  52.      printf(" Program PLANTS.CPP \n\n\n");
  53.      installuserdriver("Svga256",DetectVGA256);
  54.      initgraph(&graphdriver, &graphmode, "C:\\BORLANDC\\BGI");
  55.  
  56.      if (Vid == 0) { npix = 320; npiy = 200;}
  57.      if (Vid == 1) { npix = 640; npiy = 400;}
  58.      if (Vid == 2) { npix = 640; npiy = 480;}
  59.      if (Vid == 3) { npix = 800; npiy = 600;}
  60.      if (Vid == 4) { npix =1024; npiy = 768;}
  61.      if ((Vid>4) || (Vid<0)) { npix = 640; npiy = 480;}
  62.  
  63.      xmin=-2.0; xmax=2.00;
  64.      ymin=-2.0; ymax=2.00;
  65.      deltax = (xmax-xmin)/(npix-1);
  66.      deltay = (ymax-ymin)/(npiy-1);
  67.      icount = 0;
  68.  
  69.      do {
  70.        cleardevice();
  71.        if (icount == 0) {   //* As suggested on Dr. Pickover's book *//
  72.      v = 0.35;
  73.      w = 0.35;
  74.        }
  75.        else {               //* Random v & w *//
  76.      w = qsrandom();    //* Not all combinations of v,w will be able to
  77.      v = qsrandom();    //* generate beatiful structures. Be patient!
  78.        }
  79.        icount=1;
  80.        u = complex(v,w);
  81.  
  82.        for (nx=0; nx<=npix-1; nx++) {
  83.      x = xmin + (double)nx*deltax;
  84.      for (ny=0; ny<=npiy-1; ny++) {
  85.        y = ymin + (double)ny*deltay;
  86.        a = complex(0.0,0.0);
  87.        b = a; c = a; d = a; e = a; f = a;
  88.        z = complex(x,y);
  89.        for (k=1;k<=31;k++) {  //* Inner Loop *//
  90.          a = z;
  91.          e = a*a + u;
  92.          c = e*e + u;
  93.          b = c*c + u;
  94.          f = b;
  95.          a = f*f + u;
  96.          z = a;
  97.          if (abs(z) > Tolerance) break;
  98.          else  //* A few gray contours are OK. *//
  99.            putpixel(nx,ny,18+(int)(abs(z)));
  100.        }
  101.        if ((fabs(real(z)) < Tolerance) || (fabs(imag(z)) < Tolerance))
  102.          putpixel(nx,ny,k+31); //* Hey, aren't these Julia sets??? *//
  103.      }
  104.      if (kbhit()) break;
  105.        }
  106.      } while (!kbhit());
  107. //
  108. //---Clean up and end.
  109. //
  110.      getch();
  111.      closegraph();
  112. }
  113. //
  114. //---qsrandom function by Mike Sargent.
  115. //
  116. double qsrandom(void)
  117. {
  118.    int random_integer, temp_integer;
  119.    double random_double, temp_double;
  120.     
  121.    random_integer = random(RAND_MAX);
  122.    random_double = (double)random_integer / RAND_MAX;
  123.     
  124.    temp_integer = random(30519);
  125.    temp_double = (double)temp_integer / 1000000000L;
  126.    random_double += temp_double;
  127.  
  128.    return(random_double);
  129. }
  130.