Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические материалы к ДЗ.doc
Скачиваний:
6
Добавлен:
09.02.2015
Размер:
472.06 Кб
Скачать

0,0, 1,0, 0,1, Tc, clRed);

tr[2]:=cTri.Init(t0.x, t0.Y, 100, Form1.Canvas,

0,0, -1,0, 0,1, tc, clBlue);

tr[3]:=cTri.Init(t0.x, t0.Y, 100, Form1.Canvas,

0,0, -1,0, 0,-1, tc, clGreen);

tr[4]:=cTri.Init(t0.x, t0.Y, 100, Form1.Canvas,

0,0, 1,0, 0,-1, tc, clYellow);

N2.Enabled:=true; // Кнопка таймера доступна

end;

// Кнопка запуска таймера.

procedure TForm1.N2Click(Sender: TObject);

begin

if Timer1.Enabled then Timer1.Enabled:=false

else Timer1.Enabled:=true;

end;

// Обработчик сигналов таймера.

procedure TForm1.Timer1Timer(Sender: TObject);

Var I : word;

Begin

// Очистка экрана и рисование осей

dec.Draw;

// Рисование

for i:=1 to 4 do tr[i].Draw;

// Пересчет координат объектов

for i:=1 to 4 do tr[i].Rotation(Pi/36);

end;

Класс графика траектории cTrace.

График траектории движения это обычный график функции y=f(x), построенный в интервале изменения аргумента от a до b. Параметры графика являются полями класса cTrace.

Для большей универсальности функцию целесообразно объявить предопределенным процедурным типом.

Листинг 18е. Объявление класса cTrace.

Type

Tf=function(x : real) : real;

cTrace=

class(cDecart)

private

a, b : real;

f : Tf;

public

Constructor Init(fx0, fy0 : integer;

fmx : real; fcnv : TCanvas;

fa, fb : real; ff : Tf);

Procedure Draw;

end;

Реализация методов класса.

Procedure cTrace.Draw;

Const n=101;

Var dx : real; tr : trPoint; tp: tPoint; I : word;

Begin

dx:=(b-a)/(n-1);

tr.x:=a; tr.y:=f(tr.x); tp:=tpix(tr);

cnv.Pen.Color:=clBlack;

cnv.MoveTo(tp.X, tp.Y);

for i:=2 to n do

begin

tr.x:=a+dx*(i-1); tr.y:=f(tr.x);

tp:=tpix(tr);

cnv.LineTo(tp.X, tp.Y);

end;

End;

Constructor cTrace.Init(fx0, fy0 : integer;

fmx : real; fcnv : TCanvas;

fa, fb : real; ff : Tf);

Begin

Inherited Init(fx0, fy0, fmx, fcnv);

a:=fa; b:=fb; f:=ff;

End;

Траектория (см. свой вариант задания) программируется в том же модуле, что и класс траектории, но она не является членом класса. По правилам оформления модуля заголовок функции должен быть продублирован в интерфейсной части модуля вне объявления класса (обычно перед разделом VAR модуля).

Function MyTrace(x : real) : real;

Begin

Result:=1-0.25*x*x;

End;

Инициализация и использование класса.

Переменную trace, объявленную в модуле класса, необходимо проинициализировать в обработчике настроек программы в соответствии с параметрами конструктора. Чтобы не запутаться в порядке инициализации, рекомендую сначала инициализировать объект класса cDecart затем объект класса cTrace, а уже потом другие объекты (треугольники и т.п.).

trace:=cTrace.Init(t0.x, t0.Y, 100, Form1.Canvas,

-2, 2, MyTrace);

Обращение к методу рисования необходимо добавить в обработчик таймера сразу после рисования осей координат.

Проблема связи между объектами.

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

Начальное положение фигуры – точка x=a, y=f(a). Конечное положение - точка x=b, y=f(b).

Здесь возникает довольно серьезная проблема – объект треугольник ничего «не знает» о траектории движения. Переменная, ответственная за положение центра вращения никак не связана с уравнением траектории. Существует, по крайней мере, два способа решения этой проблемы

  • Передавать параметры траектории через список параметра метода Move(a, b : real; f:Tf);

  • Включить эти параметры в данные класса «треугольник» в виде переменной – объекта класса cTrace, либо «россыпью». Естественно, в конструкторе класса надо эти дополнительные поля инициализировать.

Как это часто бывает, очевидного решения этой проблемы, на данном этапе разработки, нет. Надо пробовать оба.

Метод Move c параметрами графика.

Листинг 18ж. Метод Move с передачей данных графика через параметры.

Procedure cTri.Move(a, b : real; f : Tf);

Const n=101;