home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / insidetp / 1990_09 / vg2.pas < prev    next >
Pascal/Delphi Source File  |  1990-09-04  |  5KB  |  213 lines

  1. {****************************************************************
  2. * STARBNCE.PAS - Demo of 2D vector transforms                   *
  3. ****************************************************************}
  4.  
  5. USES Graph,Crt;
  6.  
  7. TYPE
  8.  
  9.   CartType = RECORD
  10.     X, Y:  Real;
  11.   END;
  12.  
  13.   PolarType = RECORD
  14.     R, A:  Real;
  15.   END;
  16.  
  17.   PhysType = RECORD
  18.     X, Y:  Integer;
  19.   END;
  20.  
  21.   Entity = RECORD
  22.     Pos   : CartType;
  23.     Polar : ARRAY [0..10] OF PolarType;
  24.   END;
  25.  
  26. VAR
  27.   Star : Entity;
  28.   MC, MX, MY: Integer;
  29.  
  30.  
  31. {-------------------------------------------------
  32. - Name   : PolarToCart                           -
  33. - Purpose: Converts polar coordinates to         -
  34. -          cartessian coordinates                -
  35. - Input  : A record of polar coordinates         -
  36. -          A record of cartessian coordinates    -
  37. -------------------------------------------------}
  38.  
  39. PROCEDURE PolarToCart(InPolar: PolarType;VAR OutCart: CartType);
  40. BEGIN
  41.   OutCart.X := Cos(InPolar.A) * InPolar.R;
  42.   OutCart.Y := SIN(InPolar.A) * InPolar.R
  43. END;
  44.  
  45.  
  46. {-------------------------------------------------
  47. - Name   : CartToPhys                            -
  48. - Purpose: Converts cartessian coordinates to    -
  49. -          physical coordinate system            -
  50. - Input  : A record of cartessian coordinates    -
  51. -          A record of physical coordinates      -
  52. -------------------------------------------------}
  53.  
  54.  
  55. PROCEDURE CartToPhys(InCart: CartType; VAR OutPhys: PhysType);
  56. BEGIN
  57.   OutPhys.X := Trunc((InCart.X + 1.0) * MX / 2);
  58.   OutPhys.Y := Trunc((InCart.Y + 1.0) * MY / 2)
  59. END;
  60.  
  61. PROCEDURE DrawStar(C : Integer);
  62. VAR
  63.   I     : Integer;
  64.   C1    : CartType;
  65.   P1,P2 : PhysType;
  66. BEGIN
  67.   SetColor(C);
  68.   FOR I := 0 TO 4 DO BEGIN
  69.     PolarToCart(Star.Polar[I+1],C1);
  70.     C1.X := C1.X + Star.Pos.X;
  71.     C1.Y := C1.Y + Star.Pos.Y;
  72.     CartToPhys(C1,P1);
  73.     PolarToCart(Star.Polar[I],C1);
  74.     C1.X := C1.X + Star.Pos.X;
  75.     C1.Y := C1.Y + Star.Pos.Y;
  76.     CartToPhys(C1,P2);
  77.     Line(P1.X,P1.Y,P2.X,P2.Y)
  78.     END
  79.   END;
  80.  
  81. VAR
  82.   I, GrDriver, GrErr, GrMode : Integer;
  83.   DA, DR, DX, DY, CurrentDR  : Real;
  84.   C                          : Char;
  85.   Done,DisplayOn             : Boolean;
  86.   Temp                       : String;
  87.   MaxHeight,MaxWidth,WidthNbr               : Integer;
  88.  
  89. BEGIN
  90.  
  91.   {Initialize graphics System}
  92.   GrDriver := Detect;
  93.   DetectGraph(GrDriver, GrMode);
  94.   IF GrDriver < 0 THEN BEGIN
  95.     WriteLn('No graphics hardware detected',#7);
  96.     Halt(1)
  97.     END;
  98.  
  99.   {*** Change location of graphics drivers in next line to ***}
  100.   {*** match the subdirectory in your system               ***}
  101.  
  102.   InitGraph(GrDriver, GrMode,'P:\Graph');
  103.   IF GrDriver < 0 THEN BEGIN
  104.     WriteLn('InitGraph (' + GraphErrorMsg(GrDriver) + ')');
  105.     Halt(2)
  106.     END;
  107.   MX := GetMaxX;
  108.   MY := GetMaxY;
  109.   MC := GetMaxColor;
  110.   DisplayOn := TRUE;
  111.  
  112.   {** Create a star **}
  113.  
  114.   Star.Pos.X := 0.0;
  115.   Star.Pos.Y := 0.0;
  116.  
  117.   FOR I := 0 TO 5 DO BEGIN
  118.     Star.Polar[I].R := 0.6;
  119.     Star.Polar[I].A := 4 * Pi / 5 * I;
  120.     END;
  121.  
  122.   DA := 0.0; DR := 0.0; DX := 0.0; DY := 0.0;
  123.  
  124.   {** Do the demonstration **}
  125.  
  126.   Done := FALSE;
  127.   SetTextStyle(TriplexFont,HorizDir,1);
  128.   MaxHeight := TextHeight('Radius=');
  129.   MaxWidth := TextWidth('Radius= ');
  130.   WidthNbr := TextWidth('00000');
  131.   CurrentDR := 0;
  132.  
  133.   OutTextXY(0,0,'Angle = ');
  134.   OutTextXY(0,MaxHeight * 1,'Radius= ');
  135.   OutTextXY(0,MaxHeight * 2,'DX    = ');
  136.   OutTextXY(0,MaxHeight * 3,'DY    = ');
  137.   OutTextXY(MX DIV 2,0,'Star Demo');
  138.   OutTextXY(0,MY-2*MaxHeight,
  139.     'Press spacebar to toggle value display, ESC to quit.');
  140.  
  141.   WHILE NOT Done DO BEGIN
  142.  
  143.     IF DisplayOn THEN BEGIN
  144.       SetColor(7);
  145.  
  146.       SetViewPort(MaxWidth - 5, 0, MaxWidth + WidthNbr,
  147.                                           MaxHeight * 4 ,TRUE);
  148.       ClearViewPort;
  149.       SetViewPort(0,0,MX,MY,TRUE);
  150.  
  151.       Str(DA:5:3,Temp);
  152.       OutTextXY(MaxWidth,0,Temp);
  153.  
  154.       Str(CurrentDR:5:3,Temp);
  155.       OutTextXY(MaxWidth,MaxHeight * 1,Temp);
  156.  
  157.       Str(DX:5:3,Temp);
  158.       OutTextXY(MaxWidth,MaxHeight * 2,Temp);
  159.  
  160.       Str(DY:5:3,Temp);
  161.       OutTextXY(MaxWidth,MaxHeight * 3,Temp);
  162.       END;
  163.  
  164.  
  165.     IF KeyPressed THEN BEGIN
  166.       C := ReadKey;
  167.       CASE UpCase(C) OF
  168.         Chr(27) : Done := TRUE;
  169.         'U'     : DY := DY - 0.025;
  170.         'D'     : DY := DY + 0.025;
  171.         'L'     : DX := DX - 0.025;
  172.         'R'     : DX := DX + 0.025;
  173.         'F'     : DA := DA + 0.05;
  174.         'B'     : DA := DA - 0.05;
  175.         '+'     : DR := DR + 0.005;
  176.         '-'     : DR := DR - 0.005;
  177.         ' '     : DisplayOn := NOT DisplayOn;
  178.         ELSE
  179.         END;  {CASE}
  180.       END;  {IF}
  181.  
  182.   {** Perform any rotations & scaling **}
  183.  
  184.     FOR I := 0 TO 5 DO BEGIN
  185.       Star.Polar[I].R := Star.Polar[I].R + DR;
  186.       Star.Polar[I].A := Star.Polar[I].A + DA;
  187.       END;
  188.     CurrentDR := Star.Polar[0].R;
  189.     DR := 0;
  190.  
  191.     {** Perform any translation **}
  192.  
  193.     Star.Pos.X := Star.Pos.X + DX;
  194.     IF Abs(Star.Pos.X) > 1.0 THEN BEGIN
  195.       DX := -DX;
  196.       Star.Pos.X := Star.Pos.X + DX
  197.       END;
  198.  
  199.     Star.Pos.Y := Star.Pos.Y + DY;
  200.     IF Abs(Star.Pos.Y) > 1.0 THEN BEGIN
  201.       DY := -DY;
  202.       Star.Pos.Y := Star.Pos.Y + DY
  203.       END;
  204.  
  205.     {** Draw the star **}
  206.  
  207.     DrawStar(MC);
  208.     Delay(100);
  209.     DrawStar(0);
  210.     END;  {WHILE}
  211.   CloseGraph;
  212.   END. {BEGIN}
  213.