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

  1. //+------------------------------------------------------------------------+
  2. //+ PROGRAM GHOSTS.CPP                                                     +
  3. //+                                                                        +
  4. //+ By Ramiro Perez (rperez%ns.pa@uga.cc.uga.edu) and Fausto A. A. Barbuto +
  5. //+ (BJ06@C53000.PETROBRAS.ANRJ.BR), August 17, 1994.                      +
  6. //+                                                                        +
  7. //+ Plots phantom-like Julia sets; very fast.  Initial parameters cx & cy  +
  8. //+ are randomically generated. Press any key to jump to another plot and  +
  9. //+ ESC to quit.                                                           +
  10. //+                                                                        +
  11. //+ Uses SVGA256 Package by Jordan Powell Hargrave  (hargrave@dellgate.us. +
  12. //+ dell.com) and  Random Number Generator plus Screen Fading routines by  +
  13. //+ Michael Sargent (msargent@moose.uvm.edu) and Quintessential Sophistry. +
  14. //+------------------------------------------------------------------------+
  15. #include <math.h>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <conio.h>
  19. #include <graphics.h>
  20. #include <dos.h>
  21. #include "svga256.h"
  22.  
  23. double qsrandom(void);
  24. void fade(void);
  25.  
  26. int Video;
  27.  
  28. int huge DetectSVGA256()
  29. {
  30.   clrscr();
  31.   printf("\n Program GHOSTS.CPP ");
  32.   printf("\n\n\n Which video mode would you like to use? \n\n");
  33.   printf(" 0 - 320x200x256\n");
  34.   printf(" 1 - 640x400x256\n");
  35.   printf(" 2 - 640x480x256\n");
  36.   printf(" 3 - 800x600x256\n");
  37.   printf(" 4 - 1024x768x256\n\n> ");
  38.   scanf("%d",&Video);
  39.   if ((Video>4) || (Video<0)) Video = 2;
  40.   return Video;
  41. }
  42.  
  43. void main(void)
  44. {
  45.    int i, npix, npiy, graphdriver=DETECT, graphmode, k, size, dist;
  46.    double a[3] = {0.5, 0.95, 0.05};
  47.    double x[3], y[3], PI, rand1, rand2, cx, cy, wx, wy, theta, r, xt, yt;
  48.    char choicekey, buffer[15];
  49.  
  50.    installuserdriver("Svga256",DetectSVGA256);
  51.    initgraph(&graphdriver,&graphmode,"C:\\BORLANDC\\BGI");
  52.  
  53.    if (Video == 0) { npix =  80; npiy =  50; size = 4; dist = 10;}
  54.    if (Video == 1) { npix = 160; npiy = 100; size = 5; dist = 13;}
  55.    if (Video == 2) { npix = 160; npiy = 120; size = 6; dist = 16;}
  56.    if (Video == 3) { npix = 200; npiy = 150; size = 7; dist = 21;}
  57.    if (Video == 4) { npix = 256; npiy = 192; size = 8; dist = 26;}
  58.  
  59.    PI = 3.1415926535897932;
  60.  
  61.    do {
  62.       for (i=0;i<=2;i++) {
  63.      x[i] = 0.0;
  64.      y[i] = 0.0;
  65.       }
  66.       rand1 = 0.5*(qsrandom() + qsrandom());
  67.       if (rand1 > 0.5) cx = -2.25*qsrandom();
  68.       else cx = 0.75*qsrandom();
  69.  
  70.       if (cx < 0) cy = 0.65*cx + 1.5;
  71.       else cy = -1.8*cx + 1.5;
  72.  
  73.       rand1 = qsrandom();
  74.       rand2 = qsrandom();
  75.       cy = cy*(rand1 - rand2);
  76.       cleardevice();
  77.       setcolor(39);
  78.       settextstyle(SMALL_FONT,HORIZ_DIR,size);
  79.       sprintf(buffer," cx = %+e  ",cx);
  80.       outtextxy(0,0,buffer);
  81.       sprintf(buffer," cy = %+e  ",cy);
  82.       outtextxy(0,dist,buffer);
  83.  
  84.       do {
  85.      for (i=0;i<=2;i++) {
  86.         wx = x[i] - cx;
  87.         wy = y[i] - cy;
  88.         if (wx > 0) theta = atan(wy/wx);
  89.         if (wx < 0) theta = PI + atan(wy/wx);
  90.         if (wx == 0) theta = 0.5*PI;
  91.         theta = 0.5*theta;
  92.         r = wx*wx + wy*wy;
  93.         r = sqrt(sqrt(sqrt(r*r*r)));
  94.         rand1 = qsrandom();
  95.         if (rand1 > a[i]) r = -r;
  96.         x[i] = r*cos(theta);
  97.         y[i] = r*sin(theta);
  98.         putpixel((int)npix*(x[i]+2.0),(int)npiy*(y[i]+2.0),34);
  99.         putpixel((int)npix*(2.0-x[i]),(int)npiy*(2.0-y[i]),33);
  100.      }
  101.      rand1 = qsrandom();
  102.      if (rand1 < 0.1) {
  103.         xt = x[1];
  104.         yt = y[1];
  105.         x[1] = x[2];
  106.         y[1] = y[2];
  107.         x[2] = xt;
  108.         y[2] = yt;
  109.      }
  110.       } while (!kbhit());
  111.       choicekey = getch();
  112.    } while (choicekey != 0x1B);
  113.    fade();
  114.    closegraph();
  115. }
  116.  
  117. double qsrandom(void)
  118. {
  119.    int random_integer, temp_integer;
  120.    double random_double, temp_double;
  121.     
  122.    random_integer = random(RAND_MAX);
  123.    random_double = (double)random_integer / RAND_MAX;
  124.     
  125.    temp_integer = random(30519);
  126.    temp_double = (double)temp_integer / 1000000000L;
  127.    random_double += temp_double;
  128.  
  129.    return(random_double);
  130. }
  131.  
  132. #pragma warn -eff
  133. void fade(void)
  134. {
  135.    int a, b, p1, p2, p3;
  136.  
  137.    for (a=0; a<64; a++)
  138.    {
  139.       for (b=0; b<256; b++)
  140.       {
  141.      outp(0x3C7, b);
  142.      p1 = inp(0x3C9);
  143.      p2 = inp(0x3C9);
  144.      p3 = inp(0x3C9);
  145.      outp (0x3C8, b);
  146.      if (p1 > 0) outp(0x3C9, p1 - 1);
  147.         else outp(0x3C9, 0);
  148.      if (p2 > 0) outp(0x3C9, p2 - 1);
  149.         else outp(0x3C9, 0);
  150.      if (p3 > 0) outp(0x3C9, p3 - 1);
  151.         else outp(0x3C9, 0);
  152.       }
  153.    delay(50);
  154.    }
  155. }
  156. #pragma warn +eff
  157.