Описание, конструирование, манипулирование и представление геометрических объектов являются центральными работами в графических системах. Их поддержка в требуемом объеме за счет соответствующих математических методов, алгоритмов и программ оказывают существенное влияние на возможности и эффективность графической системы. В данном разделе будут рассмотрены математические методы для описания геометрических преобразований координат в двух, трех и четырехмерном случае, будут обсуждены некоторые вопросы эффективности, рассмотрены геометрические преобразования растровых картин.
Далее большими буквами X, Y, Z будут обозначаться обычные декартовые координаты, а маленькие буквы x, y, z будут использоваться для обозначения т.н. однородных координат.
Преобразование сдвига в плоском случае имеет вид:
| (0.1.1) |
| (0.1.2) |
Преобразование масштабирования относительно начала координат имеет вид:
| (0.1.3) |
| (0.1.4) |
S = [
|
| ||
|
|
Преобразование поворота относительно начала координат имеет вид:
| (0.1.5) |
| (0.1.6) |
R = [
|
| ||
|
|
Столбцы и строки матрицы поворота представляют собой взаимно ортогональные единичные векторы. В самом деле квадраты длин векторов-строк равны единице:
|
|
|
Так как скалярное произведение векторов A ·B = |A| ·|B| ·cosy, где |A| - длина вектора A, |B| - длина вектора B, а y - наименьший положительный угол между ними, то из равенства 0 скалярного произведения двух векторов-строк длины 1 следует, что угол между ними равен 90°.
Аналогичное можно показать и для векторов-столбцов. Кроме того вектора-столбцы представляют собой такие единичные векторы, которые после выполнения преобразования, заданного этой матрицей, совпадут с осями. В самом деле, произведение первого столбца на матрицу есть
| (0.1.7) |
т.е. это единичный вектор вдоль оси X. Аналогично, произведение второго столбца на матрицу даст вектор [ 0 1 ]. Это позволяет сформировать матрицу, если известны результаты преобразования (см. пример в п. ).
Как видно из (2), (4) и (6) двумерные преобразования имеют различный вид. Сдвиг реализуется сложением, а масштабирование и поворот - умножением. Это различие затрудняет формирование суммарного преобразования и устраняется использованием двумерных однородных координат точки, имеющих вид:
|
Двумерные декартовые координаты точки получаются из однородных делением на множитель w:
| (0.1.8) |
Однородные координаты можно представить как промасштабированные с коэффициентом w значения двумерных координат, расположенные в плоскости с Z = w.
В силу произвольности значения w в однородных координатах не существует единственного представления точки, заданной в декартовых координатах.
Преобразования сдвига, масштабирования и поворота в однородных координатах относительно центра координат все имеют одинаковую форму произведения вектора исходных координат на матрицу преобразования.
Для сдвига
| (0.1.9) |
Для масштабирования
| (0.1.10) |
Для поворота
| (0.1.11) |
Как видно из (9) - (11), wn = w, а матрица преобразования для двумерных однородных координат в общем случае имеет вид:
| (0.1.12) |
Рассмотрим вначале для этого преобразование
|
Легко видеть, что xn = x, yn = y, h = S. Таким образом двумерные декартовые координаты преобразованной точки
|
Для уяснения смысла третьего столбца матрицы преобразований (12) выполним преобразование
|
| (0.1.13) |
Получим результирующие двумерные декартовые координаты Xn, Yn для преобразованной точки
|
| (0.1.14) |
|
|
Кроме удобств, связанных с единообразным представлением преобразований, и, следовательно, с упрощением композиции преобразований, рассматриваемой в следующем пункте, однородные координаты дают возможность простого представления точек, имеющих в декартовой системе значение координаты, равное бесконечности.
Рассмотрим в декартовой системе линию, проходящую через начало координат и точку (X,Y). Однородные координаты этой точки - (x,y,h) = (hX, hY, h), где h имеет произвольное значение. Предел отношения x/y при h стремящимся к 0 равен X/Y, но при этом декартовые координаты стремятся к бесконечности. Таким образом, точка с однородными координатами
| (0.1.15) |
Покажем, что прямые, параллельные в декартовой системе координат, в однородных координатах имеют точку пересечения. Эта особенность далее будет использована при анализе перспективных преобразований.
Пусть две пересекающиеся прямые в декартовой системе координат заданы системой уравнений:
| (0.1.16) |
Решая эту систему относительно X и Y, найдем координаты точки пересечения
|
|
Запишем результат в однородных координатах
|
В силу произвольности масштабного множителя, умножим значения координат на (A1 ·B2 - A2 ·B1)
|
|
При этом точка пересечения лежит на прямой -y0 ·x + x0 ·y = 0 на бесконечности.
Последовательное выполнение нескольких преобразований можно представить в виде единой матрицы суммарного преобразования. Умножение на единственную матрицу, естественно, выполняется быстрее, чем последовательное умножение на несколько матриц.
Рассмотрим сдвиг точки P0 на расстояние (Tx1, Ty1) в точку P1, а затем сдвинем точку P1 на расстояние (Tx2, Ty2) в точку P2. Обозначая через T1 и T2 матрицы сдвига, в соответствии с (9) получим:
|
|
|
Рассмотрим теперь последовательное выполнение масштабирований, первое с коэффициентами (Sx1, Sy1), второе с коэффициентами (Sx2, Sy2). Следует ожидать, что суммарное масштабирование будет мультипликативным. Обозначая через S1 и S2 матрицы масштабирования, в соответствии с (10) получим
|
|
Итак, получили, что результирующее масштабирование есть (Sx1 ·Sx2, Sy1 ·Sy2), т.е. суммарное масштабирование, вычисленное как произведение матриц, как и ожидалось, мультипликативно.
Аналогичным образом можно показать, что два последовательных поворота аддитивны.
Рассмотрим выполнение часто используемого поворота изображения на угол f относительно заданной точки P(X,Y). Это преобразование можно представить как перенос начала координат в точку (X,Y), поворот на угол f относительно начала координат и обратный перенос начала координат:
|
|
Суммарная матрица двумерных преобразований в однородных координатах имеет вид:
|
Вычисление преобразованных однородных координат точки P с непосредственным использованием T в выражении P ·T требует 9 операций умножения и 6 операций сложения. Но так как третья однородная координата может быть выбрана равной 1, а третий столбец T содержит единственный ненулевой элемент, равный 1, то преобразование декартовых координат может быть представлено в виде:
|
Далее при рассмотрении трехмерных преобразований, в основном, используется общепринятая в векторной алгебре правая система координат (рис. а). При этом, если смотреть со стороны положительной полуоси в центр координат, то поворот на +90° (против часовой стрелке) переводит одну положительную ось в другую (направление движения расположенного вдоль оси и поворачивающегося против часовой стрелки правого винта и положительной полуоси совпадают). В некоторых, специально оговариваемых случаях, используется левая система координат (см. рис. б). В левой системе координат положительными будут повороты по часовой стрелке, если смотреть с положительного конца полуоси. В трехмерной машинной графике более удобной является левая система координат. Тогда если, например, поверхность экрана совмещена с плоскостью XY, то большим удалениям от наблюдателя соответствую точки с большим значением Z (см. рис. б).
Работа с однородными трехмерными координатами и матрицами преобразования (формирование и композциция) подобна таковой для двумерного случая, поэтому здесь будут рассмотрены только матрицы преобразований сдвига, масштабирования и поворота и пример конструирования матрицы преобразования по известному его результату.
Подобно тому как в двумерном случае точка в однородных координатах представляется трехмерным вектором [ x y w ], а матрицы преобразований имеют размер 3×3, для трехмерного случая точка представляется четырехмерным вектором [ x y z w ], где w не равно 0, а матрицы преобразований имеют размер 4×4. Если w не равно 1, то декартовые координаты точки (X,Y,Z) получаются из соотношения:
|
|
|
В частности, матрица сдвига имеет вид:
|
Матрица масштабирования относительно центра координат имеет вид:
|
Ранее рассмотренная для двумерного случая матрица поворота (11) является в то же время трехмерным поворотом вокруг оси Z. Так как при трехмерном повороте вокруг оси Z (поворот в плоскости XY) размеры вдоль оси Z неизменны, то все элементы третьей строки и третьего столбца равны 0, кроме диагонального, равного 1:
|
При повороте вокруг оси X (в плоскости YZ) размеры вдоль оси X не меняются, поэтому все элементы первой строки и первого столбца равны 0, за исключением диагонального, равного 1:
|
При повороте вокруг оси Y (в плоскости XZ) размеры вдоль оси Y не меняются, поэтому все элементы второй строки и второго столбца равны 0, за исключением диагонального, равного 1:
|
Столбцы и строки подматриц 3×3 матриц поворота Rx, Ry, Rz, аналогично двумерному случаю, представляют собой взаимно ортогональные единичные векторы. Легко убедиться, что суммарная матрица преобразования для произвольной последовательности поворотов вокруг осей X, Y и Z имеет вид:
|
Взаимная ортогональность столбцов матрицы поворота и их совмещение с осями координат при преобразовании, задаваемом матрицей, позволяет легко сконструировать матрицу преобразования, если известны его результаты.
Пример формирования матрицы преобразования (из [])
Пусть заданы три точки P1, P2, P3. Найти матрицу преобразования такого, что после преобразования вектор P1P2 будет направлен вдоль оси Z, а вектор P1P3 будет лежать в плоскости YZ.
|
|
|
|
|
При визуализации двумерных изображений достаточно задать окно видимости в системе координат пользователя и порт отображения на экране дисплея, в котором будет выдаваться изображение из окна. В этом случае достаточно провести отсечение изображения по окну и выполнить двумерные преобразования окно-порт. На рис. показан простой пример двумерных преобразований. Окном отсекается часть изображения домика и один улей (см. рис. слева). Отсеченное изображение передается в порт отображения дисплея с выполнением преобразований окно-порт (см. рис. справа). В данном (простом) случае выполняется только преобразование сдвига.
В случае же трехмерных изображений отсечение выполняется уже не по окну, а по объему видимости и затем выполняется проецирование в порт отображения, который в свою очередь может быть проекцией объема видимости. Модель процесса визуализации трехмерных изображений приведена на рис. .
Как уже отмечалось, проецирование в общем случае - отображение точек, заданных в системе координат размерностью N, в точки в системе с меньшей размерностью. При отображении трехмерных изображений на дисплей три измерения отображаются в два.
Проецирование выполняется с помощью прямолинейных проекторов (проецирующих лучей), идущих из центра проекции через каждую точку объекта до пересечения с картинной поверхностью (поверхностью проекции). Далее рассматриваются только плоские проекции, при которых поверхность проекции - плоскость в трехмерном пространстве.
По расположению центра проекции относительно плоскости проекции различаются центральная и параллельные проекции.
При параллельной проекции центр проекции находится на бесконечном расстоянии от плоскости проекции. Проекторы представляют собой пучок параллельных лучей. В этом случае необходимо задавать направление проецирования и расположение плоскости проекции. По взаимному расположению проекторов, плоскости проекции и главных осей координат различаются ортогональные, прямоугольные аксонометрические и косоугольные аксонометрические проекции.
При ортогональной проекции проекторы перпендикулярны плоскости проекции, а плоскость проекции перпендикулярна главной оси. Т.е. проекторы параллельны главной оси.
При аксонометрической проекции имеется одна из двух перпендикулярностей:
Изображение, полученное при параллельном проецировании, не достаточно реалистично, но передаются точные форма и размеры, хотя и возможно различное укорачивание для различных осей.
При центральной проекции расстояние от центра проекции до плоскости проецирования конечно, поэтому проекторы представляют собой пучок лучей, исходящих из центра проекции. В этом случае надо задавать расположение и центра проекции и плоскости проекции. Изображения на плоскости проекции имеют т.н. перспективные искажения, когда размер видимого изображения зависит от взаимного расположения центра проекции, объекта и плоскости проекции. Из-за перспективных искажений изображения, полученные центральной проекцией, более реалистичны, но нельзя точно передать форму и размеры. Различаются одно, двух и трехточечные центральные проекции в зависимости от того по скольким осям выполняется перспективное искажение. Иллюстрация центральной проекции приведена на рис. .
На рис. приведена классификация описанных выше плоских проекций.
Вначале мы рассмотрим ортогональные проекции, используемые в техническом черчении, в регламентированной для него правосторонней системе координат, когда ось Z изображается вертикальной. Затем будут проиллюстрированы аксонометрические проекции также в правосторонней системе координат, но уже более близкой к машинной графике (ось Y вертикальна, ось X направлена горизонтально вправо, а ось Z - от экрана к наблюдателю). Наконец выведем матрицы преобразования в левосторонней системе координат, часто используемой в машинной графике, с вертикальной осью Y, осью X, направленной вправо и осью Z, направленной от наблюдателя.
Использование проекций в техническом черчении регламентируется стандартом ГОСТ 2.317-69. Наиболее широко, особенно, в САПР используются ортогональные проекции (виды). Вид - ортогональная проекция обращенной к наблюдателю видимой части поверхности предмета, расположенного между наблюдателем и плоскостью чертежа.
В техническом черчении за основные плоскости проекций принимают шесть граней куба (рис. ).
Очевидно, что при ортогональной проекции не происходит изменения ни углов, ни масштабов.
При аксонометрическом проецировании (см. рис. 0.4) сохраняется параллельность прямых, а углы изменяются; измерение же расстояний вдоль каждой из координатных осей в общем случае должно выполняться со своим масштабным коэффициентом.
При изометрических проекциях укорачивания вдоль всех координатных осей одинаковы, поэтому можно производить измерения вдоль направлений осей с одним и тем же масштабом (отсюда и название изометрия). На рис. приведена (аксонометрическая прямоугольная) изометрическая проекция куба со стороной A. При этой проекции плоскость проецирования наклонена ко всем главным координатным осям под одинаковым углом. Стандартом регламентируется коэффициент сжатия, равный 0.82, а также расположение и взаимные углы главных координатных осей, равные 120° как это показано в левом верхнем углу рис. . Обычно сжатие не делается.
При диметрической проекции две из трех осей сокращены одинаково, т.е. из трех углов между нормалью к плоскости проекции и главными координатными осями два угла одинаковы. На рис. приведена (аксонометрическая прямоугольная) диметрическая проекция куба со стороной A. Там же показаны регламентируемые расположение осей и коэффициенты сжатия. Обычно вместо коэффициента сжатия 0.94 используется 1, а вместо 0.47 - 0.5.
В косоугольных проекциях плоскость проекции перпендикулярна главной координатной оси, а проекторы расположены под углом к ней. Таким образом, аксонометрические косоугольные проекции сочетают в себе свойства ортогональных и аксонометрических прямоугольных проекций.
Наиболее употребимы два вида косоугольной проекции - фронтальная (косоугольная) диметрия (проекция Kabinett - кабине) и горизонтальная (косоугольная) изометрия (проекция Kavalier - кавалье) или военная перспектива.
В случае фронтальной (косоугольной) диметрии при использовании правосторонней системы координат экрана плоскость проецирования перпендикулярна оси Z. Ось X направлена горизонтально вправо. Ось Z изображается по углом в 45° относительно горизонтального направления. Допускается угол наклона в 30 и 60°. При этом отрезки, перпендикулярные плоскости проекции, при проецирования сокращаются до 1/2 их истинной длины. На рис. приведена (аксонометрическая косоугольная) фронтальная диметрическая проекция куба со стороной A, там же показаны регламентируемые коэффициент сжатия, равный 0.5 и расположение осей.
В случае же (аксонометрической косоугольной) горизонтальной изометрии, как следует из названия, плоскость проецирования перпендикулярна оси Y а укорачивания по всем осям одинаковы и равны 1. Угол поворота изображения оси X относительно горизонтального направления составляет 30°. Допускается 45 и 60° при сохранении угла 90° между изображениями осей X и Z. Иллюстрация этого приведена на рис. .
Выведем выражения для матриц преобразования, используя теперь левостороннюю систему координат более естественную для машинной графики.
Простейшее параллельное проецирование - ортогональное выполняется на плоскость, перпендикулярную какой-либо оси, т.е. при направлении проецирования вдоль этой оси. В частности, проецирование в XY-плоскость, заданную соотношением Z = Z0, выполняется следующим образом:
|
Рассмотрим теперь косоугольное проецирование, при котором плоскость проецирования перпендикулярна главной оси, а проекторы составляют с плоскостью проецирования угол не равный 90°. Матрица для этого преобразования может быть найдена исходя из значений угла проецирования и координат преобразованной точки. На рис. показана косоугольная параллельная проекция единичного куба.
Из рисунка видно, что проектором, идущим из точки P0 в P1, точка P0(0,0,1) проецируется в P1(L·cosa, L·sina, 0).
Теперь проектором, параллельным рассмотренному (рис. ), спроецируем некоторую точку (X,Y,Z) в точку (Xp,Yp,Zp).
Из подобия треугольников получаем:
|
|
|
Различные варианты параллельных проекций формируются из полученной подстановкой значений L и углов a и b (см. рис. 0.10). В частности, для фронтальной косоугольной диметрии L = 1/2, следовательно, угол b между проекторами и плоскостью проецирования равен arctan2 = 63.4°. Угол же a, равен 45° и допускается 30 и 60°, как это сказано выше. (Обратите внимание, что в этой системе координат плоскость фронтальной проекции - плоскость XY, в отличие от системы координат технического черчения, где фронтальная проекция, как это показано на рис. 0.5, формируется в плоскости XZ).
Наиболее реалистично трехмерные объекты выглядят в центральной проекции из-за перспективных искажений сцены. Центральные проекции параллельных прямых, не параллельных плоскости проекции будут сходиться в точке схода. В зависимости от числа точек схода, т.е. от числа координатных осей, которые пересекает плоскость проекции, различаются одно, двух и трехточечные центральные проекции. Иллюстрация одно-, двух- и трехточечной центральных проекций куба приведена на рис. .
Наиболее широко используется двухточечная центральная проекция.
Выведем матрицу, определяющую центральное проецирование для простого случая одноточечной проекции (рис. ), когда плоскость проекции перпендикулярна оси Z и расположена на расстоянии d от начала координат. (Здесь используется удобная для машинной графики левосторонняя система координат).
Начало отсчета находится в точке просмотра. Ясно, что изображения объектов, находящиеся между началом координат и плоскостью проекции увеличиваются, а изображения объектов, расположенных дальше от начала координат, чем плоскость проекции уменьшаются.
Из рис. 0.13 видно, что для координат (X1,Y1) точки P1, полученной проецированием точки P0(X,Y,Z) в плоскость Z = d (плоскость экрана) выполняются следующие соотношения:
|
|
|
Для перехода к декартовым координатам делим все на z/d и получаем:
|
|
|
|
Существенное повышение наглядности изображения достигается использованием псевдостереоизображений. В этом случае каждым глазом надо рассматривать отдельный перспективный вид. Оба таких вида отображаются на экран дисплея. Для их разделения могут использоваться:
· цветовое разделение, когда, например, изображение для левого глаза
строится красным цветом, а для правого - синим и для просмотра
используются цветные очки; недостаток этого способа состоит в том,
что по сути дела можно формировать только простые каркасные
изображения, но зато реализация проста и полностью используется
пространственное разрешение дисплея;
· пространственное-временное разделение, когда, например,
изображение для левого глаза строится в четных строках, а для
правого - в нечетных и для просмотра используются электронные или
электромеханические очки, перекрывающие или левый или правый глаз
на время прорисовки нечетных, четных строк, соответственно; этот
подход может быть реализован на дисплеях с чересстрочной
разверткой, позволяет выводить достаточно динамические цветные
полутоновые изображения, но с уменьшением вдвое разрешения по
вертикали;
· временное разделение, когда для левого глаза используется одна
страница видеопамяти, а для правого - вторая и происходит их
переключение с достаточно большой частотой кадровой развертки; для
перекрытия глаз также должны использоваться электронные или
электромеханические очки; пространственное разрешение по строкам
здесь не теряется.
Кроме этого, статические цветные псевдостереоизображения могут быть получены последовательным фотографированием изображений для левого и правого глаз с последующим просмотром через стереоскоп.
Используя результаты, полученные в предыдущем пункте, легко сконструировать матрицы преобразований для получения стереопроекций для левого и правого глаз.
Также как и для векторных изображений в двумерном случае, для растровых картин могут в общем случае требоваться преобразования сдвига, масштабирования и поворота. В связи с существенно дискретным характером изображения при выполнении этих преобразований имеется ряд особенностей.
Преобразование сдвига реализуется наиболее просто и заключается в переписывании части изображения (bitblt - операции Bit Block Transfer). При этом возможно исполнение некоторых операций над старым и новым пикселами с одинаковыми координатами.
Наиболее употребимыми являются:
· замена - новый пиксел просто заменяет старый,
· исключающее ИЛИ - в видеопамять заносится результат операции XOR
над старым и новым кодами пикселов. Эта операция обычно
используется дважды - вначале для занесения некоторого
изображения, например, перекрестия и повторного его занесения для
восстановления исходной картины.
Кроме этого, для реализации техники "акварель", т.е. техники работы с прозрачными цветами, в видеопамять заносится результат цветовой интерполяции между старым и новым оттенками пикселов. Эта операция всегда точно реализуема в полноцветных дисплеях, хранящих значения R, G и B в каждом пикселе. В дисплеях с таблицей цветности возможно получение не совсем правильных результатов.
Принято различать два типа масштабирования:
· целочисленное - zoom,
· произвольное, когда коэффициент масштабирования не обязательно целое число, - transfocation.
Наиболее просто реализуется целочисленное масштабирование. При увеличении в K раз каждый пиксел в строке дублируется К раз и полученная строка дублируется К раз. При уменьшении в K раз из каждой группы в K строк выбирается одна строка и в ней из каждой группы в K пикселов берется один пиксел в качестве результата. Не целочисленное масштабирование требует нерегулярного дублирования при увеличении и выбрасывания при уменьшении. Для отсутствия "дырок" в результирующем изображении при любых преобразованиях растровых картин следует для очередного пиксела результирующего изображения определить соответствующий (соответствующие) пикселы исходного изображения, вычислить значение пиксела и занести его.
Рассмотрим нецелочисленное уменьшение, т.е. перепись из большего массива в меньший (увеличение строится похожим образом).
Алгоритм ясен из следующей программы:
#define Max 13 // размер исходного массива #define Min 7 // размер результирующего массива int ist; // целая часть приращения индекса большего // массива при смещении на 1 по меньшему float rst; // дробная часть приращения индекса большего // массива при смещении на 1 по меньшему int iwr; // индекс записи int ird; // целая часть индекса чтения float rrd; // дробная часть индекса чтения char isx[Max]; // исходный массив пикселов char rez[Min]; // результирующий массив пикселов void main (void) { ist= (int)(Max / Min); rst= (float)(Max - ist*Min)/(float)Min; ird= 0; rrd= 0.0; for (iwr=0; iwr < Min; iwr++) { ird= ird + ist; // накопление целой части индекса; rrd= rrd + rst; // накопление дробной части индекса; if (rrd >= 1.0) {rrd= rrd - 1.0; ird= ird + 1; } rez[iwr]= rez[ird-1]; } }
Понятно, что такой алгоритм требует точной вещественной арифметики, версия алгоритма с целочисленной арифметикой имеет вид:
#define Max 13 // размер исходного массива #define Min 7 // размер результирующего массива int ist; // целая часть приращения индекса большего // массива при смещении на 1 по меньшему int rst; // остаток от приращения индекса // меньшего массива int iwr; // индекс записи int ird; // целая часть индекса чтения int rrd; // остаток индекса чтения char isx[Max]; // исходный массив пикселов char rez[Min]; // результирующий массив пикселов void main (void) { ist= (int)(Max / Min); rst= Max - ist*Min; ird= 0; rrd= 0.0; for (iwr=0; iwr < Min; iwr++) { ird= ird + ist; // накопление целой части индекса; rrd= rrd + rst; // накопление дробной части индекса; if (rrd >= Min) {rrd= rrd - Min; ird= ird + 1; } rez[iwr]= rez[ird-1]; } }
Внутренняя часть цикла при записи на ассемблере существенно упрощается, если использовать то, что для обычных 16-ти разрядных ЭВМ при переполнении происходит смена знака.
Определенные проблемы, связанные с дискретных характером изображения, возникают и при повороте растровой картины на угол не кратный 90°. Здесь возможны два подхода: