Всем доброго времени суток.
Предыстория- мне задали задачу по комп графике нарисовать анимацию открывающейся двери. Дверь открывается по эллиптической траектории, а это усложняет задачу. Решить по умным формулам не могу, поэтому решил схитрить немного: заранее просчитать координаты для рисования и сбросить их в массив TPoint.
Проблема- задача компилися, и даже работает(частично)-ровно до момента рисования полигона. Потом выдает мне 'Access Violation at 0x7791deb9: write off address 0x00090ffc'. Гугил сказал мне что это ошибка обращения к еще, либо уже не существующей памяти. Как это исправить я не знаю. Подскажите пожалуйста. Вот код:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
image1: TImage;
button1: TButton;
procedure button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
arr_u, arr_d : array of tpoint;
pd, pu : tpoint;
implementation
{$R *.dfm}
procedure Draw();
var
I : Integer;
begin
pu.X :=100; // Верхняя точка неподвижной части двери
pu.Y :=100; //
pd.X :=100; // Нижняя точка неподвижной части двери
pd.Y :=200; //
SetLength(arr_u, 24);//Рисование задумано в 25 шагов
SetLength(arr_d, 24);
arr_u[0].X := pu.X + 50; //Решил руками задать 1й элемент массива,
arr_u[0].Y:= pu.Y; //и вычитывать следующую координату исходя
//из предыдущей
arr_d[0].X := pd.X + 50;;
arr_d[0].Y := pd.Y;
for I := 1 to Length(arr_d) do begin //Тут по задумке высчитываются координаты
arr_u[i].X := arr_u[i-1].X - 2; //точек. Должно получиться что то вроде
arr_u[i].Y := arr_u[i-1].y + 1; //эллиптической траектории
arr_d[i].X := arr_d[i-1].X - 2;
arr_d[i].y := arr_d[i-1].Y -1;
end;
for I := 0 to Length(arr_d) do begin //А вот тут он как раз и выдает //ошибку
Form1.Image1.Canvas.Polyline([point(pd.X, pd.Y),point(pu.X, pu.Y),
point(arr_u[i].X, arr_u[i].Y), point(arr_d[i].X, arr_d[i].Y)]);
Application.ProcessMessages;
Sleep(100);
end;
end;
procedure TForm1.button1Click(Sender: TObject);
begin
Draw();
end;
end.
Заранее благодарен=)
З.Ы.-ответы типа "Ошибка в твоем коде...генетическом..." просьба оставить при себе...