- •«Точка в 3d пространстве»
- •Оглавление
- •Содержательная и формальная постановка задачи
- •Краткие теоретические сведения
- •Структура решения (этапы решения и их взаимосвязь)
- •Обзор и анализ методов решения
- •Описание реализации применяемых методов
- •Руководство программиста
- •Руководство пользователя
- •Результаты
Структура решения (этапы решения и их взаимосвязь)
Вычисления
Преобразования из системы трехмерных координат точки в экранную систему координат для пространственного чертежа, вычисления координат точек и линий проекций.
Вычисление координат точек и линий проекций для комплексного чертежа.
Отрисовка
Отрисовка пространственного чертежа
Отрисовка комплексного чертежа
Обзор и анализ методов решения
Вычисления. Для построения чертежей на экране нам необходимо уметь переводить координаты из реальной трехмерной системы координат в двумерную систему координат экрана (для пространственного макета), а также определять по трехмерным координатам координаты на комплексном чертеже и переводить их в двумерную систему координат экрана.
Вывод формул для пространственного макета. Даны координаты T точки в трехмерной декартовой системе координат пространства – x3, y3, z3, а также угол alpha между положительным направлением оси Oy и отрицательным направлением оси Ox на пространственном макете, ширина и высота чертежа – w и h. Для построения пространственного макета точки T нужно найти: - экранные координаты начала отсчета пространственного макета; - экранные координаты точки T; - экранные координаты ее проекций на плоскости П1, П2, П3 – T1, T2, T3; - экранные координаты ее проекций на координатные оси – TX, TY, TZ; - экранные координаты начальной и конечной точек линии, изображающей ось Oy; - длину полуоси.
Рис.
5. – Экранная система координат.
Координаты
начала отсчета находятся следующим
образом:
x0
= w
/ 2
y0
= h
/ 2
Таким образом, нужно вывести формулы
для перевода заданных трехмерных
координат произвольной точки A
x3,
y3,
z3
в экранные двумерные координаты x2,
y2,
учитывая заданный угол alpha
и координаты начала отсчета – x0,
y0.
Рассмотрим
следующий рисунок.
Рис.
6. – Нахождение экранных координат
произвольной точки A.
Из
этого рисунка видно, что x3
= (x0
– x2)
+ ∆x,
z3
= (y0
– y2)
+ ∆y.
Т.е. x2
= x0
– x3
+ ∆x
и , y2
= (y0
– z3)
+ ∆y.
Где
∆x
и ∆y
находятся из соответствующих
прямоугольных треугольников по
формулам: ∆x
= y3*cos(alpha),
∆y
= y3*sin(alpha).
Таким
образом,
x2
= x0
– x3
+ y3*cos(alpha),
y2
= y0
– z3
+ y3*sin(alpha).
Итак,
мы получили формулы для вычисления
экранных координат произвольной точки
по заданным трехмерным координатам,
углу alpha
и координатам начала отсчета. По этим
формулам можно вычислить координаты
точек, необходимых для построения
пространственного макета - T,
T1,
T2,
T3,
TX,
TY,
TZ.
(Здесь и в дальнейшем экранную координату
x
произвольной точки A
будем обозначать AX,
экранную координату y
точки A
– AY).
TX
= x0
– x3
+ y3*cos(alpha)
TY
= y0
– z3
+ y3*sin(alpha)
T1X
= x0
– x3
+ y3*cos(alpha)
T1Y
= y0
+ y3*cos(alpha)
T2X=
x0
– x3
T2Y=
y0
– z3
T3X
= x0
+ y3*cos(alpha)
T3Y
= y0
– z3
+ y3*sin(alpha)
TxX
= x0
– x3
TxY
= y0
TyX
= x0
+ y3*cos(alpha)
TyY
= y0
+ y3*sin(alpha)
TzX
= x0
TzY
= y0
– z3
Длина
полуоси alength
= min(w,
h)
/ 2.
Начальной и конечная точки линии,
изображающей ось Oy
имеют трехмерные координаты (0, -alength,
0) и (0, alength,
0). Для вычисления их экранных координат
можно воспользоваться нашей формулой.
Oy1X
= x0
- alength*cos(alpha)
Oy1Y
= y0
- alength*sin(alpha)
Oy2X
= x0
+ alength*cos(alpha)
Oy2Y
= y0
+ alength*sin(alpha)Вывод формул для комплексного чертежа. Даны координаты точки T в трехмерной декартовой системе координат пространства – x3, y3, z3, а также ширина и высота чертежа – w и h. Для построения комплексного чертежа нам необходимо найти: - экранные координаты начала отсчета комплексного чертежа; - длину полуоси; - координаты точек комплексного чертежа: T1, T2, T3 (проекции точки T на П1, П2, П3), Tx, Ty1, Ty2, Tz (проекции точки T на оси, для оси Y – две такие точки, т.к. на комплексном чертеже она представлена дважды). Координаты начала отсчета находятся следующим образом: x0 = w / 2 y0 = h / 2 Длина полуоси alength = min(w, h) / 2. Рассмотрим следующий рисунок, расстояния x3, y3, z3 на котором обозначены в соответствии с построением комплексного чертежа.
Рис.
7. – Нахождение экранных координат
точек для построения комплексного
чертежа.
Из
этого рисунка можно найти экранные
координаты всех интересующих нас точек
комплексного чертежа.
T1X
= x0
– x3
T1Y
= y0
+ y3
T2X=
x0
– x3
T2Y=
y0
– z3
T3X
= x0
+ y3
T3Y
= y0
– z3
TxX
= x0
– x3
TxY
= y0
Ty1X
= x0
+ y3
Ty1Y
= y0
Ty2X
= x0
Ty2Y
= y0
+ y3
TzX
= x0
TzY
= y0
– z3
Прорисовка (вывод чертежей на экран).
Для того чтобы вывести необходимое нам изображение на устройство вывода (экран, принтер) довольно часто используется Интерфейс Графических Устройств GDI(Graphics Device Interface), представляющий собой интерфейс, который Windows использует для рисования 2D графики. Когда приложения обращаются к GDI для вывода графического изображения, они работают не с реальными (физическими) устройствами вывода, а с логическими. Приложения Windows также не определяют тип видеомонитора (EGA, VGA или SVGA), а работают с логическим видеомонитором, имеющим такие характеристики как способность отображать практически любой цвет, огромное разрешение и т. д. Выполняя запрос приложения, GDI обращается к драйверу соответствующего устройства вывода, а драйвер работает непосредственно с физическим устройством вывода. За счет этого, в процессе выполнения запроса GDI (или драйвер) учитывает ограниченные возможности физического устройства вывода и его аппаратные особенности, делая необходимые приближения.
С GDI тесно связано DC (Device Context) – контекстное устройство, то есть то, на чём мы рисуем. Это специфический объект, хранящий информацию о возможностях устройства, о способе работы с ним и о разрешённой для изменения области. Контекст устройства можно сравнить с листом бумаги, на котором приложение рисует то или иное графическое изображение, а также пишет текст. Инструменты для рисования - это перья, кисти (а также шрифты и даже целые графические изображения), с помощью которых создается изображение. Кроме контекста устройства и инструментов для рисования, приложениям доступны десятки функций программного интерфейса GDI, предназначенные для работы с контекстом устройства и инструментами.
Данная работа выполнена посредством приложения Borland C++Builder 6. В нем есть надстройка над GDI – VCL (Visual Components Library). C++Builder предоставляет простой и завершенный интерфейс посредством свойства Canvas (Канвас) – графических компонент. Это свойство проинициализирует правильный контекст устройства и освободит его в нужное время, когда вы прекратите рисование. По аналогии с функциями Windows GDI Canvas имеет вложенные свойства, представляющие характеристики пера, кисти и шрифта. Единственное, что должен сделать пользователь, работая с графическими компонентами, - это определить характеристики используемых орудий рисования. Не требуется следить за системными ресурсами при создании, выборе и освобождении орудий – Canvas сам позаботится об этом.
Графический вывод для MS Visual C++ реализуется посредством обращения к библиотеке MFC. Она предоставляет все необходимые классы, которые инкапсулируют соответствующие графические объекты Windows. Она также имеет свои дополнительные классы, не имеющие непосредственного отношения к графике, но значительно облегчающие решение ряда задач (классы СPoint, СSize и т.д.). Все они имеют один базовый класс CGdiObject.
Для изображения необходимых объектов мы используем различные функции типа MoveTo, LineTo, Rectangle, Ellipse, Arc и т.д.(уже определенные в GDI) и вспомогательные координаты, рассчитанные на соответственном предшествующем этапе.
При каждом изменении положения одного из ползунков появляется необходимость в перерисовке тех или иных компонентов результирующего изображения. Во время перерисовки экрана, панель отображения рисунка стирается и лишь затем, рисуется новый чертеж. Это служит причиной возникновения мерцания на экране. Для решения этой проблемы используется дополнительный графический буфер, в который выводится новое изображение. После этого текущий графический буфер заменяется дополнительным, а пользователь программы видит только конечный результат, и изменения протекают гладко от текущего кадра к следующему. В Borland используется параметр DoubleBuffered, который необходимо выставить в true, что обеспечит двойную буферизацию.
