4. Интерфейс программы
Работа лабораторной работы №8 начинается после нажатия на кнопку Lab8, расположенной на главной форме проекта Form1. После чего должна открываться дополнительная форма Form3, с установленными на ней графическим окном и элементами управления (см. рис. 3).
Рисунок 3 – Окно формы Form3 с изображением исходной фигуры и её триметрических проекций
Элементы управления располагаются на панели Panel1. Перечислим назначение всех элементов:
- движок TrackBar1 предназначен для масштабирования фигуры внутри локальной системы координат;
- движки TrackBar2 и TrackBar3 предназначены для изменения углов поворота всей системы координат и объектов, находящихся в ней, относительно глобальных осей Y и X соответственно;
- движки TrackBar4, TrackBar5 и TrackBar6 предназначены для перемещения ("переноса") фигуры вдоль локальных осей X, Y и Z соответственно;
- движки TrackBar7, TrackBar8 и TrackBar9 предназначены для изменения углов поворота фигуры относительно локальных осей X, Y и Z при построении триметрической проекции;
- движки TrackBar10, TrackBar11 и TrackBar12 предназначены для изменения коэффициентов искажения диметрической проекции KX , KY и KZ по осям X, Y и Z соответственно;
- все окошки ввода Edit1 - Edit12 предназначены для отображения численных значений параметров Position компонентов TrackBar, возле которых они расположены;
- назначение флажков CheckBox1 - CheckBox5 можно понять по поясняющим надписям возле них;
- радиокнопки RadioBatton1 - RadioBatton4 служат для выбора одного из четырех видов изометрических проекций.
- радиокнопки RadioBatton5 – RadioBatton7 служат для выбора одного из видов аксонометрического проецирования.
На рисунке 3 показана форма Form3, в графическом окне которой созданы локальная трехмерная система координат, кубическая фигура и три аксонометрических (триметрических) проекции этой фигуры на плоскости XOY, YOZ и ZOX.
Также здесь построены лучи проецирования и установлены буквенные обозначения для вершин фигуры. Сама фигура перенесена по осям X, Y и Z на значения параметров переноса: L=-5 , m=4, n=12.
Локальная система координат и все объекты, находящиеся в ней (фигура, проекции и лучи проецирования) развернуты по осям X и Y глобальной системы координат на -38 и 25 градусов в каждой.
5. Структура программы
Общая структура программы полностью совпадает со структурой лабораторной работы №7.
Имеющиеся отличия связаны только с порядком построения матриц преобразования фигуры и её проекций, о чем более подробно будет оговорено далее.
6. СОЗДАНИЕ ДОПОЛНИТЕЛЬНОГО МОДУЛЯ ПРОЕКТА
6.1. Подключение, компоновка и настройка дополнительного модуля Form3
Создайте дополнительную форму Form3 аналогично предыдущей работе.
Выполните компоновку формы Form3 в соответствии с рисунком 3.
В окне Object Inspector выполните необходимую настройку компонентов, аналогичных предыдущей лабораторной работе. Установите следующие настройки для новых компонентов:
1). Для компонентов TrackBar7, TrackBar8 и TrackBar9 ("Триметрия"):
- Max = 360;
- Min =-360;
- Position = 0;
2). Для компонентов TrackBar10, TrackBar11 и TrackBar12 ("Диметрия"):
- Max = 100;
- Min = 10;
- Position = 10;
3). Для компонентов Edit10 - Edit12 (Окна ввода коэффициентов искажений для диметрий):
- Text = ;
4). Для компонента RadioButton1 ("Триметрия"):
- Checked = true.
7. РАЗРАБОТКА ФАЙЛА РЕАЛИЗАЦИИ Unit3.cpp
7.1. Предварительные пояснения
Порядок разработки файла реализации состоит из 7 этапов:
- 1-й этап – подготовительный;
- 2-й этап – разработка управляющих функции;
- 3-й этап – построение осей координат;
- 4-й этап – построение фигуры;
- 5-й этап – построение проекций;
- 6-й этап – построение лучей и обозначений;
- 7-й этап – разработка функций построения диметрий и изометрий.
Отличающиеся элементы программного кода этой лабораторной работы будут содержаться только в функциях расчета результирующих матриц фигуры и её проекций: там вместо косоугольных матриц необходимо будет ввести матрицы вращения фигуры вокруг локальных осей Y, X и Z.
1-й ЭТАП
7.2. Объявление переменных и функций
Весь перечень переменных, используемый в этой лабораторной работе, практически полностью совпадает с перечнем предыдущей работы, за исключением следующих отличий:
- отсутствуют все переменные и матрицы, связанные с описанием косоугольного проецирования;
- добавлены описания переменных Q1, F1 и G1 для задания углов поворота фигуры относительно локальных осей Y, X и Z;
- добавлены описания переменных kx, ky, kz - коэффициентов искажения по осям Y, X и Z;
- добавлены описания матриц вращения фигуры относительно локальных осей Y, X и Z:
- static float TvrYFg[4][4] – матрица вращения фигуры относительно локальной оси Y;
- static float TvrXFg[4][4] – матрица вращения фигуры относительно локальной оси X;
- static float TvrZFg[4][4] – матрица вращения фигуры относительно локальной оси Z;
- добавлены описания прототипов функций вычисления матриц вращения фигуры по трем осям:
- static void InitTvrY(void)
- static void InitTvrX(void)
- static void InitTvrZ(void)
7.3. Разработка функции инициализации исходных данных FormCreate()
Эта функция содержит те же самые команды исходной инициализации, что и в лаб. раб. 7, за исключение следующих отличий:
- отсутствует инициализация переменных косоугольного проецирования;
- добавлена инициализация углов поворота фигуры в локальной системе координат:
Q1=0;
F1=0;
G1=0;
- добавлены вызовы функций инициализации матриц вращения фигуры в виде:
InitTvrY();
InitTvrX();
InitTvrZ();
7.4. Создание обработчика события для PaintBox1
Содержимое обработчика для компонента PaintBox1 полностью соответствует л.р. №7.
2-й ЭТАП
7.5. Разработка управляющих функций
В работу второго этапа входит разработка функции GrafKonv() и функции ShowAll(). Текст этих функций соответствует таким же функциям в лаб. раб. 7, за исключением номера формы.
3-й ЭТАП
7.6. Построение осей координат
В работу третьего этапа входит разработка функций IzmOsi(), RezMatrOs(), Preobr(), Normir() и ShowOsi(). Содержимое этих функций полностью соответствует аналогичным функциям из лаб. раб. 7.
Чтобы не повторять разработку одинаковых функций из раза в раз во всех четырех лабораторных работах, можно создать библиотечный модуль, и поместить в него такие функции как Preobr(), Normir(), ShowOsi() и другие, по собственному усмотрению.
Кроме вышеперечисленных функций, необходимо создать обработчики для компонентов TrackBar2 и TrackBar3, с помощью которых будут вводиться углы поворотов осей Q2 (вокруг Y) и F2 (вокруг X).
Порядок создания этих обработчиков описан в лаб. раб. 7.
4-й ЭТАП
7.7. Построение фигуры
В работу четвертого этапа входит разработка функций IzmFig(), RezMatrFg() и ShowFig(). Содержимое функций IzmFig() и ShowFig() полностью соответствует аналогичным функциям из лаб. раб. 7. Создайте эти функции самостоятельно.
Что касается функции RezMatrFg(), то здесь имеются отличия в формировании цепочки из матриц преобразования. Отличия связаны с тем, что в этой лабораторной работе фигура должна подвергаться аксонометрическим преобразованиям на только вокруг глобальных осей, но и в составе локальной системы координат. Поэтому, в общую цепочку видовых преобразований над фигурой должны войти следующие матрицы:
- три матрицы вращения в составе локальных осей Y, X и Z;
- матрица переноса;
- матрица масштабирования;
- две матрицы вращения в составе глобальных осей Y и X;
- ортографическая матрица.
С учетом этого структура результирующей матрицы преобразования фигуры будет иметь вид:
TrezFg = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * (TvrYOs * TvrXOs * TortZ)
В этой цепочке задействованы все три матрицы вращения фигуры, хотя в формулах (2), (7) и (8) при-сутствуют только две матрицы поворота. Такая программная реализация не противоречит теории, где сказано, что в триметриях должны быть "включены" только два поворота. Третий поворот, хотя и при-сутствует в цепочке, но он не работает, его угол равен нулю, а следовательно и матрица этого поворота становится единичной и никак не влияет на общее произведение. При создании аксонометрических проекций на три координатные плоскости, для каждой из них берется своя пара поворотов, и третий, холостой поворот также – другой.
Обозначим произведение первых пяти матриц как Tvid. Объявите глобально эту матрицу. Она нам ещё пригодится при формировании результирующих матриц для проекций.
Произведение последних трех матриц уже вычислено в функции RezMatrOs() в матрице TrezOs, поэтому структуру результирующей матрицы можно упростить:
TrezFg = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * TrezOs
С учетом этой структуры, создайте функцию RezMatrFg(). В качестве образца используйте аналогичную функцию из лаб. раб. 7.
Кроме вышеперечисленных функций, создайте обработчики для компонентов управления:
- обработчик события TrackBar1 –для масштабирования фигуры;
- обработчик события TrackBar4 –для переноса фигуры вдоль оси X;
- обработчик события TrackBar5 –для переноса фигуры вдоль оси Y;
- обработчик события TrackBar6 – для переноса фигуры вдоль оси Z;
- обработчик события TrackBar7 – для изменения угла поворота фигуры по оси Y;
- обработчик события TrackBar8 – для изменения угла поворота фигуры по оси X;
- обработчик события TrackBar9 – для изменения угла поворота фигуры по оси Z;
Порядок создания обработчиков для TrackBar1, TrackBar4 – TrackBar6 описан в лаб. раб. 7.
7.8. Разработка функций инициализации InitTvrY(), InitTvrX() и InitTvrZ()
Состав этих функций аналогичен тому, как мы инициализировали матрицы вращения для осей в составе функции FormCreate() и имеет вид:
void InitTvrY(void)
{
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;
}
Функции инициализации InitTvrX() и InitTvrZ() создайте самостоятельно, внеся необходимые изменения. Напоминаем, что для TvrXFg[4][4] используется угол F1, а для TvrZFg[4][4] – угол G1.
7.9. Создание обработчиков событий для движков
TrackBar7, TrackBar8 и TrackBar9
Движки TrackBar7, TrackBar8 и TrackBar9 предназначены для вращения фигуры вокруг локальных осей Y, X и Z соответственно. Они обеспечивают реализацию триметрий.
Рассмотрим пример программного кода для TrackBar7:
void __fastcall TForm3::TrackBar7Change(TObject *Sender)
{
if(Form3->RadioButton5->Checked)
{Q1=(Form3->TrackBar7->Position);
Form3->Edit7->Text=FloatToStr(Q1);
InitTvrY();
Repaint();
}
}
Здесь мы сначала считываем значение позиции движка в переменную Q1. Затем выводим это же самое значение в окошко Edit7, для осуществления контроля над вводом данных при перемещении движка. Для нового значения угла поворота Q1 необходимо пересчитать параметры матрицы вращения в функции InitTvrX().
В заключение вызывается функция перерисовки графического окна Repaint(), что приведет к запуску графического конвейера и соответственно к перерисовке фигуры с измененным углом поворота.
Обработчики событий для TrackBar8 и TrackBar9 создайте самостоятельно. Измените в них обозначения углов поворотов, матрицы вращения и номера окошек вывода углов поворота.
5-й этап
7.10. Построение проекций
Порядок построения проекций аналогичен порядку построения осей или фигуры.
Здесь необходимо разработать функции IzmPro(), RezMatrPr() и ShowPro(). Содержимое функций IzmPro() и ShowPro() полностью соответствует аналогичным функциям из лаб. раб. 7.
Что касается функции RezMatrPr(), то здесь, так же как и для фигуры, необходимо добавить в цепочку преобразования матрицы вращения вокруг локальных осей TvrYFg, TvrXFg и TvrZFg. Разъяснения по разработке этой функции приведены ниже.
Для включения прорисовки проекций заданной фигуры в трех координатных плоскостях локальной системы координат создадим следующие обработчики:
- обработчик события CheckBox3 – флажок запуска прорисовки проекции на плоскость Z=0;
- обработчик события CheckBox4 – флажок запуска прорисовки проекции на плоскость Y=0;
- обработчик события CheckBox5 – флажок запуска прорисовки проекции на плоскость X=0;
7.11. Разработка функции вычисления результирующих матриц - RezMatrPr()
Три матрицы преобразования проекций TRezPrZ[4][4], TRezPrY[4][4], и TRezPrX[4][4] на локальные плоскости Z=0, X=0 и Y=0, которые мы получим в результате работы этой функции, формируются при перемножении нескольких матриц базовых видовых преобразований.
Схемы формирования результирующих матриц преобразования проекции будут иметь вид:
TRezPrZ = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * TortZ * (TvrYOs * TvrXOs * TortZ)
TRezPrX = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * TortX * (TvrYOs * TvrXOs * TortZ)
TRezPrY = (TvrYFg * TvrXFg * TvrZFg) * Tper * Tmsb * TortY * (TvrYOs * TvrXOs * TortZ)
Здесь ортографические матрицы, находящиеся в середине цепочек, отвечают за ортографическое проецирование на локальные плоскости XOY, YOZ и ZOX, а те, что находятся в конце цепочек – за ортографическое проецирование на глобальную картинную плоскость (экран монитора).
Произведение первых пяти матриц нами сохранено в матрице Tvid[4][4] при построении фигуры.
Произведение последних трех матриц уже вычислено в функции RezMatrOs() в матрице TrezOs, поэтому структуры результирующих матриц преобразования проекций можно упростить:
TRezPrZ = Tvid * TortZ * TrezOs
TRezPrX = Tvid * TortX * TrezOs
TRezPrY = Tvid * TortY * TrezOs
Обращаем ваше внимание на то, что такие упрощения возможны только благодаря тому, что в последовательности вызова функций вычисления различных матриц преобразования, в составе графического конвейера, функция RezMatrPr() занимает последнее место, когда можно использовать расчеты предыдущих функций.
С учетом этого, текст функции будет иметь следующий вид:
void RezMatrPr(void)
{
float Tx[4][4],Ty[4][4],Tz[4][4];
MultMatr(Tvid, TortX, Tx); // Промежуточн. матр. преобр. проекц. X
MultMatr(Tvid, TortY, Ty); // Промежуточн. матр. преобр. проекц. Y
MultMatr(Tvid, TortZ, Tz); // Промежуточн. матр. преобр. проекц. Z
MultMatr(Tx, TrezOs, TrezPrX); // Результирующая матрица преобр.проекц.X
MultMatr(Ty, TrezOs, TrezPrY); // Результирующая матрица преобр.проекц.Y
MultMatr(Tz, TrezOs, TrezPrZ); // Результирующая матрица преобр.проекц.Z
}
6-й этап
7.12. Прорисовка лучей проецирования и обозначений
В работу этого этапа входит разработка функции ShowLuthi() и функции Oboznath(). Текст этих функций полностью соответствует таким же функциям в лаб. раб. 7.
7-й этап
7.13. Разработка функций построения диметрий
Для изображения аксонометрических проекций в режиме диметрий, создадим обработчики для компонентов TrackBar10, TrackBar11 и TrackBar12. Назначение этих движков в том, чтобы задавать значения коэффициентов искажения проекций kx, ky и kz . После считывания их значений необходимо рассчитать углы поворота фигуры Q1, F1 или G1 и проинициализировать матрицы вращения фигуры.
void __fastcall TForm3::TrackBar10Change(TObject *Sender)
{
if(Form3->RadioButton6->Checked)
{ky=float(Form3->TrackBar10->Position)/100;
Form3->Edit10->Text=FloatToStr(ky);
F1=asin(ky/sqrt(2-pow(ky,2)))/k2;
G1=asin(ky/sqrt(2))/k2;
Q1=0;
InitTvrY();
InitTvrX();
InitTvrZ();
kx=sqrt(pow(cos(k2*G1),2));
kz=sqrt(pow(cos(k2*F1),2)+pow(sin(k2*F1),2)*pow(sin(k2*G1),2));
//Form3->TrackBar11->Position=kx*100;
//Form3->TrackBar12->Position=kz*100;
Form3->Edit11->Text=FloatToStr(kx);
Form3->Edit12->Text=FloatToStr(kz);
Repaint();
}
}
В обработчике для TrackBar11 должно происходить считывание коэффициента kx. Расчет углов вращения здесь выполняется в виде:
G1=asin(kx/sqrt(2-pow(kx,2)))/k2;
Q1=asin(kx/sqrt(2))/k2;
F1=0;
Для этих углов необходимо пересчитать и коэффициенты искажения для ky и kz:
kz=sqrt(pow(cos(k2*Q1),2));
ky=sqrt(pow(cos(k2*G1),2)+pow(sin(k2*G1),2)*pow(sin(k2*Q1),2));
В обработчике для TrackBar12 считывается коэффициент kz. Углы вращения здесь равны:
Q1=asin(kz/sqrt(2-pow(kz,2)))/k2;
F1=asin(kz/sqrt(2))/k2;
G1=0;
Для этих углов необходимо пересчитать и коэффициенты искажения для ky и kx:
ky=sqrt(pow(cos(k2*F1),2));
kx=sqrt(pow(cos(k2*Q1),2)+pow(sin(k2*Q1),2)*pow(sin(k2*F1),2));
7.14. Разработка функций построения изометрий
Для изображения изометрий создадим обработчики для радиокнопок и впишем следующий текст:
void __fastcall TForm3::RadioButton1Click(TObject *Sender)
{
if(Form3->RadioButton7->Checked)
{Q1=45;
F1=35,26;
G1=0;
InitTvrY();
InitTvrX();
InitTvrZ();
Repaint();
}
}
Обработчики для RadioButton2 – RadioButton4 создайте самостоятельно.
8. Контрольные вопросы
1. К какому классу относятся аксонометрические проекции? В чем сходство и различие с другими параллельными проекциями?
2. Напишите схему формирования результирующей матрицы аксонометрического проецирования.
3. Чем отличаются друг от друга триметрические, диметрические и изометрические проекции?
4. Почему возникают искажения трехмерных объектов в аксонометрических проекциях?
5. Приведите формулы для расчета коэффициентов искажений в аксонометрических проекциях.
6. Приведите формулы для расчета углов поворотов в диметрических проекциях.
7. Приведите формулы для расчета углов поворотов и коэффициентов искажения в изометриях.
8. Какие матрицы ортографического проецирования вы знаете, и для чего они применяются в аксонометрических проекциях.
9. Для чего применяются матрицы переноса в аксонометрических проекциях?
10. Изобразите структурную схему классификации плоских проекций.