Лабораторная работа № 8
Аксонометрические проекции
 
1. Цель работы
 
1) Освоить программирование аксонометрических проекций трехмерных объектов (триметрий, диметрий и изометрий) с использованием методов матричного анализа.
2) Разработать программу в среде визуального проектирования C++Builder, позволяющую демонстрировать влияние углов поворотов фигуры вокруг осей координат и коэффициентов искажения её сторон, а также параметров переноса и масштабирования на изменение формы и местоположения исходной фигуры и трех её проекций.
3) Освоить принципы формирования и практического использования комбинированных матриц видового преобразования.

2.  Постановка задачи
 
2.1. В проект, разработанный для лабораторной работы №7 добавить новый модуль с формой Form3.
2.2. В графическом окне Form3 создать локальную систему трехмерных декартовых координат.
2.3. В составе системы координат изобразить прямоугольный параллелепипед (согласно варианту задания из табл.1). Фигура должна задаваться координатами вершин: A(x1, y1, z1), B(x2, y2, z2), C(x3, y3, z3), D(x4, y4, z4), E(x5, y5, z5)  и т.д. Исходное положение фигуры - в начале координат.
2.4. На координатные плоскости  XOY, YOZ  и  ZOX  локальной системы координат вывести соответствующие изображения проекций заданной фигуры (см. рис.1). Построить лучи проецирования, связывающие вершины фигуры с одноименными вершинами проекций (см. рис.3).
2.5. Вершины фигуры и координатные оси снабдить буквенными обозначениями.
2.6. Задавая различные значения углов поворотов фигуры: θ, φ или ψ, углов поворота осей координат, параметров переноса  L, m  и  n, параметра масштабирования  s  с помощью движков стандартных компонентов TrackBar, продемонстрировать следующее:
1) Масштабирование и перенос фигуры;
2) Триметрическое проецирование фигуры на координатные плоскости  XOY, YOZ, ZOX;
3) Диметрическое проецирование фигуры на координатные плоскости  XOY, YOZ, ZOX;
4) Изометрическое проецирование фигуры на координатные плоскости  XOY, YOZ, ZOX;
 
Таблица 1
Вар.
Исходные размеры фигуры
Цвет
фигуры
Цвет
проекций
ширина
высота
длина
1
4
4
6
красный
розовый
2
3
4
2
синий
голубой
3
4
6
6
зеленый
светло зеленый
4
4
6
2
коричневый
сиреневый
5
6
4
6
черный
серый
6
6
4
2
красный
сиреневый
7
2
3
6
синий
серый
8
6
3
2
зеленый
бирюзовый
9
4
6
3
коричневый
розовый
10
3
6
4
черный
голубой
 
 
 
Рисунок 1 – Аксонометрическая (триметрическая) проекция кубической фигуры на плоскость XOY
 
3.  Краткие теоретические сведения
3.1. Аксонометрические  проекции
 
Цель аксонометрических преобразований состоит в том, чтобы наблюдатель, луч зрения которого направлен параллельно проецирующим лучам (и перпендикулярно картинной плоскости), мог видеть одновременно не менее трех граней проецируемого многогранника. В этом случае глаз человека воспринимает объекты объемными. Пусть, например, проецируемый единичный куб расположен в начале координат таким образом, что его грани параллельны главным координатным плоскостям. В таком положении наблюдатель увидит на картинной плоскости Z = 0 только переднюю грань куба. Повернем куб вокруг оси  Y на некоторый угол θ, а затем вокруг оси X на угол φ. Теперь взору наблюдателя откроются еще две грани куба (боковая и верхняя) и его проекция на картинной плоскости станет объемной [6]. Такая проекция фигуры и будет её аксонометрической проекцией.
Преобразование координат любой графической фигуры с использованием матрицы аксонометрического проецирования аналогично преобразованиям, рассмотренных в лаб.раб. №7 и выполняется по схеме:
 
Мисх × Такс = Мрез                                                                         (1)
 
где: Такс – матрица аксонометрического преобразования.
 
Матрица аксонометрического преобразования на плоскость XOY(Z=0) рассчитывается по формуле:
 
 
 
где: ТврY и ТврX - матрицы трехмерного вращения против часовой стрелки вокруг осей Y и X.
 
В развернутой форме они имеют следующий вид:
 
 
   
Примечание: Матрицы вращения по часовой стрелке отличаются только знаками перед теми элементами матриц, которые содержат функцию  sin. Плюс меняется на минус и наоборот.
 
После подстановки (3) и (4) в (2), матрица аксонометрического проецирования на Z=0 будет иметь вид:
 
 
 
В этих матрицах углы  θ  и  φ - это углы поворота исходной фигуры вокруг осей Y и X соответственно.
 
 
 
Рисунок 2 - Положительные направления вращения единичного куба (против часовой стрелки).
 
На рисунке 2 показаны положительные направления вращения единичного куба вокруг осей  Y,  X  и  Z  против часовой стрелки.
 
Матрица аксонометрического проецирования на плоскость XOZ(Y=0) будет рассчитываться по схеме:
 
 
 
Матрица аксонометрического проецирования на плоскость ZOY(X=0) будет рассчитываться по схеме:
 
 
  
Если грань фигуры не параллельна плоскости ортографической проекции, то размеры её аксонометрической проекции меньше чем истинные формы этой грани. Степень искажения длины граней аксонометрической проекции есть отношение длины проекции отрезка к его истинной длине, и называется коэффициентом искажения.
Аксонометрические проекции разделяются на триметрии, диметрии и изометрии.
 
Триметрическая, диметрическая и изометрическая проекции отличаются друг от друга соотношениями коэффициентов искажения  KX , KY  и  KZ  по осям  X, Y и  Z.
 
Для триметрической проекции выполняется условие:    KXKYKZ,
Это означает, что коэффициенты искажения могут быть любые, а также любыми могут быть углы подготовительных поворотов объекта вокруг осей координат.
 
Коэффициенты искажения зависят от углов поворота θφ  и ψ  и рассчитываются по формулам:
 
 
 
Для диметрической проекции может выполняться одно из трех условий:
 
KX = KY ≠ KZ
KY = KZ ≠ KX
KZ = KX ≠ KY
 
Т.е. один из коэффициентов искажения может принимать любые значения в диапазоне от 0 до 1, а область значений двух других коэффициентов ограничена, т.к. необходимо сохранять условие их равенства. В связи с этим выбор углов поворота объекта в диметрической проекции также ограничен, и они рассчитываются по формулам:
 
 
 
где К – это тот коэффициент искажения, который может принимать любые значения. Как правило, К – это КZ. Остальные коэффициенты искажения рассчитываются по формулам (9) (10) или (11).
 
Для изометрической проекции должно выполняться условие:     KX = KY = KZ.
Такое строгое ограничение позволяет создавать только 4 изометрических проекции для одной и той же фигуры при следующих комбинациях углов поворота:
 
q>0,    j>0
q<0,    j>0
q<0,    j<0
q>0,    j<0
 
 
Значения углов поворота при этом равны:
 
 
 
После подстановки значений θ и φ в формулы (9), (10) и (11) получаем:
 
KX = KY = KZ = 0,8165                                                                         (16)
 
Для улучшения реалистичности в данной лабораторной работе результирующую матрицу аксонометрического проецирования фигуры на плоскость Z=0 составим по следующей схеме:
 
 
      Здесь коричневым цветом обозначены добавочные матрицы переноса, масштабирования и врашения локальной системы координат, используемые для улучшения реалистичности изображения фигуры, и к собственно аксонометрическому проецированию, записанному в выражении (2), они не относятся.
       Второе отличие от формулы (2) - перемножаются не две, а сразу три матрицы вращения, по трем разным осям. Это не будет нарушением, так как для любых видов проецирования, независимо от направления на ту или иную картинную плоскость, всегда будут задействованы только две матрицы вращения, в соосветствующей комбинации. Третья будет "холостой", т.е. единичной, так как её параметры не будут "включаться", иными словами вводиться в состав матрицы, для данного конкретного поворота.

4. Интерфейс программы
 
Работа лабораторной работы №8 начинается после нажатия на кнопку Lab8, расположенной на главной форме проекта Form1. После чего должна открываться дополнительная форма Form3, с установленными на ней графическим окном и элементами управления (см. рис. 3).
 
 
Рисунок 3 – Окно формы Form3 с изображением исходной фигуры и её триметрических проекций
 
Элементы управления располагаются на панели Panel1. Перечислим назначение всех элементов:
- движок TrackBar1  предназначен для масштабирования фигуры внутри локальной системы координат;
- движки TrackBar2  и TrackBar3 предназначены для изменения углов поворота всей системы координат и объектов, находящихся в ней, относительно глобальных осей Y и X соответственно;
- движки TrackBar4,  TrackBar5 и TrackBar6 предназначены для перемещения ("переноса") фигуры вдоль локальных осей XY и Z соответственно;
- движки TrackBar7,  TrackBar8 и TrackBar9 предназначены для изменения углов поворота фигуры относительно локальных осей XY и  при построении триметрической проекции;
- движки 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=-5m=4n=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, TrackBar4TrackBar6   описан в лаб. раб. 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 предназначены для вращения фигуры вокруг локальных осей YX и 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=0X=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. Разработка функций построения диметрий
 
Для изображения аксонометрических проекций в режиме диметрий, создадим обработчики для компонентов TrackBar10TrackBar11 и 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();
    }
}
Обработчики для  RadioButton2RadioButton4  создайте самостоятельно.
 
 
8. Контрольные вопросы
 
1. К какому классу относятся аксонометрические проекции? В чем сходство и различие с другими параллельными проекциями?
2. Напишите схему формирования результирующей матрицы аксонометрического проецирования.
3. Чем отличаются друг от друга триметрические, диметрические и изометрические проекции?
4. Почему возникают искажения трехмерных объектов в аксонометрических проекциях?
5. Приведите формулы для расчета коэффициентов искажений в аксонометрических проекциях.
6. Приведите формулы для расчета углов поворотов в диметрических проекциях.
7. Приведите формулы для расчета углов поворотов и коэффициентов искажения в изометриях.
8. Какие матрицы ортографического проецирования вы знаете, и для чего они применяются в аксонометрических проекциях.
9. Для чего применяются матрицы переноса в аксонометрических проекциях?
10. Изобразите структурную схему классификации плоских проекций.