home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 May / VPR9705A.ISO / VPR_DATA / PROGRAM / CBTRIAL / SETUP / DATA.Z / CANMAIN.CPP < prev    next >
C/C++ Source or Header  |  1997-02-14  |  3KB  |  82 lines

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4.  
  5. #include "canmain.h"
  6. #include "math.h"
  7. //---------------------------------------------------------------------------
  8. #pragma resource "*.dfm"
  9. TForm1 *Form1;
  10. //---------------------------------------------------------------------------
  11. __fastcall TForm1::TForm1(TComponent* Owner)
  12.   : TForm(Owner)
  13. {
  14. }
  15. //---------------------------------------------------------------------------
  16. void __fastcall TForm1::FormCreate(TObject *Sender)
  17. {
  18.     Canvas->Pen->Color = clTeal;
  19.     Rotation = 0;
  20.     PointCount = MaxPoints;
  21.     RotatePoints();
  22. }
  23. //---------------------------------------------------------------------
  24. void __fastcall TForm1::FormPaint(TObject *Sender)
  25. {
  26.     int centerX = ClientWidth / 2;
  27.     int centerY = ClientHeight / 2;
  28.     int radius = min(centerY, centerX);
  29.  
  30.     Canvas->Ellipse(0, 0, radius*2, radius*2);
  31.     int i,j;
  32.     for (i = 0; i < PointCount; i++) {
  33.         for (j = i + 1; j < PointCount; j++) {
  34.             Canvas->MoveTo(radius + floor(Points[i].X * radius),
  35.                 radius + floor(Points[i].Y * radius));
  36.             Canvas->LineTo(radius + floor(Points[j].X * radius),
  37.                 radius + floor(Points[j].Y * radius));
  38.         }
  39.     }
  40.  
  41.     // A challenge:  Turn the rotating figure into a ball that bounces off the
  42.     // walls of the window.  Don't forget the english (spin) on the ball should
  43.     // pick up when bouncing off the wall...
  44. }
  45. //---------------------------------------------------------------------
  46. void __fastcall TForm1::FormResize(TObject *Sender)
  47. {
  48.     Invalidate();
  49. }
  50. //---------------------------------------------------------------------
  51. void __fastcall TForm1::Timer1Timer(TObject *Sender)
  52. {
  53.     RotatePoints();
  54.     Invalidate();
  55. }
  56. //---------------------------------------------------------------------
  57. void __fastcall TForm1::RotatePoints()
  58. {
  59.     // NOTE: all figures are in radians
  60.     const float M_2PI = 2 * M_PI;           // 2 pi radians in a circle
  61.     float StepAngle = M_2PI / PointCount;   // angular distance between points
  62.  
  63.     Rotation += M_PI / 32;   // Increment the angle of rotation of figure
  64.     if (Rotation > StepAngle)
  65.         Rotation -= StepAngle;   // Keep rotation less than distance between points
  66.  
  67.     // The loop below has i walking through the Points array, while j walks
  68.     // simultaneously through the angles to each point on the circle.
  69.     // Incrementing j by StepAngle moves j to the next point on the circle with
  70.     // no complicated arithmetic (everything has been set up in advance of the
  71.     // loop).  Initializing j with Rotation causes the entire figure to shift
  72.     // clockwise a small amount.
  73.     //
  74.     int i;
  75.     float j;
  76.     for (i = 0, j = Rotation; i < PointCount; i++, j += StepAngle) {
  77.         Points[i].X = cos(j);   // These values will be multiplied by the
  78.         Points[i].Y = sin(j);   // current radius at display time.
  79.     }
  80. }
  81. //---------------------------------------------------------------------
  82.