- Код: Выделить всё
procedure TArc.CalculateArc();
var
Coef, Delta : Real;
BAngle, EAngle : Real;
Iterations, i : Integer;
begin
{ x = R * cos(A) + X
y = R * sin(A) + Y }
// Переводим в радианы
BAngle := (FStartAngle / 180) * Pi;
EAngle := (FEndAngle / 180) * Pi;
// Определяем оптимальное количество итераций
Coef := (Pi*2) / Abs(EAngle - BAngle);
Iterations := Round((2 * FRadius ) / Coef);
Delta := (EAngle - BAngle) / Iterations;
SetLength(Points, Iterations);
WriteLn('Iterations: ', Iterations);
for i:=0 to Iterations-1 do begin
Points[i].X := FRadius * Cos(-BAngle) + FX;
Points[i].Y := FRadius * Sin(-BAngle) + FY;
BAngle := BAngle + Delta;
WriteLn(i, '. X: ', Points[i].X, ' Y: ', Points[i].Y);
end;
end;
Собственно проблема заключается в том, что в данном варианте, арка не дорисовывается, т.е например задаю угол от 0 до 90гр. на деле рисует от 0 до ~80-85 гр. но если увеличить количество точек в массиве на одну и соответсвенно увеличить количество итераций на 1,
- Код: Выделить всё
SetLength(Points, Iterations+1);
for i:=0 to Iterations do begin
Points[i].X := FRadius * Cos(-BAngle) + FX;
Points[i].Y := FRadius * Sin(-BAngle) + FY;
BAngle := BAngle + Delta;
end;
то всё становится красивенько и ровненько. Не могу понять почему так Так же не даёт покоя строчка вычисления количества итераций, не могу понять зачем это сделано, зачем делить диаметр на часть окружности(для угла в 90гр. Coef=4)?
- Код: Выделить всё
Iterations := Round((2 * FRadius ) / Coef);
Вроде просто всё, а не въеду