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

Var dx : real;

Begin

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

tc.x:=tc.x+dx;

tc.y:=f(tc.x);

End;

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

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

for i:=1 to 4 do tr[i].Move(-2,2,MyTrace);

Перед инициализацией треугольников надо указать стартовую точку

tc.x:=-2;

tc.y:=MyTrace(-2);

Доработка метода cTri.Draw.

До сих пор центр вращения совпадал с началом координат, и все было ОК. Теперь надо внести изменения в «рисовалку» для учета смещения центра вращения относительно центра экрана.

Procedure cTri.Draw;

Var t : array[1..3] of tPoint; tr : trPoint;

I : byte;

Begin

// Введена вспомогательная переменная tr для

// вычисления абсолютных реальных координат вершин

// (напомню, вершины apex[i] задаются относительно

// центра вращения tc)

for i:=1 to 3 do

begin

tr.x:=tc.x+apex[i].x;

tr.y:=tc.y+apex[i].y;

t[i]:=tpix(tr);

end;

// Далее по тексту листинга 18б.

Метод Move с включением переменной – объекта класса cTrace в данные класса cTri.

  • В список данных класса необходимо добавить поле trace : cTrace;

  • В конструкторе класса теперь, вместо формального параметра ftc : TRPoint; для инициализации начального положения центра вращения, следует предусмотреть ftrace : cTrace;.

  • В классе cTrace должны быть предусмотрены функции доступа к закрытым полям класса.

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

trace:=ftrace;

tc.x:=trace.GetA;

tc.y:=trace.GetFunc()(tc.x);

Смысл этих изменений заключается в том, что теперь источниками получения значений параметров a, b являются функции доступа GetA и GetB, а траектории – функция GetFunc. Алгоритм пересчета остался прежним.

Листинг 18з. Метод Move с использованием объекта класса cTrace внутри класса cTri.

Procedure cTri.Move;

Const n=101;

Var dx : real;

Begin

dx:=(trace.GetB-trace.GetA)/(n-1);

tc.x:=tc.x+dx;

tc.y:=trace.GetFunc()(tc.x);

End;

Создание контейнера.

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

Понятие контейнера было рассмотрено ранее в Практикуме 6 на примере организации данных в списковую структуру (список и контейнер – здесь рассматриваются как синонимы).

Поскольку в контейнере можно хранить данные только одного типа, то в качестве такого типа выберем базовый класс cDecart. Структура и методы класса остались такими же, как и в примере из Практикума 6.

Отличие заключается в том, что теперь базовый класс не может быть абстрактным, поскольку мы должны иметь хотя бы один экземпляр этого класса для рисования осей координат и стирания области холста.

В методы класса необходимо включить, кроме методов добавления в список и рисования списка, еще методы пересчета координат при вращении и перемещении.

Класс cList.

Листинг 18и. Объявление контейнерного класса cList. Используется метод Move из листинга 18з.

Type cList=

class(cDecart)

private

n : word;

a : array[1..21] of cDecart;

public

Constructor Init;

Procedure Add(fa : cDecart);

Procedure Draw;

Procedure Rotation(da : real);

Procedure Move;

end;

// Объект класса.