Лабораторная работа № 9
Центральные (перспективные) проекции
 
1. Цель работы
 
1) Освоить программирование центральных (перспективных) проекций трехмерных объектов с использованием методов матричного анализа.
2) Разработать программу с использованием пакета C++Builder, позволяющую демонстрировать:
- влияние различного местоположения центров проецирования на координатных осях на форму одноточечных, двухточечных и трехточечных перспективных проекций заданной фигуры;
- реальное расположение точек схода в трехмерном пространстве;
- различие между истинными и видимыми (кажущимися) объектами.
 
2.  Постановка задачи
 
2.1. В проект, разработанный для лабораторной работы №7 добавить новый модуль с формой Form4.
2.2. В графическом окне Form4 создать локальную систему трехмерных декартовых координат.
2.3. В составе системы координат изобразить прямоугольный параллелепипед. Размеры его сторон указаны в таблице 1 лабораторной работы №7. Фигура должна задаваться координатами вершин: A(x1, y1, z1), B(x2, y2, z2), C(x3, y3, z3), D(x4, y4, z4), E(x5, y5, z5) и т.д. Исходное положение фигуры - в начале системы координат (см. рис 1).
2.4. На координатных плоскостях  XOY, YOZ  и  ZOX  локальной системы координат вывести соответствующие изображения перспективных проекций фигуры.
2.5. Построить лучи проецирования, связывающие центры проецирования  Cx, Cy  и  Cz  с вершинами фигуры и с одноименными вершинами её проекций.
2.6. Построить видимую фигуру, получаемую из исходной после её перспективного преобразования.
2.7. Построить лучи схода, связывающие вершины видимой фигуры с точками схода  TCX. X, TCX. Y  и  TCX. Z.
2.8. Вершины фигуры и координатные оси снабдить буквенными обозначениями.
2.9. Задавая различные значения координат центров проецирования Cx, Cy и  Cz с помощью окошек стандартных компонентов CSpinEdit и флажков CheckBox,  продемонстрировать следующее:
1) Одноточечное проецирование фигуры на координатные плоскости XOY, YOZ, ZOX;
2) Двухточечное проецирование фигуры на плоскости XOY, YOZ, ZOX двумя способами;
3) Трехточечное проецирование фигуры на плоскости XOY, YOZ, ZOX тремя способами;
4) Центры проецирования  Cx, Cy  и  Cz  и лучи проецирования из этих центров;
5) Видимую фигуру;
6) Точки схода TCX. X, TCX. Y  и  TCX. Z  и лучи схода в эти точки;
7) Явление "коллизии" при перспективном проецировании.
 
3.  Краткие теоретические сведения
 
Перспективные проекции относятся к классу центральных проекций. Проецирующие лучи «освещают» трехмерный объект из одного, двух или трех центров проекций, располагаемых, как правило, на главных осях координат X, Y, Z. В зависимости от количества задействованных центров проецирования существуют одно-, двух-, и трехточечные перспективные проекции.
Трехмерные объекты проецируются на главные координатные плоскости: X=0, Y=0, Z=0. Перспективная проекция, по сути, представляет собой «тень» проецируемой фигуры на картинную плоскость, получаемую в результате освещения её точечными источниками света, расположенными в центрах проецирования.
В компьютерной графике чаще других используются проекции на плоскость Z=0. На рисунке 1 показан пример одноточечной перспективной проекции куба, расположенного в начале координат, на плоскость Z=0.
 
 
 
Рисунок 1 - Перспективная проекция куба ABCDEFGH на плоскость Z=0

     Из рисунка видно, что в проекции передняя грань исходного куба EFGH (ближняя к центру проекции) больше, чем задняя, которая осталась неизменной по величине. Это соответствует пространственному восприятию объектов глазом человека. Чем дальше от наблюдателя находится объект, тем меньше кажется он по величине, превращаясь в пределе в точку. Эта точка в перспективных проекциях называется точкой схода и обозначается: TCX. X, TCX. Y  или  TCX. Z,  в зависимости от того, на какой оси они находятся.
В приведенном выше примере в точку схода сойдутся ребра куба  FA, GB, HC, ED,  которые в исходном состоянии были параллельны оси, на которой расположен центр проекций. В лекциях показано, что точка схода находится на таком же расстоянии от центра координат, что и центр проекций, только с обратной стороны. Например, если центр проекций расположен на оси  Z  и имеет координаты CZ(0, 0, 5), то точка схода будет также расположена на оси  Z,  и иметь координаты TCX. Z (0, 0, –5).
Матрица перспективного преобразования трехмерных объектов (1) получается из матрицы общего вида, если элементы главной диагонали a, e, i, s получают значения равные 1, а элементы b, c, d, f, g, h, l, m, n приравниваются нулю:



       Элементы  p, q, r  являются параметрами перспективного проектирования при установке центров проекций на осях X, Y, Z соответственно. Эти параметры численно равны обратной величине расстояния от начала координат до центров проекций, взятой с отрицательным знаком, т. е.:


 
                                  
В одноточечной перспективной проекции в матрице (1) должен быть «включен» только один из трех параметров проектирования: p, q или r. Его величина рассчитывается по одной из формул (2). Два других параметра должны быть «выключены», т.е. приравнены к нулю.
В двухточечной перспективной проекции «включаются» уже два параметра в матрице (1), а «выключенный» параметр приравнивается нулю.
В трехточечной перспективной проекции все три параметра проектирования p, q или r «включены». Их величины рассчитываются по соотношениям (2).
Необходимо отметить, что преобразование трехмерных объектов с помощью матрицы (1) приводит к объемной перспективной проекции, расположенной в трехмерном пространстве. Такую проекцию можно рассматривать, обходя ее со всех сторон. Далее, чтобы получить перспективное изображение на плоском экране монитора, необходимо выполнить ортографическое проецирование на плоскость Z=0.
Тогда результирующая матрица одноточечной перспективной проекции на плоскость Z=0  будет строиться по схеме:
 
                     
В развернутом виде соотношение (3) запишется:
 
 
 
Координаты точек схода рассчитываются следующим образом. Берутся точки, лежащие в бесконечности на главных осях координат X, Y, Z, которые затем преобразуются с помощью результирующих матриц (4), (5), или (6). После их нормировки получаем следующие координаты точек схода:



     Бесконечность в значениях координат точек схода по осям X, Y, Z означает, что ребра исходного объекта, параллельные этим осям, в результате перспективного проектирования остаются параллельными (их точка схода расположена в бесконечности). Из соотношений (7), (8), (9) видно, что точки схода имеют только те ребра исходных объектов, которые были параллельны оси, на которой расположены центры проекций  CX, CY или CZ.
Точки схода для двухточечных и трехточечных перспективных проекций вычисляются аналогично.
Необходимо отметить, что перспективное проектирование с помощью матрицы (1) не позволяет выявить объем трехмерного объекта, если он находится в начальной части системы координат. Поэтому в компьютерной графике принимают специальные меры, повышающие реалистичность изображения.
 
Повышение  реалистичности  изображения  в  перспективных  проекциях
Одноточечная  перспективная  проекция
 
Перспективное проектирование с использованием матрицы (1) не выявляет объема трехмерных объектов по той причине, что из центров проекций, расположенных на главных осях координат X, Y, Z видна только одна грань проектируемого объекта. Для того, чтобы «открыть» взгляду дополнительные грани при одноточечном перспективном проецировании, объект переносят вдоль осей  X, Y, Z  так, чтобы он занял новое положение в пространстве, отвечающее предъявленному требованию.
Эта операция влечет за собой вывод новой результирующей матрицы по схеме:


  
 
Двухточечная перспективная проекция
 
Реалистичность изображений в двухточечных перспективных проекциях можно улучшить двумя способами.
Первый способ. Также, как в случае одноточечной перспективной проекции, проектируемый объект переносится вдоль осей  X, Y, Z  так, чтобы в новом пространственном положении из двух центров проецирования, расположенных на главных осях координат, были видны 3 его грани. Это требует вывода новой результирующей матрицы по схеме:


  
Второй способ. Двухточечную перспективу можно получить из одного центра проекций, если перед проектированием выполнить операцию подготовительного поворота вокруг какой-либо оси. При этом должно соблюдаться следующее правило: поворот объекта осуществляется вокруг тех осей координат, вдоль которых не выполняется проектирование. Например, если центр проекций установлен на оси Z в точке СZ, то объект можно поворачивать на угол θ вокруг оси Y или X.
После поворота может быть выполнен перенос объекта в пространстве вдоль осей X, Y, Z на lX, mY, nZ единиц соответственно.
Результирующая матрица для этого способа двухточечной перспективной проекции выводится по схеме:

 
Из (19) видно, что два элемента четвертого столбца, отвечающие за перспективные проекции, не равны нулю. Это означает, что в результате подготовительного пповорота автоматически «подключился» еще один центр проекций, расположенный на оси X в дополнение к установленному на оси Z. Из (19) также видно, что при отсутствии подготовительного поворота (θ=0), матрица (19) превращается в результирующую матрицу одноточечной перспективной проекции с центром проекции на оси Z и с пространственным переносом объекта вдоль осей X, Y, Z на lX, mY, nZ единиц соответственно.
 
Трехточечная перспективная проекция
 
Реалистичность изображений в трехточечных проекциях можно улучшить тремя способами.
Первый способ. Задаются три центра проекций, расположенных на главных осях координат X, Y, Z. Объект переносится вдоль этих осей в пространство на lX, mY, nZ единиц соответственно. Необходимо вывести новую результирующую матрицу по схеме:


 
Второй способ заключается в предварительном повороте исходного объекта вокруг оси Y на угол θ, затем вокруг оси X на угол φ. После поворотов может быть выполнен перенос объекта вдоль главных осей координат на lX, mY, nZ единиц соответственно. Операция переноса не является обязательной. Если ее не применяют, то в результирующей матрице «выключают» параметры переноса lX, mY, nZ , приравняв их нулю. Подготовленный таким образом трехмерный объект проектируется на плоскость Z=0 с помощью одноточечной перспективной проекции. Результирующая матрица выводится по схеме:


Соотношение (23) показывает, что все три элемента в четвертом столбце результирующей матрицы, отвечающие за перспективные проекции, ненулевые. Это значит, что предварительные повороты объекта вокруг осей  Y и X  эквивалентны «подключению» еще двух центров проецирования, расположенных на осях X и Y, в дополнение к заданному на оси Z.
Из (23) видно, что при нулевых значениях углов θ и φ, т. е. при отсутствии предварительных поворотов, результирующая матрица превращается в результирующую матрицу одноточечной перспективной проекции с улучшенной реалистичностью изображения за счет переносов вдоль осей X, Y, Z на lX, mY, nZ единиц соответственно.
Третий способ заключается в использовании одного поворота (вокруг оси X или оси Y) и двухточечного перспективного проецирования, с центрами проецирования расположенными либо на осях Y и Z или Z и X.


 
 
Коллизии
 
Явление коллизии возникает в том случае, если центр проецирования поместить между объектом и картинной плоскостью. Тогда лучи проецирования, если их пропускать через вершины фигуры, просто не попадают на плоскость проецирования. Аналогичная ситуация возникает если центр проецирования расположить внутри объекта. Здесь мы не сможем спроецировать на картинную плоскость те части нашей фигуры, которые находятся "за спиной" лучей проецирования. При попытках игнорировать этот факт, на изображении будут простраиваться линии, не соответствующие фигуре, так называемые "коллизии". В программе можно будет наглядно увидеть это явление.
Для устранения коллизий необходимо применять алгоритмы трехмерного отсечения для тех частей изображения, которые попадают в зону, невидимую для лучей проецирования. Здесь, в данной работе алгоритмы отсечения мы пока использовать не будем. Вообще, для перспективного проецирования видимой части трехмерного пространства и его элементов без коллизий используются специальные методы отображения, так называемые "камера" и "сцена", которые будут рассматриваться в лабораторной работе №16.


4. Интерфейс программы
 
Работа лабораторной работы №9 начинается после нажатия на кнопку Lab9, расположенной на главной форме проекта Form1. После чего открывается дополнительная форма Form4, с установленными на ней графическим окном и элементами управления (см. рис. 2).
На панели управления формы расположены следующие элементы управления:
- движок TrackBar1  для масштабирования фигуры;
- движки TrackBar2  и TrackBar3 для поворота локальной системы координат и объектов, находящихся в ней, относительно глобальных осей Y и  X;
- движки TrackBar4, TrackBar5 и TrackBar6 для переноса фигуры вдоль локальных осей X, Y и Z;
- окошки Edit1 Edit6 для вывода параметров масштабирования, вращения осей и переноса фигуры;
- флажки CheckBox1, CheckBox2 и CheckBox3 для прорисовки проекций фигуры в трех плоскостях;
- флажки CheckBox4CheckBox5 и CheckBox6 для прорисовки лучей проецирования;
- скроллинговые окошки CSpinEdit1,  CSpinEdit2 и CSpinEdit3 для ввода координат центров проецирования Cx,  Cy и Cz на осях XY и  Z;
- окошки Edit7,  Edit8 и Edit9 для вывода параметров перспективного проецирования  p, q, r;
- флажки CheckBox7CheckBox8 и CheckBox9 для прорисовки точек схода Tсх.xTсх.y,  Tсх.z и лучей схода;
- скроллинговые окошки CSpinEdit4,  CSpinEdit5 и CSpinEdit6 для поворота фигуры относительно локальных осей XY и Z  при построении перспективных проекции вторым, или третьим способом;
- назначение флажков CheckBox10 и CheckBox11   понятно по поясняющим надписям возле них;
- кнопка Batton1 ("Исходное") служит для возврата фигуры и локальных осей в исходное положение.




Рисунок 2 – Окно формы Form4. Одноточечное перспективное проецирование на плоскость Z=0.
 
На рисунке 2 показана форма Form4, в графическом окне которой созданы локальная трехмерная система координат с осями  X,  Y  и  Z , кубическая истинная фигура и её одноточечная перспективная проекция на плоскость XOY (Z=0).
Также здесь построены лучи проецирования из центра Cz и буквенные обозначения вершин фигуры. Сама фигура перенесена по осям  X,  Y  и  Z на значения параметров переноса: L=2m=2n=6.
Локальная система координат и все объекты, находящиеся в ней (фигура, проекции и лучи проецирования) развернуты по осям Y  и X глобальной системы координат на -59 градусов и 30 градусов в каждой.
В окошках  CSpinEdit1, CSpinEdit2 и CSpinEdit3 установлены значения координат центров проецирования Cx, Cy и Cz, которые в свою очередь служат для расчета параметров перспективного проецирования p, q, r. Из них видно, что практическое влияние на характер перспективного проецирования в данном примере оказывает только значение Cz=12. Остальные два параметра достаточно велики (Cy=500, Cx=500), и их условно можно считать равными . Следовательно проецирование по осям Y  и X приближается к параллельному, а не к перспективному. А сам вид проецирования фактически получается одноточечным, с центром проецирования на оси Z.
 
На рисунке 3 изображены исходная (синяя) и видимая фигуры (красная), трехточечная перспективная проекция фигуры (коричневая) на плоскость X=0; центр проецирования Cx с лучами проецирования; и точка схода Tсх с лучами схода.



Рисунок 3 – Изображение исходной (синяя) и видимой фигуры (красная), её трехточечной перспективной проекции на плоскость X=0 (коричневая), центра проецирования Cx и точки схода Tсх.
 
 
Если сравнивать особенности проецирования на рисунках 2 и 3, то видно, что на рисунке 3 лучи проецирования из точки Сх почему-то проходят не через вершины исходного куба а несколько по сторонам. Если бы проецирование было одноточечным, то отклонений не было бы, но когда добавляются дополнительные преобразования, т.е. проецирования по другим осям, происходят и дополнительные изменения координат вершин куба. Это и не позволяет лучам проецирования из точки Сх совместиться с вершинами куба.
 
5. Структура программы
 
Общая структура программы практически совпадает со структурой лабораторной работы №7.
Имеющиеся отличия связаны только с порядком построения матриц преобразования фигуры и её проекций, о чем более подробно будет оговорено далее.


6. СОЗДАНИЕ ДОПОЛНИТЕЛЬНОГО МОДУЛЯ ПРОЕКТА
 
6.1.  Подключение, компоновка и настройка дополнительного модуля Form4
 
Создайте дополнительную форму Form4 аналогично предыдущей работе.
Выполните компоновку формы Form4 в соответствии с рисунком 2.
Выполните необходимую настройку компонентов, совпадающих по назначению с предыдущей лабораторной работой. Для новых компонентов установите следующие настройки:
 
1). Для компонентов  CSpinEdit1 - CSpinEdit3   ("Координаты центров проецирования"):
- Max = 500;
- Min = - 500;
- Position = 20;
 
2). Для компонентов CSpinEdit4 - CSpinEdit6   ("Углы вращения фигуры"):
- Max = 360;
- Min  =-360;
- Position = 0;
 
7. РАЗРАБОТКА ФАЙЛА РЕАЛИЗАЦИИ Unit4.cpp
 
7.1. Предварительные пояснения
 
Порядок разработки файла реализации состоит из 9 этапов:
1-й этап – подготовительный;
2-й этап – разработка управляющих функции;
3-й этап – построение осей координат;
4-й этап – построение истинной фигуры;
5-й этап – построение видимой фигуры;
6-й этап – построение перспективных проекций;
7-й этап – построение центров проецирования и точек схода;
8-й этап – построение лучей проецирования и лучей схода;
9-й этап – разработка вспомогательных функций.
 
1-й  ЭТАП
7.2. Объявление переменных и функций
 
Перечень глобальных переменных (матриц координат, матриц преобразования, простых переменных) практически идентичен аналогичному перечню из лабораторной работы №8, за исключением некоторых добавлений, связанных с тем, что здесь, к осям, фигуре и проекциям мы добавляем еще четыре объекта: видимую фигуру, центры проецирования, точки схода и лучи схода. Тогда перечень глобальных переменных будет иметь вид:
 
static int W,H,Z,h,i,j,k,nOs;
static float l,m,n,p,q,r,s,km,Cx,Cy,Cz;
static float Q1,Q2,F1,F2,G1,k1,k2;
 
    // Объявления матриц координат объектов
static float matrIsxOs[6][4];
static float matrIzmOs[6][4];
static float matrOs[6][4];
 
static float matrIsxFg[8][4];
static float matrIzmFg[8][4];
static float matrFg[8][4];
 
static float matrIzmPrX[8][4];
static float matrIzmPrY[8][4];
static float matrIzmPrZ[8][4];
static float matrPrX[8][4];
static float matrPrY[8][4];
static float matrPrZ[8][4];
 
static float matrIzmVid[8][4];
static float matrVid[8][4];
 
static float matrIsxToht[3][4];
static float matrIzmToht[3][4];
static float matrToht[3][4];
 
    // Объявления матриц преобразования
static float TortX[4][4]={{0,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
static float TortY[4][4]={{1,0,0,0},{0,0,0,0},{0,0,1,0},{0,0,0,1}};
static float TortZ[4][4]={{1,0,0,0},{0,1,0,0},{0,0,0,0},{0,0,0,1}};
 
static float Tper[4][4];
static float Tmsb[4][4];
static float Tpsp[4][4];
 
static float TvrYOs[4][4];
static float TvrXOs[4][4];
 
static float TvrYFg[4][4];
static float TvrXFg[4][4];
static float TvrZFg[4][4];
static float Tpmv[4][4];
 
static float TrezOs[4][4];
static float TrezFg[4][4];
static float TrezPrZ[4][4];
static float TrezPrX[4][4];
static float TrezPrY[4][4];
static float TrezVid[4][4];
static float TrezToht[4][4];
 
    // Прототипы функций преобразования объектов
static void GrafKonv(void);
static void IzmOsi(void);
static void IzmFig(void);
static void IzmPro(void);
static void IzmVid(void);
static void IzmToht(void);
 
    // Прототипы функций вычисления результирующей матрицы
static void RezMatrOs(void);
static void RezMatrFg(void);
static void RezMatrPr(void);
static void RezMatrVid(void);
 
//static void InitTvrY(void);
//static void InitTvrX(void);
//static void InitTvrZ(void);
 
    // Объявления функций вычисления координат объектов
static void MultMatr(float Matr1[4][4], float Matr2[4][4], float Matr3[4][4]);
static void Preobr(int rows,float MatrIsx[][4],float MatrRez[4][4],float MatrIzm[][4]);
static void Normir(int rows, float MatrIzm[][4], float MatrTek[][4]);
 
    // Объявления функций прорисовки изображения
static void ShowAll(void);
static void ShowOsi(void);
static void ShowFig(TColor col, float matrFg[8][4]);
static void ShowPro(float matrPr[8][4]);
static void ShowLuthi(float XToht, float YToht, float matrPr[8][4]);
static void ShowToht(float XToht, float YToht, char text[3]);
static void Oboznath(void);
 
7.3. Функция инициализации исходных данных - FormCreate()
 
Создайте обработчик события FormCreate для формы  Form4  и впишите в него команды, содержащиеся в аналогичной функции в лаб. раб. №8. Кроме этого, добавьте сюда команды инициализации матрицы перспективного преобразования Tpsp[4][4] и её начальных параметров, а также команды инициализации матрицы координат центров проецирования matrIsxToht[3][4]:
 
Cx=20; Cy=20; Cz=20;
p=-1/Cx; q=-1/Cy; r=-1/Cz;
 
Tpsp[0][0]=1; Tpsp[0][1]=0; Tpsp[0][2]=0; Tpsp[0][3]=p;
Tpsp[1][0]=0; Tpsp[1][1]=1; Tpsp[1][2]=0; Tpsp[1][3]=q;
Tpsp[2][0]=0; Tpsp[2][1]=0; Tpsp[2][2]=1; Tpsp[2][3]=r;
Tpsp[3][0]=0; Tpsp[3][1]=0; Tpsp[3][2]=0; Tpsp[3][3]=1;
 
matrIsxToht[0][0]=Cx;matrIsxToht[0][1]=0; matrIsxToht[0][2]=0; matrIsxToht[0][3]=1;
matrIsxToht[1][0]=0; matrIsxToht[1][1]=Cy;matrIsxToht[1][2]=0; matrIsxToht[1][3]=1;
matrIsxToht[2][0]=0; matrIsxToht[2][1]=0; matrIsxToht[2][2]=Cz;matrIsxToht[2][3]=1;
 
7.4. Создание  обработчика события для  PaintBox1
 
Создайте обработчик для компонента PaintBox1, его содержимое полностью идентично предыдущим лабораторным работам:
void __fastcall TForm4::PaintBox1Paint(TObject *Sender)
{
 FPC->Brush->Style=bsSolid;
 FPC->Brush->Color=clWhite;
 FPC->Rectangle(Rect(0,0,W,H));
 
 GrafKonv();
}
Не забудьте описать макрос:      #define FPC Form4->PaintBox1->Canvas
 
2-й ЭТАП
7.5. Разработка управляющих функций
 
В содержимое этого этапа входит разработка функции GrafKonv() и функции ShowAll().
 
7.6. Разработка графического конвейера GrafKonv()
 
Текст этой функции отличается от предыдущей работы только тем, что здесь добавлены вызовы функций преобразования видимой фигуры и преобразования точек проецирования и схода:
 
void GrafKonv(void)
{
 IzmOsi();
 IzmFig();
 IzmVid();
 IzmPro();
 IzmToht();
 
 ShowAll();
}
Добавленные функции выделены синим цветом.
 
7.7. Функция запуска прорисовок  всех объектов - ShowAll()
 
В функции ShowAll() нам необходимо запустить функции, ответственные за прорисовку всех объектов графического окна, перечислим эти объекты:
- трехмерная система координат;
- исходная (истинная) фигура;
- перспективные проекции на плоскости Z=0X=0 и Y=0. (В предыдущей лаб. раб. это были аксонометрические проекции);
- обозначения вершин фигуры.
Эти четыре объекта мы уже создавали в лабораторной работе №7. Следующие пять объектов, которые нам дополнительно надо создать это:
- видимая (преобразованная) фигура;
- центры проецирования Cx, Cy и  Cz в виде точек,
- лучи проецирования, проходящие от центров проецирования, через вершины истинной фигуры к плоскости проецирования, до вершин проекций. (В предыдущей лаб. раб. мы изображали лучи проецирования, но только параллельные, между фигурой и её проекциями);
- точки схода Tсх.x   Tсх.y и Tсх.z;
- лучи схода, проходящие от точек схода к вершинам видимой фигуры;
 
С учетом всех вышеперечисленных пояснений, эта функция будет иметь вид:
 
void ShowAll(void)
{
 ShowOsi();                              // рисуем оси координат
 
 if(Form4->CheckBox10->Checked)          // Если 10-йфлажоквключен,
    ShowFig(clRed,matrVid);              //   рисуемвидимуюфигуру
 
//-----------------------------
 if(Form4->CheckBox7->Checked)           // Если 7-й флажок включен,
   {ShowLuthi(-matrToht[2][0],           //   рисуемлучисходакточке Tcx.z,
              -matrToht[2][1],matrVid);
     ShowToht(-matrToht[2][0],           //   рисуемточку Tcx.z наоси Z
              -matrToht[2][1],"Tz");
   }
 if(Form4->CheckBox8->Checked)           // Если 8-йфлажоквключен,
   {ShowLuthi(-matrToht[0][0],           //   рисуемлучисходакточке Tcx.x,
              -matrToht[0][1],matrVid);
     ShowToht(-matrToht[0][0],           //   рисуемточку Tcx.x наоси X
              -matrToht[0][1],"Tx");
   }
 if(Form4->CheckBox9->Checked)           // Если 9-йфлажоквключен,
   {ShowLuthi(-matrToht[1][0],           //   рисуемлучисходакточке Tcx.y,
              -matrToht[1][1],matrVid);
     ShowToht(-matrToht[1][0],           //   рисуемточку Tcx.y наоси Y
              -matrToht[1][1],"Ty");
   }
//----------------------------------
 if(Form4->CheckBox4->Checked)          // Если 4-йфлажоквключен,
   {ShowLuthi(matrToht[2][0],           //   рисуем лучи проецирования на Z=0,
              matrToht[2][1],matrPrZ);
     ShowToht(matrToht[2][0],           //   рисуем центр проецирования на оси Z,
              matrToht[2][1],"Cz");
   }
 if(Form4->CheckBox5->Checked)          // Если 5-й флажок включен,
   {ShowLuthi(matrToht[0][0],           //   рисуем лучи проецирования на X=0,
              matrToht[0][1],matrPrX);
     ShowToht(matrToht[0][0],           //   рисуем центр проецирования на оси X,
              matrToht[0][1],"Cx");
   }
 if(Form4->CheckBox6->Checked)          // Если 6-й флажок включен,
   {ShowLuthi(matrToht[1][0],           //   рисуем лучи проецирования на Y=0,
              matrToht[1][1],matrPrY);
     ShowToht(matrToht[1][0],           //   рисуем центр проецирования на оси Y,
              matrToht[1][1],"Cy");
   }
//-----------------------------
 if(Form4->CheckBox1->Checked)          // Если 1-йфлажоквключен,
   {ShowPro(matrPrZ);                   //   рисуем проекцию на Z=0
   }
 if(Form4->CheckBox2->Checked)          // Если 2-й флажок включен,
   {ShowPro(matrPrX);                   //   рисуем проекцию на X=0
   }
 if(Form4->CheckBox3->Checked)          // Если 3-й флажок включен,
   {ShowPro(matrPrY);                   //   рисуем проекцию на Y=0
   }
//-----------------------------
 if(Form4->CheckBox11->Checked)         // Если 11-й флажок включен,
    Oboznath();                         //   рисуем обозначения вершин фигуры
 
 ShowFig(clBlue,matrFg);                // Рисуем истинную фигуру
 
 Form4->Edit7->Text=p;
 Form4->Edit8->Text=q;
 Form4->Edit9->Text=r;
}
Здесь, порядок прорисовки зависит от приоритета каждого из объектов. Назначение команд понятно из комментариев.
 
3-й ЭТАП
7.8. Построение осей  координат
 
В работу третьего этапа входит разработка функций IzmOsi(), RezMatrOs(), Preobr(), Normir() и ShowOsi() . Содержимое этих функций полностью соответствует аналогичным функциям из лаб. раб. 7.
Кроме вышеперечисленных функций, необходимо создать обработчики для компонентов TrackBar2 и TrackBar3, с помощью которых будут вводиться углы поворотов осей   Q2 и F2.
Порядок создания этих обработчиков также описан в лаб. раб. 7.
 
4-й ЭТАП
7.9. Построение истинной фигуры
 
Истинная фигура отличается от видимой фигуры тем, что мы её будем строить по принципам аксонометрического проецирования, в то время как видимую – по принципам перспективного проецирования.
Процесс построения истинной фигуры почти полностью совпадает с построением исходной фигуры в лабораторной работе №8.
В работу четвертого этапа входит разработка функций IzmFig(), RezMatrFg() и ShowFig() , содержимое которых полностью соответствует аналогичным функциям из лаб. раб. 8, за исключением небольших отличий в функции  ShowFig(), оговариваемых ниже.
Также как и в л.р. №8, здесь необходимо создать обработчики событий для компонентов управления:
- TrackBar1 – для масштабирования фигуры;
- TrackBar4 – для переноса фигуры вдоль оси X;
- TrackBar5 – для переноса фигуры вдоль оси Y;
- TrackBar6 – для переноса фигуры вдоль оси Z;
- CSpinEdit4 – для ввода угла поворота фигуры по оси Y;
- CSpinEdit5 – для ввода угла поворота фигуры по оси X;
- CSpinEdit6 – для ввода угла поворота фигуры по оси Z;
Первые четыре обработчика возьмите из л.р. №8, создание остальных обработчиков рассмотрено ниже.
 
7.10. Разработка функции вычисления результирующей матрицы RezMatrFg()
 
Напомним, что структура результирующей матрицы преобразования истинной фигуры имеет вид:
 
TrezFg = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * (TvrYOs * TvrXOs * TortZ)
 
Или, в упрощенном виде:
 
TrezFg = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * TrezOs
 
Тогда текст самой функции будет иметь вид:
 
void RezMatrFg(void)
{
 float T1[4][4],T2[4][4],T3[4][4];
 
 MultMatr(TvrYFg, TvrXFg, T1);       // 1-япромежуточн. матр. преобр.фиг.
 MultMatr(T1, TvrZFg, T2);           // 2-япромежуточн. матр. преобр.фиг.
 MultMatr(Tper, Tmsb, T3);           // 3-япромежуточн. матр. преобр.фиг.
 MultMatr(T2, T3, Tpmv);             // 4-япромежуточн. матр. преобр.фиг.
 MultMatr(Tpmv, TrezOs, TrezFg);     // Результирующаяматрицапреобр.фиг.
}
 
7.11. Обработчики событий для окошек CSpinEdit4 CSpinEdit 5 и CSpinEdit 6
 
Скроллинговые окна  CSpinEdit4 CSpinEdit5 и CSpinEdit6  предназначены для вращения фигуры вокруг локальных осей YX и Z соответственно. Рассмотрим пример программного кода для CSpinEdit4:
 
void __fastcall TForm4::CSpinEdit4Change(TObject *Sender)
{
 Q1 =(Form4->CSpinEdit4->Value);
 
 TvrYFg[0][0]=cos(k2*Q1); TvrYFg[0][1]=0; TvrYFg[0][2]=-sin(k2*Q1); TvrYFg[0][3]=0;
 TvrYFg[1][0]=0;          TvrYFg[1][1]=1; TvrYFg[1][2]=0;           TvrYFg[1][3]=0;
 TvrYFg[2][0]=sin(k2*Q1); TvrYFg[2][1]=0; TvrYFg[2][2]= cos(k2*Q1); TvrYFg[2][3]=0;
 TvrYFg[3][0]=0;          TvrYFg[3][1]=0; TvrYFg[3][2]=0;           TvrYFg[3][3]=1;
 
 Repaint();
}
Обработчики событий для CSpinEdit 5 и CSpinEdit 6 создайте самостоятельно с необходимыми изменениями.
7.12. Функция прорисовки фигуры ShowFig()
 
Функция ShowFig()  незначительно отличается от аналогичной функции из лаб. раб. №8 из-за того, что нам необходимо использовать её дважды: для прорисовки истинной фигуры и прорисовки видимой фигуры с разным цветом линий. Это потребовало добавления списка формальных параметров для этой функции. Приведем часть её программного кода, чтобы можно было понять суть отличий:
 
void ShowFig(TColor col,float matrFg[8][4])
{
 FPC->Pen->Style=psSolid; // Устанавливаем свойства пера
 FPC->Pen->Width=3;
 FPC->Pen->Color=col;
                     //рисуем линию AB
 FPC->MoveTo(W/2+int(h* matrFg[0][0]), H/2-int(h* matrFg[0][1]));
 FPC->LineTo(W/2+int(h* matrFg[1][0]), H/2-int(h* matrFg[1][1]));
                    //рисуем линию BC
 FPC->MoveTo(W/2+int(h* matrFg[1][0]), H/2-int(h* matrFg[1][1]));
 FPC->LineTo(W/2+int(h* matrFg[2][0]), H/2-int(h* matrFg[2][1]));
 
//... и т. д.
 
 FPC->Pen->Width=1;
 FPC->Pen->Color=clBlack;
}
5-й ЭТАП
7.13. Порядок построения видимой фигуры
 
Видимая фигура – это та же самая истинная фигура, но только подвернутая перспективному преобразованию. И над ней совершаются те же самые переносы, масштабирование и вращения, что и над истинной фигурой. Поэтому, здесь не надо создавать обработчики событий для движков и окошек.
Отличия в создании видимой фигуры связаны с добавлением в результирующую матрицу преобразования TrezVid[4][4] матрицы перспективного преобразования Tpsp[4][4], все остальные функции не изменятся, поэтому, порядок построения видимой фигуры будет следующий:
- создадим запускающую функцию  IzmVid(), для обеспечения конвейерного запуска следующих функций: функции вычисления результирующей матрицы преобразования  RezMatrVid(), функции преобразования координат видимой фигуры  Preobr() и функции нормировки координат видимой фигуры Normir();
- поместим вызов функции IzmVid() в функцию  GrafKonv();
- создадим функцию вычисления результирующей матрицы  RezMatrVid();
Функция ShowFig()  уже создана раннее, она позволяет выполнять прорисовку как истинной фигуры, так и видимой фигуры, в зависимости от значения её фактических параметров, с использованием отнормированных координат фигуры.
 
7.14. Функция обработки  координат видимой фигуры IzmVid()
 
Функция обработки координат видимой фигуры должна обеспечить последовательный запуск функции вычисления результирующей матрицы преобразования  RezMatrVid(), функции преобразования координат фигуры Preobr() и функции нормировки координат фигуры Normir():
 
void IzmVid(void)
{
 RezMatrVid();
 Preobr(8,matrIsxFg,TrezVid,matrIzmVid); // Преобразов. координат вид.фигуры
 Normir(8,matrIzmVid,matrVidFg);          // Нормировка координат вид.фигуры
}
Функции Preobr() и Normir() уже созданы при построении осей, и здесь достаточно выполнить их вызов с необходимыми параметрами.
 
7.15. Разработка функции вычисления результирующей матрицы 
 видимой фигуры RezMatrVid()
 
Результирующая матрица преобразования видимой фигуры отличается от аналогичной матрицы преобразования истинной фигуры незначительно. В цепочку составляющих её матриц надо вставить еще одну матрицу – матрицу перспективного проецирования Tpsp в следующем виде:
 
TrezVid = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * Tpsp * (TvrYOs * TvrXOs * TortZ)
 
Назначение здесь трех матриц вращения фигуры  TvrYFg,TvrXFg  и TvrZFg  не в том, чтобы формировать аксонометрические проекции, как это было в предыдущей лабораторной работе, а в том, чтобы формировать двухточечные и трехточечные перспективные проекции вторым и третьим способами. Из раздела 3 Кратких теоретических сведений вы знаете, что эти виды проекций можно получать, используя также повороты вокруг осей для подключения дополнительных центров проецирования, что мы и попытаемся продемонстрировать в этой программе. Сами же матрицы  TvrYFg,TvrXFg  и TvrZFg, пока не будут заданы значения углов поворотов фигуры с помощью компонентов CSpinEdit4 – CspinEdit6,  никакого влияния на результирующую матрицу оказывать не будут, т.к., когда значения углов поворотов равны нулю, матрицы вращения фигуры превращаются в единичные матрицы.
Произведение первых пяти матриц схемы уже вычислено в функции RezMatrFg() и запомнено в промежуточной матрице Tpmv, а произведение последних трех матриц вычислено в функции RezMatrOs() в матрице TrezOs поэтому, перепишем схему вычисления матрицы преобразования проекций в другом виде:
TrezVid = Tpmv * Tpsp * TrezOs
 
Тогда программный код функции будет иметь вид:
 
void RezMatrVid(void)
{
 float T1[4][4];
 MultMatr(Tpmv, Tpsp, T1);              // Промежуточн. матр. преобр. вид. фиг.
 MultMatr(T1, TrezOs, TrezVid);         // Рез. матрица преобр. вид. фигуры
}
 
6-й ЭТАП
7.16. Порядок построения проекций
 
Порядок построения проекций полностью совпадает с порядком построения проекций в лабораторных работах №7 и 8:
- создадим запускающую функцию  IzmPro(), для обеспечения конвейерного запуска следующих функций: функции вычисления результирующей матрицы преобразования  RezMatrPr(), функции преобразования координат проекций Preobr() и функции нормировки координат проекций Normir();
- поместим вызов функции IzmPro() в GrafKonv();
- создадим функцию вычисления результирующей матрицы  RezMatrPr();
- создадим функцию ShowPro() для прорисовки проекций с использованием отнормированных текущих координат проекций.
Для включения прорисовки проекций заданной фигуры в трех координатных плоскостях локальной системы координат создадим следующие обработчики:
- обработчик события CheckBox1 – флажок запуска прорисовки проекции на плоскость Z=0;
- обработчик события CheckBox2 – флажок запуска прорисовки проекции на плоскость Y=0;
- обработчик события CheckBox3 – флажок запуска прорисовки проекции на плоскость X=0;
- создадим функцию ShowPro()    - для прорисовки проекций на три координатные плоскости.
 
7.17. Создание обработчиков событий для флажков
CheckBox1,   CheckBox2 и CheckBox3
 
Создайте обработчики для этих компонентов и впишите в них только одну команду:   Repaint();
 
7.18. Функция обработки  координат проекций IzmPro()
 
Функция обработки координат трех проекций должна обеспечить последовательный запуск функции RezMatrPr() для вычисления трех результирующих матриц преобразования, трех функций преобразования координат проекций Preobr() и трех функций нормировки координат проекций Normir():
 
void IzmPro(void)
{
 RezMatrPr();                // Вычисление рез. матриц преобразования проекц.
 Preobr(8,matrIsxFg,TrezPrX,matrIzmPrX);// Преобразование координат проекц.X
 Preobr(8,matrIsxFg,TrezPrY,matrIzmPrY);// Преобразование координат проекц.Y
 Preobr(8,matrIsxFg,TrezPrZ,matrIzmPrZ);// Преобразование координат проекц.Z
 
 Normir(8,matrIzmPrX,matrPrX);          // Нормировка координат проекции X
 Normir(8,matrIzmPrY,matrPrY);          // Нормировка координат проекции Y
 Normir(8,matrIzmPrZ,matrPrZ);          // Нормировка координат проекции Z
}
 
7.19. Разработка функции вычисления результирующих матриц - RezMatrPr()
 
Три матрицы преобразования проекций на локальные плоскости Z=0X=0 и Y=0, которые мы получим в результате работы этой функции, формируются при перемножении нескольких матриц базовых видовых преобразований.
Схемы формирования результирующих матриц преобразования будут иметь вид:
 
TrezPrZ = (TvrYFg * TvrXFg *TvrZFg) * Tper * Tmsb * Tpsp * TortZ * (TvrYOs * TvrXOs) * TortZ
TrezPrX = (TvrYFg * TvrXFg *TvrZFg) * Tper * Tmsb * Tpsp * TortX * (TvrYOs * TvrXOs) * TortZ
TrezPrY = (TvrYFg * TvrXFg *TvrZFg) * Tper * Tmsb * Tpsp * TortY * (TvrYOs * TvrXOs) * TortZ
 
Здесь, произведение первых пяти матриц уже вычислено в функции RezMatrFg() и запомнено в промежуточной матрице Tpmv, а произведение последних трех матриц вычислено в функции RezMatrOs() в матрице TrezOs поэтому, перепишем схемы вычисления матриц преобразования проекций в другом виде:
 
TrezPrZ = Tpmv * Tpsp * TortZ * TrezOs
TrezPrX = Tpmv * Tpsp * TortX * TrezOs
TrezPrY = Tpmv * Tpsp * TortY * TrezOs
 
В результате чего получим три матрицы преобразования проекций: TrezPrZ[4][4], TrezPrY[4][4], TrezPrX[4][4].
 
void RezMatrPr(void)
{
 float Tx1[4][4],Tx2[4][4];
 float Ty1[4][4],Ty2[4][4];
 float Tz1[4][4],Tz2[4][4];
 
 MultMatr(Tpmv, Tpsp, Tx1);       // 1-я промежуточн. матр. преобр.проекц.X
 MultMatr(Tx1,TortX,Tx2);         // 2-я промежуточн. матр. преобр.проекц.X
 
 MultMatr(Tpmv, Tpsp, Ty1);       // 1-я промежуточн. матр. преобр.проекц.Y
 MultMatr(Ty1,TortY,Ty2);         // 2-я промежуточн. матр. преобр.проекц.Y
 
 MultMatr(Tpmv, Tpsp, Tz1);       // 1-я промежуточн. матр. преобр.проекц.Z
 MultMatr(Tz1,TortZ,Tz2);         // 2-я промежуточн. матр. преобр.проекц.Z
 
 MultMatr(Tx2, TrezOs, TrezPrX); // Результирующая матрица преобр.проекц.X
 MultMatr(Ty2, TrezOs, TrezPrY); // Результирующая матрица преобр.проекц.Y
 MultMatr(Tz2, TrezOs, TrezPrZ); // Результирующая матрица преобр.проекц.Z
}
 
7.20. Разработка функций прорисовки проекций ShowPro()
 
Функция ShowPro()  не отличается от аналогичной функции из лаб. раб. №8, скопируйте её оттуда и запустите программу на исполнение. Проверьте работу флажков CheckBox1 CheckBox2 и  CheckBox3 для включения прорисовки всех трех проекций.
 
7-й ЭТАП
7.21. Порядок построения центров проецирования
 
Порядок построения центров проецирования  Cx, Cy  и Cz незначительно отличается от порядка построения других фигур. Отличие связано с тем, что здесь не надо создавать функцию вычисления результирующей матрицы преобразования. Для преобразования координат центров можно использовать уже разработанную матрицу преобразования осей, так как центры располагаются на осях, поэтому:
- создадим запускающую функцию  IzmToht() , для обеспечения запуска функции преобразования координат центров Preobr() и функции нормировки координат центров Normir();
- поместим вызов функции IzmToht()  в GrafKonv();
- создадим функцию ShowToht() для прорисовки центров проецирования и точек схода с использованием отнормированных текущих координат центров;
- создадим обработчики для компонентов CSpinEdit1CSpinEdit3 для установки координат центров проецирования.
 
Разработка функций для точек схода Tсх.x Tсх.y  и Tсх.z не выполняется. В этом нет необходимости, так как координаты точек схода равны координатам центров проецирования, взятыми с обратным знаком.
 
7.22. Функция обработки  координат центров проецирования IzmToht()
 
К преобразованиям, которые производятся над центрами проецирования Cx, Cy  и Cz  можно отнести только аксонометрические повороты осей координат. Матрица поворота осей TrezOs уже создана в функции  RezMatrOs()  и здесь мы не будем её создавать. Поэтому, содержимое функции   IzmToht()   будет минимальным:
 
void IzmToht(void)
{
 Preobr(3,matrIsxToht,TrezOs,matrIzmToht);// Преобр.координат центров проецир.
 Normir(3,matrIzmToht,matrToht);          // Нормир.координат центров проецир.
 }
 
7.23. Функция прорисовки центров проецирования и точек схода ShowToht()
 
Функция ShowToht() имеет вид:
 
void ShowToht(float XToht,float YToht,char text[3])
{
 int XTohtEkr,YTohtEkr;
 
 XTohtEkr=W/2+ int(h* XToht);
 YTohtEkr=H/2- int(h* YToht);
 FPC->Ellipse(XTohtEkr-4, YTohtEkr-4, XTohtEkr+4, YTohtEkr+4);
 FPC->TextOut(XTohtEkr, YTohtEkr+10,text);
}
7.24. Создание обработчиков для скроллинговых окошек
CSpinEdit1CSpinEdit3
 
В составе этих обработчиков необходимо сначала прочитать значения координат центров проецирования Cx, Cy или Cz , затем вычислить параметры p, q, r, после чего внести эти значения в матрицу исходных координат. Затем можно вызвать команду перерисовки графического окна. Ниже приводится пример программного кода для CSpinEdit1, остальные два обработчика создайте самостоятельно.
 
void __fastcall TForm4::CSpinEdit1Change(TObject *Sender)
{
 Cx=(Form4->CSpinEdit1->Value);
 if(Cx==0) Cx=0.001;
 p=-1/Cx;
 Tpsp[0][3]=p;
 matrIsxToht[0][0]=Cx;
 Repaint();
}
8-й ЭТАП
7.25. Порядок построения лучей проецирования и лучей схода
 
Для прорисовки лучей проецирования достаточно иметь координаты центров проецирования Cx, Cy и Cz и координаты вершин проекций на плоскостях Z=0X=0  и Y=0.
Для прорисовки лучей схода достаточно иметь координаты точек схода Tсх.x Tсх.y  и Tсх.z и координаты видимой (преобразованной) фигуры.
Для запуска прорисовки лучей проецирования и центров проецирования необходимо создать обработчики событий для компонентов CheckBox4   CheckBox5,  CheckBox6  с одной командой:  Repaint().
Для запуска прорисовки лучей схода и точек схода необходимо создать обработчики событий для компонентов CheckBox7, CheckBox8,  CheckBox9  с командой Repaint().
Прорисовка лучей проецирования и лучей схода осуществляется с помощью одной и той же функции ShowLuthi() , при вызове которой можно задавать соответствующие фактические параметры (см. п.7.7.).
 
7.26. Разработка функции прорисовки лучей проецирования ShowLuthi()
 
Функция ShowLuthi() выполняет прорисовку лучей проецирования или лучей схода штриховыми линиями.
Здесь необходимо прорисовать каждый луч по отдельности, в виде линий, связывающих центры проецирования Cx, Cy и Cz(или точки схода) с вершинами фигуры и с одноименными вершинами проекций.
Нужно иметь в виду, что чем больше значения координат центров проецирования Cx, Cy и Cz, задаваемые в окошках CSpinEdit1,  CSpinEdit2 или CSpinEdit3, тем дальше от объекта эти центры будут располагаться и тем более параллельными будут лучи проецирования. Максимальные значения Cx, Cy и Cz, установленные в программе, равны 500. Этого достаточно, чтобы перспективное проецирование по выбранным осям было "выключено" в случае установки для них этих максимальных значений. Тогда мы получим одноточечные или двухочечные проекции.
Для нашего примера с фигурой кубической формы нам необходимо прорисовать 8 штриховых линий, по количеству вершин фигуры. И это только для одной проекции. Чтобы прорисовать три группы лучей проецирования, функция ShowLuthi() будем вызывать три раза из функции ShowAll().
Пример описания функции ShowLuthi() имеет следующий вид:
 
void ShowLuthi(float XToht, float YToht, float matrPr[8][4])
{
 FPC->Pen->Style=psDot;                         // стиль линий - штриховой
 FPC->Pen->Color=clMaroon;                      // цвет линий  - коричневый
 
                     //рисуем луч A
 FPC->MoveTo(W/2+int(h* XToht), H/2-int(h* YToht));
 FPC->LineTo(W/2+int(h* matrPr[0][0]), H/2-int(h* matrPr[0][1]));
                     //рисуем луч B
 FPC->MoveTo(W/2+int(h* XToht), H/2-int(h* YToht));
 FPC->LineTo(W/2+int(h* matrPr[1][0]), H/2-int(h* matrPr[1][1]));
                     //рисуем луч C
 FPC->MoveTo(W/2+int(h* XToht), H/2-int(h* YToht));
 FPC->LineTo(W/2+int(h* matrPr[2][0]), H/2-int(h* matrPr[2][1]));
                     //рисуем луч D
 FPC->MoveTo(W/2+int(h* XToht), H/2-int(h* YToht));
 FPC->LineTo(W/2+int(h* matrPr[3][0]), H/2-int(h* matrPr[3][1]));
 
// Остальные 4 луча E, F, G, H   прорисуйте самостоятельно
 
  FPC->Pen->Style=psSolid;         // стиль линий – в исходное состояние
}
Добавьте недостающие команды прорисовки лучей  E, F, G, H  и запустите программу на исполнение.
Прорисовка лучей проецирования будет выполняться вместе с прорисовкой центров проецирования, после включения флажков в компонентах CheckBox4 -  CheckBox6.
Прорисовка лучей схода будет выполняться вместе с прорисовкой точек схода, после включения флажков в компонентах CheckBox7 -  CheckBox9.
 
9-й ЭТАП
7.27. Разработка функции прорисовки обозначений  Oboznath()
 
Функция прорисовки обозначений фигуры полностью идентична такой же функции в лаб. раб. №7.
Не забудьте создать обработчик события для компонента "Обозначения"
 
7.28. Создание  обработчика события для  Button1 ("Исходное")
 
Создайте обработчик события для кнопки "Исходное" и впишите в него следующие команды:
 
void __fastcall TForm3::Button1Click(TObject *Sender)
{
 Form4->TrackBar1->Position=10;
 Form4->TrackBar2->Position=-65;
 Form4->TrackBar3->Position=30;
 Form4->TrackBar4->Position=0;
 Form4->TrackBar5->Position=0;
 Form4->TrackBar6->Position=0;
 
 Form4->CheckBox1->Checked=false;
 Form4->CheckBox2->Checked=false;
 Form4->CheckBox3->Checked=false;
//... и т. д. для всех CheckBox
 
 Form4->CSpinEdit1->Text=20;
 Form4->CSpinEdit2->Text=20;
 Form4->CSpinEdit3->Text=20;
 Form4->CSpinEdit4->Text=0;
 Form4->CSpinEdit5->Text=0;
 Form4->CSpinEdit6->Text=0;
 
 Repaint();
}
 
 
8. Контрольные вопросы
 
1. Какие изменения происходят с кубом, изображенным в одноточечной перспективной проекции?
2. Для каких целей выполняется предварительный перенос объекта вдоль осей X, Y, Z?
3. Что такое «точка схода» и как она вычисляется?
4. Можно ли выполнять перспективное проектирование, располагая центр проекций на осях X, Y, Z?
5. Как выглядит одноточечная перспективная проекция куба, расположенного в начале координат?
6. Как выглядит одноточечная перспективная проекция куба, центрированного относительно начала координат? Как и для чего выполняется центрирование?
7. Какие изменения происходят с кубом в двухточечной перспективной проекции ?
8. Как выглядит перспективная двухточечная проекция куба, расположенного в начале координат?
9. Как выглядит перспективная двухточечная проекция куба, центрированного относительно начала координат? Для чего выполняется операция центрирования?
10. Какие изменения происходят с кубом в трехточечной перспективной проекции?
11. Как построить результирующую матрицу преобразования для первого способа получения реалистичных изображений ?
12. Как построить результирующую матрицу преобразования для второго способа получения реалистичных изображений ?
13. Как выглядит перспективная трехточечная проекция куба, расположенного в начале координат?
14. Как выглядит перспективная трехточечная проекция куба, центрированного относительно начала координат? Для чего выполняется операция центрирования?