Объектно-ориентированное программирование (ООП)
Если в обычном программировании для создания математической модели объекта нужно ввести много переменных, соответствующих каждому параметру объекта, и написать функции для их обработки, то в объектно-ориентированном программировании обычно программист оперирует классами, созданными другими программистами. Классы содержат переменные и функции (методы) для обработки этих переменных. Одна из функций класса особенная, она называется конструктор, обычно ее имя совпадает с именем класса. При запуске этой функции создается элемент класса. Доступ к содержимому класса возможен только через специально созданные их автором функции, которые для классов часто называеют методами. Класс напоминает секретный объект, в который доступ возможен только через специальные входы. Классы могут образовывать цепочку, где один класс порождает другой, используя переменные и методы своего класса - родителя.
Рассмотрим на примере создания базы данных собак, которая содержит различные породы собак.
Сначала создадим класс всевозможных объектов K1, состоящий из переменных c,x,y,k, где c - признак системы координат (прямоугольная или полярная), x и y - координаты объекта, а k - имя файла с изображением объекта, и 8 методов: конструктор, создающий элемент класса и задающий значения его переменным, и методы, позволяющие получить значения, поменять признак системы координат, перевести координаты из одной системы координат в другую, задать параметр k. Причем, метод пересчета с одной системы координат на другую не доступен пользователю класса. На основе класса O создадим С - класс собак, в котором будут использоваться все доступные методы класса O, но кроме этого добавим новые переменные: одна указывает породу собаки, вторая - возраст, третья - вес, четвертая - цвет шерсти и т.д., а также методы, позволяющие новые параметры задавать и получать. А уже на основе этого класса создадим 2 класса: KА - собака участвующая в выставках, KB - охотничья собака. В оба класса необходимо добавить имя и адрес хозяина, наличие прививок. В класс KА - нужно добавить параметры, описывающие внешний вид собаки, а в класс KB - параметры собаки, которые используются на охоте.
| Класс K1 - любые объекты | Переменные | coord | Система координат (с=1 - прямоугольная, с=2 - полярная) | Не доступны снаружи, без использования методов |
| x | Координаты на плоскости | |||
| y | ||||
| f | Имя файла с изображением | |||
| c | Признак системы координат | |||
| Методы | K1(a,b,c,k) | Задает параметрам x, y, coord и f значения равные a, b, c, k | Конструктор | |
| GetX() | Позволяет получить значение параметра x | |||
| GetY() | Позволяет получить значение параметра y | |||
| Move(a,b) | Перемещает объект, задавая x=a, y=b | |||
| PutC(t) | Делает значение переметра сoord равным t | |||
| GetС() | Позволяет получить значение параметра с | |||
| Pic(k) | Делает значение параметра f (имя файла с изображением) равным k | |||
| PP(t) | В зависимости от значения параметра t пересчитывает координаты из прямоугольной системы в полярную или наоборот | Не доступен снаружи, используется в методе PutC(t) | ||
| Класс K2 - собаки | Конструктор | K2(a,b,c,k,p) | Может задавать не все параметры |
| Методы класса K1 | Put(a,b), GetX(), GetY(),PutC(t), GetС(), Pic(t), Move(a,b) | Методы доступны, так как в классе К1 они не объявлены приватными | |
| Новые переменные | p | Порода собаки | |
| v | Возраст | ||
| vs | Вес | ||
| cv | Цвет шерсти | ||
| ... | |||
| ... | |||
| Новые методы | PutP(t) | Делает значение параметра p равным t | |
| GetP() | Позволяет получить значение параметра p | ||
| ... | |||
| ... |
| Класс KА - только собаки, участвующие в выставках | Конструктор | KA(a,n,d,pr) | Может задавать не все параметры |
| Методы классов K1 и k2, доступ к которым разрешен снаружи этих классов | |||
| Новые переменные | a | Адрес хозяина собаки | |
| pr | Наличие прививки | ||
| n | Соответствие породы | ||
| d | Пропорции | ||
| ... | |||
| ... | |||
| Новые методы | PutA(t) | Делает значение адреса равным t | |
| GetA() | Позволяет получить значение параметра a | ||
| PutN(t) | Делает соответствие породы n равным t | ||
| GetN() | Позволяет получить значение параметра n | ||
| PutD(t) | Задает пропорции в равными t | ||
| GetD() | Позволяет получить значение параметра d | ||
| ... | |||
| ... | |||
| Класс KB - охотничьи собаки | Конструктор | KB(a,n,b,pr) | Может задавать не все параметры |
| Методы классов K1 и k2, доступ к которым разрешен снаружи этих классов | |||
| Новые переменные | a | Адрес хозяина собаки | |
| pr | Наличие прививки | ||
| n | Послушание | ||
| b | Быстрота | ||
| ... | |||
| ... | |||
| Новые методы | PutA(t) | Делает значение адреса равным t | |
| GetA() | Позволяет получить значение параметра a | ||
| PutN(t) | Делает соответствие породы n равным t | ||
| GetN() | Позволяет получить значение параметра n | ||
| PutB(t) | Задает пропорции в равными t | ||
| GetB() | Позволяет получить значение параметра b | ||
| ... | |||
| ... | |||
Схематично:
| Класс K1 > | Класс K2 > | Класс KA |
| Класс KB |
Иногда бывают классы и без конструктора, в этом случае для создания экземпляра класса используется конструктор по умолчанию, а значения параметров могут быть заданы позже.
Если конструктором класса A является функция A(x0,y0,k), то для создания нового экземпляра, обозначаемого sobaka1 нужно написать sobaka1=A(x0,y0,k), подставив вместо x0, y0, k координаты места, где находится собака и имя файла с ее расположением. Таким образом можно создать любое количество переменных, содержащих информацию о разных собвках: sobaka1, sobaka2, sobaka3, sobaka4, ...
Еcли собаку, которую мы обозначили sobaka1, нужно переместить в новую точку с координатами (x1, y1), то это делается с помощью заданного в классе K2 метода Move. Нужно написать sobaka1:Move(x1,y1), подставив в качестве значений параметров координаты новой точки, а процесс перемещения изображения собаки по экрану осуществит функция Move.
А теперь рассмоторим класс Point2D который мы будем использовать при создании объектов в Renga.
Конструктор класса: Point2D(x, y)
Параметры:
x (number) – Задает координату по оси X.
y (number) – Задает координату по оси Y.
Методы класса
Для перемещения точки по осям X, Y используется метод
Shift(dX, dY)
Параметры:
dX (number) – Задает смещение по оси X.
dY (number) – Задает смещение по оси Y.
Для поворота точки вокруг заданной точки на заданный угол используется метод
Rotate(point, angle)
Параметры:
point (Point2D) – Задает точку центра вращения.
angle (number) – Задает угол поворота в радианах.
Для масштабирования относительно точки предназначен метод
Scale(point, xScale, yScale)
Параметры:
point (Point2D) – Задает точку центра масштабирования.
xScale (number) – Задает коэффициент масштабирования по оси X.
yScale (number) – Задает коэффициент масштабирования по оси Y.
Создать копию объекта можно с помощью метода
Clone()
Результат: Двухмерная точка, тип Point2D
Получить значение координаты X точки можно методом
GetX()
Результат: число
Получить значение координаты Y точки можно методом
GetY()
Результат: число
Преобразовать согласно матрице можно методом
Transform(matrix)
Параметр:
matrix – из класса Matrix2D. Задает матрицу преобразования в двумерном пространстве.
Операторы, которые можно применять к экземплярам класса Point2D
Проверить равенство с другой точкой == Тип результата: Boolean
Проверить неравенство с другой точкой ~= Тип результата: Boolean
Пример
t=Point2D(10,-3) -- задаем точку с координатами (10, -3)
t:Shift(30,43) -- перемещаем точку t по заданному вектору (30, 43), теперь она имеет координаты (40,40)
t:Rotate(Point2D(0,0), math.rad(45))
-- [[ угол поворота задан в радианах с помощью функции, переводящей градусы (45 градусов) в радианы, точка поворачивается на 45 градусов относительно начала координат. Точка находилась на биссектрирсе первой четверти системы координат, расстояние от точки до начала координат было 56.5685425, теперь она на оси y, ее координаты (0, 56.5685425)
]]
t:Scale(Point2D(0,0), 1, 2) -- точка удаляется в 2 раза по оси от начала координат, теперь её координаты (0,113.137085)
x=t:GetX() -- x равно 0
y=t:GetY() -- y равно 113.137085
Кроме этих классов для работы на плоскости используются классы: GeometrySet2D - набор плоских примитивов; Curve2D - класс кривых в двумерном пространстве; класс FillArea — заливки.
При построении пространственных кривых и тел используются классы точек - Point3D, векторов - Vektor3D, осей - Axis3D.
Конструктор класса Point3D:
Point3D(x,y,z), где x, y, z – координаты точки.
Конструктор класса Vektor3D:
Vector3D(x, y, z) , где x, y, z – координаты вектора
Конструктор класса Axis3D:
Axis3D(point, vector), где point — точка класса Point3D, vector — вектор класса Vektor3D.
У этих классов методы похожие на методы класса Point2D.
В пространстве можно строить кривые класса Curve3D и тела класса Solid.
Кроме глобальной (не изменяющейся) системы координат существуют локальные системы координат, которые задаются классом Placement3D.
Конструктор класса:
Placement3D(origin, vectorZ, vectorX), где origin - точка начала координат (класса Point3D), задающаяся относительно глобальной системы кооржинат, вектора vectorZ, vectorX задают направления оси z и x локальной системы координат относительно глобальной системы координат (оба вектора класса Vektor3D).
В Renga STDL есть еще и другие классы, с которыми мы познакомимся на примерах позднее.
С полным наборов классов можно познакомиться по ссылке