Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка(Абб).docx
Скачиваний:
90
Добавлен:
09.11.2019
Размер:
505.32 Кб
Скачать

Задание к лабораторной работе

  1. Построить графическую модель движения тела согласно варианту лабораторной работы №2.

  2. Определить значения исследуемых параметров модели.

Варианты заданий

Варианты 1-6. Зависимость скорости движущегося тела от времени

Варианты 7-12. Траектория движения тела

Лабораторная работа №4 Имитация движения в среде Lazarus. Краткие теоретические сведения

Имитация движения в среде Lazarus. Движение некоторого объекта (геометрической фигуры ) в приложении на Lazarus, реализуется по следующему алгоритму:

  1. Объект рисуется так, чтобы он был невидим (цветом фона)

  2. Изменяются координаты объекта

  3. Объект рисуется видимым цветом в новом месте

  4. По истечении некоторого времени процесс повторяется

Интерфейс и функциональность приложения. Для реализации 1-3 пунктов алгоритма необходимы свойство Canvas (канва) формы или компонента Image, а также методы канвы, позволяющие установить цвет пера и кисти и прорисовку объекта.

Для выдерживания паузы между изображениями объекта на старом и новом месте служит компонент Timer (страница System палитры компонентов). Основные свойства таймера:

  • Enabled (true- включен, false- выключен);

  • Interval (промежуток времени между срабатываниями таймера, измеряется в миллисекундах).

Как правило, при проектировании приложения таймер следует выключить, а включить программно при наступлении какого-либо события, например, щелчка на кнопке «Начать движение».

Для движения объекта по горизонтали вправо через каждый интервал срабатывания таймера координата x увеличивается на некоторый шаг, координата y не меняется. Если движение происходит по вертикали- наоборот, меняется только y. Если надо двигать объект по некоторой сложной траектории, следует x изменять на шаг, а y вычислять как функцию от x.

Итак, для программирования движения необходимо выполнить следующие действия:

  1. Разместить на форме компонент Timer. Установить его свойство Enabled в значение False. Задать интервал срабатывания таймера, например, 500 (пол-секунды). Поместить на форму кнопку «Начать движение».

  2. Задать начальные установки, например, в обработчике события «прорисовка формы». Этими установками могут быть: начальные координаты объекта, шаг изменения координаты, интервал таймера и др.

  3. Написать процедуру risovanie, которая реализует вышеописанный алгоритм движения объекта

  4. Описать реакцию на событие «Щелчок на кнопке». Единственное, что происходит при наступлении этого события- это включение таймера.

  5. Описать реакцию на событие «срабатывание таймера» (Timer1Timer). Обработчик этого события вызывает процедуру risovanie.

Вид формы при проектировании

Вид работающего приложения (окружность движется вправо)

Пример выполнения задания

Задача. Имитировать движение планеты вокруг Солнца. Определить вид орбиты и период обращения планеты.

Запишем обезразмеренные уравнения, описывающие движение «малого» тела вокруг неподвижного «большого». В качестве характерных величин примем расстояние от Земли до Солнца ρ = 1,496∙1011 м, (так называемая, астрономическая единица), период круговой орбиты T, соответствующий этому расстоянию, скорость движения по ней . Примем .

Соответствующие уравнения имеют вид:

Интерфейс приложения: на первой форме вводятся исходные данные

Функциональность приложения:

//процедура, реализующая один цикл движения объекта

procedure risovanie;

begin

with Form2.Canvas do begin

Pen.Color:=clRed;// красный «след»

ellipse(XS,YS,XS+5,YS+5);

//пересчет координат

X:=X+2*pi*Vx*dt;

Y:=Y+2*pi*Vy*dt;

Vx:=Vx-2*pi*X*dt/sqrt((X*X+Y*Y)*(X*X+Y*Y)*(X*X+Y*Y));

Vy:=Vy-2*pi*Y*dt/sqrt((X*X+Y*Y)*(X*X+Y*Y)*(X*X+Y*Y));

t:=t+dt;

XS:=trunc(X*Mx)+X0;

YS:=trunc(-Y*My)+Y0;

Pen.Color:=clBlack;//черная «планета»

ellipse(XS,YS,XS+5,YS+5);

if (abs(X-1)<=0.01) and (abs(Y)<=0.09) and (t>dt) then begin //при возвращении в исходную точку таймер

выключается

Form2.Timer1.Enabled:=false;

Form2.Canvas.Pen.Color:=clBlack;

// выводится значение периода Form3.Canvas.textout(Hor+5,Ver+5,'T='+floattostrf(t,ffgeneral,4,1)); end; end;

end;

//при прорисовке второй формы на ней строится система координат

procedure TForm2.FormPaint(Sender: TObject);

begin

Hor:=10;Ver:=10;

x0:=Form2.Width div 2;

y0:=Form2.Height div 2;

Mx:=Form2.Width div 3;

My:=Form2.Height div 3;

t:=0;

with Canvas do begin

Pen.Color:=clBlack;

Pen.Width:=2;

MoveTo(Hor,Y0);LineTo(Form2.Width-Hor,Y0);

MoveTo(X0,Ver);LineTo(X0,Form2.Height-Ver);

TextOut(Form2.Width-Hor,Y0+2,'X');

TextOut(X0-7,Ver,'Y');

end;

end;

//при щелчке на кнопке «Начать движение» включается таймер

procedure TForm2.Button2Click(Sender: TObject);

begin

Timer1.Enabled:=true;

end;

//при каждом срабатывании таймера вызывается процедура risovanie

procedure TForm2.Timer1Timer(Sender: TObject);

begin

risovanie;

end;

Результат : на второй форме – траектория движения «планеты» и значение периода (в земных годах)