Рассмотрим процессы проектирования программы с использованием ООП - технологии на примере задачи качения квадрата по некоторой поверхности с отображением этого процесса на экране. Начнем с наиболее простого варианта решения этой задачи, а затем постепенно ее усложним. Сначала выберем в качестве поверхности качения плоскость, которая в боковой проекции на экране будет выглядеть как прямая линия. Общий вид сцены на экране будет выглядеть так, как на рис.8:
Рис. 8. Качение квадрата по прямой линии G1-G2. (т.1 – текущая ось вращения; as – длина стороны квадрата ).
Основными структурными элементами (объектами) этого изображения являются точки и линии, и из них может быть построен квадрат и скомпонована вся сцена на экране, причем эти элементы образуют следующую иерархию:
Рис. 9. Иерархия объектов.
Опишем эти объекты в соответствии с положениями ООП-программирования.
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;
|