home *** CD-ROM | disk | FTP | other *** search
/ Game Developers Magazine 3 / GDM003.ZIP / CIRCDRAW.C < prev    next >
C/C++ Source or Header  |  1994-02-25  |  5KB  |  188 lines

  1. // CIRCDRAW.C - General Circle Drawing
  2.  
  3. // Written by Phil Inch for Game Developers Magazine (issue 3).
  4. // Contributed to the public domain.
  5.  
  6. // This program written and compiled with Borland C++ v3.1
  7. // Compatibility with other compilers is not guaranteed.
  8.  
  9. // Usage of this program is subject to the disclaimer printed
  10. // in the magazine.  You assume all risks associated with the use
  11. // of this program.
  12.  
  13.  
  14. #include <stdio.h>
  15. #include <conio.h>
  16. #include <time.h>
  17. #include <dos.h>
  18. #include <mem.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include <math.h>
  22.  
  23. const float PI = 3.1415927;
  24. char far *screen=MK_FP(0xA000,0);
  25.  
  26. /* These arrays hold the floating point cos and sin values, as per the
  27. "medium speed" example */
  28. float FPCosArray[360], FPSinArray[360];
  29.  
  30. /* These arrays hold the integer cos and sin values, as per the "fast"
  31. example */
  32. int   INTCosArray[360], INTSinArray[360];
  33.  
  34. void    SetGraphicsMode( void ) {
  35.     asm {
  36.         mov    ax,0x13
  37.     int    0x10
  38.       }
  39. }
  40.  
  41. void    SetTextMode( void ) {
  42.     asm {
  43.       mov    ax,0x03
  44.     int    0x10;
  45.     }
  46. }
  47.  
  48. void SetPoint( int X, int Y, int C ) {
  49. /* First we'll make sure the point is not off the screen */
  50.   if ( X < 0 || X > 319 ) return;
  51.   if ( Y < 0 || Y > 199 ) return;
  52.  
  53. /* and only if its on the screen will we draw it */
  54.   *(screen+(Y*320)+X)=C;
  55. }
  56.  
  57. /* Set up the floating point cos and sin arrays */
  58. void LoadFPCosSinArrays(void) {
  59.   int a;
  60.   float radians;
  61.  
  62.   for ( a = 0; a < 360; a++ ) {
  63.       radians = (float)a * PI / 180;
  64.       FPCosArray[a] = cos(radians);
  65.       FPSinArray[a] = sin(radians);
  66.       }
  67. }
  68.  
  69. /* Set up the integer cos and sin arrays */
  70. void LoadINTCosSinArrays(void) {
  71.   int a;
  72.   float radians;
  73.  
  74.   for ( a = 0; a < 360; a++ ) {
  75.       radians = (float)a * PI / 180;
  76.       INTCosArray[a] = (int)(cos(radians) * 100);
  77.       INTSinArray[a] = (int)(sin(radians) * 100);
  78.       }
  79. }
  80.  
  81. /* Slow circle drawing routine - lots of floating point */
  82. void SlowCircDraw(int xc, int yc, int r, int color) {
  83.   int x, y;
  84.   float s;
  85.  
  86.   for ( s = 0; s < 2*PI; s+= PI/180 ) {
  87.       x = xc + ( (float)r * cos(s) );
  88.       y = yc + ( (float)r * sin(s) );
  89.       SetPoint( x, y, color );
  90.       }
  91. }
  92.  
  93. /* Medium speed circle drawing routine - not as much floating point */
  94. void MediumCircDraw(int xc, int yc, int r, int color) {
  95.   int x, y;
  96.   int s;
  97.  
  98.   for ( s = 0; s < 360; s++ ) {
  99.       x = xc + ( (float)r * FPCosArray[s] );
  100.       y = yc + ( (float)r * FPSinArray[s] );
  101.       SetPoint( x, y, color );
  102.       }
  103. }
  104.  
  105. /* Fast circle drawing routine - very little floating point */
  106. void FastCircDraw(int xc, int yc, int r, int color) {
  107.   int x, y, s;
  108.  
  109.   for ( s = 0; s < 360; s++ ) {
  110.       x = xc + ( ( r * INTCosArray[s] ) / 100 );
  111.       y = yc + ( ( r * INTSinArray[s] ) / 100 );
  112.       SetPoint( x, y, color );
  113.       }
  114. }
  115.  
  116. void main( void ) {
  117.   char input[64];
  118.   int xc,yc,r,c,d,number_of_circles;
  119.  
  120.   /* Set up the floating point cos and sin arrays */
  121.   LoadFPCosSinArrays();
  122.  
  123.   /* Set up the integer cos and sin arrays */
  124.   LoadINTCosSinArrays();
  125.  
  126.     clrscr();
  127.  
  128.     printf( "*** HOLLOW CIRCLE DRAWING DEMO ***\n\n" );
  129.     printf( "Suggestions for number of circles:\n\n" );
  130.     printf( "486/50:  2000\n" );
  131.     printf( "486/33:  1000\n" );
  132.     printf( "486/25:   750\n" );
  133.     printf( "386/40:   100\n" );
  134.     printf( "386/33:   100\n" );
  135.     printf( "lower :    50\n\n" );
  136.  
  137.     printf( "Enter number of circles to draw: " );
  138.     gets( input );
  139.  
  140.     number_of_circles = atol(input);
  141.     if ( number_of_circles <= 0 ) {
  142.         printf( "That's not a valid number!" );
  143.         exit(1);
  144.         }
  145.  
  146.   SetGraphicsMode();
  147.  
  148.   gotoxy( 18, 12 ); printf( "Slow" ); delay(3000);
  149.   for ( d = 0; d < number_of_circles; d++ ) {
  150.       xc = rand()%320;
  151.       yc = rand()%200;
  152.       r = rand()%50;
  153.       c = rand()%255;
  154.       SlowCircDraw(xc,yc,r,c);
  155.       }
  156.  
  157.   SetGraphicsMode();  // quick way of clearing the graphics screen
  158.  
  159.   gotoxy( 18, 12 ); printf( "Medium" ); delay(3000);
  160.  
  161.   for ( d = 0; d < number_of_circles; d++ ) {
  162.       xc = rand()%320;
  163.       yc = rand()%200;
  164.       r = rand()%50;
  165.       c = rand()%255;
  166.       MediumCircDraw(xc,yc,r,c);
  167.       }
  168.  
  169.   SetGraphicsMode();  // quick way of clearing the graphics screen
  170.  
  171.   gotoxy( 18, 12 ); printf( "Fast" ); delay(3000);
  172.  
  173.   for ( d = 0; d < number_of_circles; d++ ) {
  174.       xc = rand()%320;
  175.       yc = rand()%200;
  176.       r = rand()%50;
  177.       c = rand()%255;
  178.       FastCircDraw(xc,yc,r,c);
  179.       }
  180.  
  181.   SetTextMode();
  182. }
  183.  
  184.  
  185.  
  186.  
  187.  
  188.