[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
WILLIAM SITCH

> Okay, I've just finally got my hands on the formulas for
> doing good Graphics manipulations...well, I decided to start
> With something simple.  A rotating square.  But it DOESN'T
> WORK RIGHT.  I noticed the size seemed to shift in and out
> and a little testing showed me that instead of following a
> circular path (as they SHOULD), the corners (while spinning)
> actually trace out an OCTAGON. Why????  I've checked and
> rechecked the formula logic...It's just as I was given.  So
> there's some quirk about the code that I don't know about.
> Here's the rotating routine:

Ahhh... "rounding errors" is what my comp sci teacher explained to me, but
there isn't much you can do about it... I've included my (rather long)
spinning disc code to take a look at ... feel free to try to port it to your
application...

}

Uses
  Graph, Crt;

Procedure spin_disk;
Type
  pointdataType = Array [1..4] of Record x,y : Integer; end;
Const
  delVar = 10;

Var
  ch       :  Char;
  p, op    :  pointdataType;
  cx, cy,
  x, y, r  :  Integer;
  i        :  Integer;
  rot      :  Integer;
  tempx,
  tempy    :  Integer;
  theta    :  Real;
  down     :  Boolean;
  del      :  Real;
begin
  cx := getmaxx div 2;
  cy := getmaxy div 2;
  r := 150;
  circle(cx,cy,r);

  rot := 0;
  p[1].x := 100;  p[1].y := 0;
  p[2].x := 0;    p[2].y := -100;
  p[3].x := -100; p[3].y := 0;
  p[4].x := 0;    p[4].y := 100;
  del := 50;
  down := True;

  Repeat
    rot := rot + 2;
    theta := rot * 3.14 / 180;
    For i := 1 to 4 do
      begin
        tempx := p[i].x;
        tempy := p[i].y;
        op[i].x := p[i].x;
        op[i].y := p[i].y;
        p[i].x := round(cos(theta) * tempx - sin(theta) * tempy);
        p[i].y := round(sin(theta) * tempx + cos(theta) * tempy);
      end;
    setcolor(0);
    line(op[1].x + cx,cy - op[1].y,op[2].x + cx,cy - op[2].y);
    line(op[2].x + cx,cy - op[2].y,op[3].x + cx,cy - op[3].y);
    line(op[3].x + cx,cy - op[3].y,op[4].x + cx,cy - op[4].y);
    line(op[4].x + cx,cy - op[4].y,op[1].x + cx,cy - op[1].y);
    For i := 1 to 4 do
      line(op[i].x + cx,cy - op[i].y,cx,cy);
    setcolor(11);
    line(p[1].x + cx,cy - p[1].y,p[2].x + cx,cy - p[2].y);
    line(p[2].x + cx,cy - p[2].y,p[3].x + cx,cy - p[3].y);
    line(p[3].x + cx,cy - p[3].y,p[4].x + cx,cy - p[4].y);
    line(p[4].x + cx,cy - p[4].y,p[1].x + cx,cy - p[1].y);
    setcolor(10);
    For i := 1 to 4 do
      line(p[i].x + cx,cy - p[i].y,cx,cy);
    if (del < 1) then
      down := False
    else if (del > 50) then
      down := True;
    if (down) then
      del := del - delVar
    else
      del := del + delVar;
    Delay(round(del));
  Until (KeyPressed = True);
  ch := ReadKey;
  NoSound;
end;

Var
  Gd, Gm : Integer;

begin
  Gd := Detect;
  InitGraph(Gd, Gm, 'd:\bp\bgi');

  Spin_disk;

end.

[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]