Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТРПО / Материалы по ТП / Гафаров_Metod_OOP_1.doc
Скачиваний:
120
Добавлен:
12.03.2015
Размер:
2.48 Mб
Скачать

2. Пример объектно-ориентированного программирования

2.1. Формулировка задачи

Рассмотрим процессы проектирования программы с использованием ООП - технологии на примере задачи качения квадрата по некоторой поверхности с отображением этого процесса на экране. Начнем с наиболее простого варианта решения этой задачи, а затем постепенно ее усложним. Сначала выберем в качестве поверхности качения плоскость, которая в боковой проекции на экране будет выглядеть как прямая линия. Общий вид сцены на экране будет выглядеть так, как на рис. 2.1

Рис. 2.1. Качение квадрата по прямой линии G1-G2. (т.1 – текущая ось вращения; as – длина стороны квадрата).

Основными структурными элементами (объектами) этого изображения являются точки и линии, и из них может быть построен квадрат и скомпонована вся сцена на экране, причем эти элементы образуют следующую иерархию (рис. 2.2):

Опишем эти объекты в соответствии с положениями ООП-программирования.

Const

kv = 4; { кол-во вершин квадрата }

speed = 1.5; { коэфф. скорости перемещения квадрата }

one = pi/180; { 1 градус в радианах }

step = one*speed; { приращение угла поворота }

ms = 2000; { величина задержки при анимации }

Type TPoint = Object { О-тип - точка }

x,y :Real; { координаты точки }

Pcolor :Byte; { ее цвет }

Constructor Init ( xx,yy :Real; col :Byte );

Procedure Rotate ( xOs,yOs :Integer ); Virtual;

Procedure Show ( col :Byte ); Virtual;

Destructor Done;

End;

TLine = Object ( TPoint ) { О-тип - отрезок прямой }

pn, pk :TPoint; { нач. и кон. точки прямой }

Lcolor :Byte; { ее цвет }

Constructor Init ( x1,y1,x2,y2 :Real; col :Byte );

Procedure Rotate ( xOs,yOs :Integer ); Virtual;

Procedure Show ( col :Byte ); Virtual;

Destructor Done;

End;

TSides = Array [ 0..kv-1 ] Of TLine; {тип для описания сторон квадрата}

TSquare = Object ( TLine ) { О-тип - квадрат }

as :Byte; { размер стороны квадрата }

Sides :TSides; { стороны квадрата }

Scolor :Byte; { цвет квадрата }

Constructor Init ( aa, colK :Byte );

Procedure Rotate ( xOs,yOs :Integer ); Virtual;

Procedure Show ( col :Byte ); Virtual;

Destructor Done;

End;

TScreen = Object ( TSquare ) { О-тип - сцена }

Gdisp :Integer; { эффективное Y-смещение поверхности качения}

Gcolor :Byte; { цвет поверхности}

angle :Real; { угла поворота квадрата}

OsX,OsY :Integer; { текущее значения координат оси вращения }

Constructor Init ( aa, colK, colG :Byte; dG :Integer );

Procedure GraphInit; Virtual;

Function ShiftOsXY :Boolean; Virtual;

Procedure Go; Virtual;

Procedure DrawGround; Virtual;

Destructor Done;

End;