[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]