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

  1. //
  2. //+---------------------------------------------------------------------+
  3. //+ Program LORENZ.CPP                                                  +
  4. //+ By Ramiro Perez {RPEREZ@UTPVM1.BITNET}, (Panama)                    +
  5. //+ and Fausto A. A. Barbuto {BJ06@C53000.PETROBRAS.ANRJ.BR}, (Brazil). +
  6. //+ C++ 3.1 programme's creator: Fausto A. A. Barbuto, April 14, 1994.  +
  7. //+ After a TURBO BASIC program by Ramiro Perez.                        +
  8. //+                                                                     +
  9. //+ Plots Lorenz attractors with shaded, colourful spheres.             +
  10. //+                                                                     +
  11. //+ SVGA 256 colours version. Needs SVGA256.BGI and SVGA256.H.          +
  12. //+ We suggest to change the start-up values of the arrays xa, ya, and  +
  13. //+ za to witness how the attractor's shape change.                     +
  14. //+ Press any key to stop and PAUSE to freeze the execution.            +
  15. //+ Authorized version for spanky.triumf.ca site.                       +
  16. //+---------------------------------------------------------------------+
  17. //
  18. #include <graphics.h>
  19. #include <conio.h>
  20. #include <stdio.h>
  21. #include <dos.h>
  22. #include "svga256.h"
  23.  
  24. void Draw (double, double, int);
  25. int Vid;  //Global variable
  26.  
  27. int huge DetectSVGA256()
  28. {
  29.   printf("\nWhich video mode would you like to use? \n\n");
  30.   printf(" 0 - 320x200x256\n");
  31.   printf(" 1 - 640x400x256\n");
  32.   printf(" 2 - 640x480x256\n");
  33.   printf(" 3 - 800x600x256\n");
  34.   printf(" 4 - 1024x768x256\n\n> ");
  35.   scanf("%d",&Vid);
  36.   if((Vid<0) || (Vid)>4) Vid = 2;
  37.   return Vid;
  38. }
  39.  
  40. void main()
  41. {
  42.     int c, b, a, l, Iopt;
  43.     double c1, cl, dt, xa[2], ya[2], za[2], x, y, z, x1, y1, z1, xd, yd;
  44.     int graphdriver=DETECT, graphmode;
  45.  
  46.     clrscr();
  47.     printf("\n                           Program LORENZ.CPP\n\n");
  48.     printf("\n    Select an option:\n\n");
  49.     printf("\n                0: Ramiro's default start-up values;\n");
  50.     printf("\n                1: Enter your own start-up values;\n\n>> ");
  51.     scanf("%d",&Iopt);
  52.     if ((Iopt > 1) || (Iopt < 0)) Iopt = 0;
  53.     clrscr();
  54.  
  55.     if (Iopt == 1) {
  56.       printf("\n Enter initial value for xa[0] (-99: default is used)\n> ");
  57.       scanf("%lf",&xa[0]);
  58.       if (xa[0] == -99.0) xa[0] = 3.051522;
  59.       printf("\n Enter initial value for xa[1] (-99: default is used)\n> ");
  60.       scanf("%lf",&xa[1]);
  61.       if (xa[1] == -99.0) xa[1] = 3.051522;
  62.       printf("\n Enter initial value for ya[0] (-99: default is used)\n> ");
  63.       scanf("%lf",&ya[0]);
  64.       if (ya[0] == -99.0) ya[0] = 1.592542;
  65.       printf("\n Enter initial value for ya[1] (-99: default is used)\n> ");
  66.       scanf("%lf",&ya[1]);
  67.       if (ya[1] == -99.0) ya[1] = 1.582542;
  68.       printf("\n Enter initial value for za[0] (-99: default is used)\n> ");
  69.       scanf("%lf",&za[0]);
  70.       if (za[0] == -99.0) za[0] = 15.62388;
  71.       printf("\n Enter initial value for za[1] (-99: default is used)\n> ");
  72.       scanf("%lf",&za[1]);
  73.       if (za[1] == -99.0) za[1] = 15.62388;
  74.       clrscr();
  75.     }
  76.  
  77.     installuserdriver("Svga256",DetectSVGA256);
  78.     initgraph(&graphdriver,&graphmode,"C:\\BORLANDC\\BGI");
  79.     cleardevice();
  80.  
  81.     c1 = 0.292893;
  82.     dt = 0.02;
  83.     a  = 5;
  84.     b  = 15;
  85.     c  = 1;
  86. //
  87. //  Default start-up values for xa, ya and za.
  88. //
  89.     if (Iopt == 0) {
  90.       xa[0] = 3.051522;
  91.       ya[0] = 1.592542;
  92.       za[0] = 15.62388;
  93.       xa[1] = xa[0];
  94.       ya[1] = 1.582542;
  95.       za[1] = za[0];
  96.     }
  97.  
  98.     do {
  99.       for (l=0;l<=1;l++) {
  100.     x = xa[l];
  101.     y = ya[l];
  102.     z = za[l];
  103.     x1 = x - a*x*dt + a*y*dt;
  104.     y1 = y + b*x*dt - y*dt - z*x*dt;
  105.     z1 = z - c*z*dt + x*y*dt;
  106.     x = x1;
  107.     y = y1;
  108.     z = z1;
  109.     xd = y - x*c1;
  110.     yd = z + x*c1;
  111.     if (l==1) {
  112.       cl = 0;
  113.       Draw(xd,yd,cl);
  114.     }
  115.     else {
  116.       cl = 7;
  117.       Draw(xd,yd,cl);
  118.     }
  119.     delay(4);  //Change the time delay to see it slower/faster;
  120.     xa[l] = x;
  121.     ya[l] = y;
  122.     za[l] = z;
  123.       }
  124.     } while (!kbhit());
  125.     getch();
  126.     closegraph();
  127. }
  128.  
  129. void Draw (double xd, double yd, int cl)
  130. {
  131.     double i1, j1, c, c1, c2, d1, d2;
  132.     int i, k, colour;
  133.  
  134.     if (Vid == 0) { c1 =  9.7; c2 = 160.0; d1 =  4.6; d2 = 175.0; k=4;}
  135.     if (Vid == 1) { c1 = 19.3; c2 = 325.0; d1 =  9.2; d2 = 345.0; k=7;}
  136.     if (Vid == 2) { c1 = 19.3; c2 = 320.0; d1 = 11.0; d2 = 392.0; k=7;}
  137.     if (Vid == 3) { c1 = 30.0; c2 = 400.0; d1 = 17.1; d2 = 550.0; k=9;}
  138.     if (Vid == 4) { c1 = 38.4; c2 = 500.0; d1 = 21.9; d2 = 675.0; k=12;}
  139.  
  140.     i1 = c1*xd + c2;
  141.     j1= -d1*yd + d2;
  142.  
  143.     for (i=1;i<=7;i++) {
  144.       c = 0.09*i;
  145.       colour = (i + cl) + 33;
  146.       setcolor(colour);
  147.       setfillstyle(SOLID_FILL,k);
  148.       circle ((int)(i1+c),(int)(j1+c),k);
  149.       k--;
  150.     }
  151.     return;
  152. }
  153.  
  154.