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