1. Расписываю список точек Арки, интересует, следующий момент, здесь я использую динамический массив Points(объявлен как Points : array of TPointF; TPointF - запись), у него диапазон от 0 до N-1.
Но у меня получается так, что спокойно прокручивается до N(т.е я выхожу за границы массива), и компилятор даже ни разу не вякнул, почему?
- Код: Выделить всё
procedure TArc.CalculateArc();
var
PX, PY, tmpPX, tmpPY : Real;
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);
tmpPX := FRadius * Cos(BAngle) + FX;
tmpPY := FRadius * Sin(BAngle) + FY;
{ Заполняем масив точек, по которым будем отрисовывать арку и получим её границы }
Points[0].X := tmpPX;
Points[0].Y := tmpPY;
for i:=1 to Iterations do begin
BAngle := BAngle + Delta;
PX := FRadius * Cos(BAngle) + FX;
PY := FRadius * Sin(BAngle) + FY;
Points[i].X := PX;
Points[i].Y := PY;
tmpPX := PX;
tmpPY := PY;
end;
end;
2. Есть ещё одна функция, которая вычисляет границы арки, задача в том, что мне нужно вернуть границы, значениями которой будут вещественные числа, т.е простой TRect не подходит.
Сделал для этого запись:
- Код: Выделить всё
TRectF = record
Left : Real;
Top : Real;
Right : Real;
Bottom : Real;
end;
В нужно мне функции думаю динамически выделять память и возвращать указатель на мою TRectF, вопрос в том, когда мне её освобождать? Если сразу после Result := <указатель на мою запись> напишу типа Dispose(<указатель на мою запись>), я же потеряю данные вне функции, где её вызвал, или всё же получу результат(цифирьки), а потом память освободится?
- Код: Выделить всё
function TArc.GetBBox() : TRect;
var
i : Integer;
MinX, MinY : Real;
MaxX, MaxY : Real;
begin
if Length(Points) > 0 then begin
MaxX := Points[0].X;
MaxY := Points[0].Y;
MinX := MaxX;
MinY := MaxY;
for i:=1 to Length(Points) do begin
if Points[i].X > MaxX then
MaxX := Points[i].X
else
if Points[i].X < MinX then
MinX := Points[i].X;
if Points[i].Y > MaxY then
MaxY := Points[i].Y
else
if Points[i].Y < MinY then
MinY := Points[i].Y;
end;
Result := Rect(Round(MinX), Round(MinY), Round(MaxX+1), Round(MaxY+1));
// Думаю тут написать Dispose(PRectF);
end
else
Result := Rect(0, 0, 0, 0);
end;