Проблема в округлении. Если выполнять процесс интерациононо ошибка может накапливается.
Код:
procedure FixAngle;
var point, axis: TPoint;
i:integer;
begin
axis.X:=250;
axis.y:=250;
point.x:=250-50;
point.y:=250;
for i:=0 to 360 do
begin
point:=RotatePoint(point,axis,Pi/180);
Form1.Image1.Canvas.MoveTo(axis.X,axis.Y);
Form1.Image1.Canvas.LineTo(point.X,point.Y);
end;
end;
У Вас и есть тот лучай, когда она накапливается.
Из решений менять алгоритм. Делать его неустойчевым к ошибкам.
Самое просто что приходит на ум использоваь числа с плавающей точкой.
Но это полумера, числа в компьюторе иеют ограниченное число знаков. И при операциях с плавающей точкой они тоже округляются.
И ошибка также и иначе будет вылазить. Просто они бдут появляться реже! Так все создатели игр и делают.
Цитата:
Короче, либо считайте всё с плавающей точкой (при этом тоже может получиться спираль, правда с очень маленким шагом)
Даже небольшое округление может приводить к большим ошибкам. К примеру выполните деление
.
Поэтому надо искать алгоритм на которого ошибки окргуления не будут влиять. К примеру тут можно изменять угол.
Код:
procedure VarAngle;
var r,point, axis: TPoint;
angle:Real;
i:integer;
begin
axis.X:=250;
axis.y:=250;
point.x:=250-50;
point.y:=250;
angle:=0;
for i:=0 to 360 do
begin
r:=RotatePoint(point,axis,angle);
angle:=angle+Pi/180;
Form1.Image2.Canvas.MoveTo(axis.X,axis.Y);
Form1.Image2.Canvas.LineTo(r.X,r.Y);
end;
end;