![]() |
|
#1
|
|||
|
|||
![]() Всем доброго времени суток.
Предыстория- мне задали задачу по комп графике нарисовать анимацию открывающейся двери. Дверь открывается по эллиптической траектории, а это усложняет задачу. Решить по умным формулам не могу, поэтому решил схитрить немного: заранее просчитать координаты для рисования и сбросить их в массив 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. Заранее благодарен=) З.Ы.-ответы типа "Ошибка в твоем коде...генетическом..." просьба оставить при себе... Последний раз редактировалось user2001, 20.10.2012 в 12:01. |
#2
|
||||
|
||||
![]() надо for I := 0 to Length(arr_d) -1
На счет двери, там все через синус и косинус считается, ничего сложного. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
user2001 (20.10.2012)
|
#3
|
||||
|
||||
![]() Смотрим на строки:
Цитата:
Теперь переводим эти рассуждения на длину массива в 24. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 20.10.2012 в 14:04. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
user2001 (20.10.2012)
|
#4
|
|||
|
|||
![]() ошибка в
Код:
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 ее закомментировал, и все заработало. Осталось только придумать как нормально найти координаты Последний раз редактировалось user2001, 20.10.2012 в 14:54. |
#5
|
||||
|
||||
![]() Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
user2001 (20.10.2012)
|