Текст
                    Е. А. Никулин
КОМПЬЮТЕРНАЯ ГЕОМЕТРИЯ
И АЛГОРИТМ I
МАШИННОЙ ГРАФИКИ
Геометрические основы компьютерной графики
Аффинные и проективные преобразования
Математические модели поверхностей и объектов
Геометрические задачи визуализации
\
/
^ш. • . ■ %


Е. А. Никулин КОМПЬЮТЕРНАЯ ГЕОМЕТРИЯ И АЛГОРИТМЫ МАШИННОЙ ГРАФИКИ Санкт-Петербург «БХВ-Петербург» 2003
Никулин Е. А. Компьютерная геометрия и алгоритмы машинной графики. — СПб.: БХВ-Петербург, 2003. - 560 с: ил. В книге приведено максимально полное изложение геометрических и алгоритмических основ современной компьютерной графики: математические модели графических элементов на плоскости и в пространстве, фундаментальные законы геометрической оптики и основанные на них алгоритмы построения оптических эффектов, методы геометрических преобразований, анализа и синтеза моделей линий, поверхностей и объектов, геометрические задачи визуализации — комплекс алгоритмов 2d- и 3d- отсечения и удаления. Материал сопровождается большим числом иллюстраций, блок-схем алгоритмов и примеров их реализации. Для студентов вузов и специалистов, изучающих компьютерную графику и занимающихся разработкой новых алгоритмов и прикладных графических программ Группа подготовки издания: Главный редактор Екатерина Кондукова Зав. редакцией Григорий Добин Редактор Нина Седых Компьютерная верстка Натальи Смирновой Корректор Наталия Першакова Дизайн обложки Игоря Цырульникова Зав. производством Николай Тверских Рецензент: кафедра вычислительной техники Нижегородского государственного технического университета (зав. кафедрой член-корреспондент РАН, профессор В. В. Кондратьев)
Содержание Введение 1 Основные обозначения и соотношения 5 Глава 1. Геометрические основы компьютерной графики 9 1.1. Графические элементы на плоскости 12 1.1.1. Модели прямой линии на плоскости 13 1.1.1.1. Неявное уравнение прямой 13 1.1.1.2. Нормальное уравнение прямой 15 1.1.1.3. Параметрическая функция прямой 16 1.1.1.4. Уравнения прямой, проходящей через две точки 17 1.1.1.5. Уравнения прямой в отрезках 18 1.1.2. Взаимное положение графических элементов на плоскости 18 1.1.2.1. Коллинеарность точек 18 1.1.2.2. Взаимное расположение прямых 19 1.1.2.3. Взаимное расположение точки и прямой 19 1.1.2.4. Построение прямой, наименее удаленной от совокупности точек 21 1.1.2.5. Пересечение двух прямых 24 1.1.2.6. Уравнения пучка прямых и биссектриса угла 25 1.1.2.7. Тесты свойств графических элементов на плоскости 27 1.1.2.8. Тесты ориентации точки относительно полигона 32 1.1.2.9. Алгоритмы пересечения на плоскости 42 1.1.2.10. Площадь и геометрический центр полигона 48 1.1.2.11. Алгоритмы генерирования случайных полигонов 51 1.1.3. Квадратичные и параметрические кривые 54 1.2. Графические элементы в пространстве 60 1.2.1. Модели плоскости в пространстве 62 1.2.1.1. Неявное уравнение плоскости 62 1.2.1.2. Нормальное уравнение плоскости 63 1.2.1.3. Параметрическая функция плоскости 64 1.2.1.4. Уравнения плоскости, проходящей через три точки 66 1.2.1.5. Уравнения плоскости в отрезках 66 1.2.1.6. Модели линии в пространстве 67 1.2.2. Взаимное положение графических элементов в пространстве 69 1.2.2.1. Коллинеарность точек 69 1.2.2.2. Компланарность точек 69
IV Содержание 1.2.2.3. Точка и прямая 70 1.2.2.4. Точка и плоскость 70 1.2.2.5. Построение плоскости, наименее удаленной от совокупности точек 71 1.2.2.6. Взаимное расположение двух прямых 73 1.2.2.7. Взаимное расположение прямой и плоскости 74 1.2.2.8. Две плоскости 75 1.2.2.9. Пучок плоскостей и биссекторная плоскость 76 1.2.2.10. Пересечение плоскостей 77 1.2.2.11. Модель полиэдра 77 1.2.2.12. Тесты свойств графических элементов в пространстве 80 1.2.2.13. Тесты ориентации точки относительно полиэдра 83 1.2.2.14. Алгоритмы пересечения в пространстве 85 1.2.3. Квадратичные и параметрические поверхности 89 1.3. Основные задачи геометрической оптики 99 1.3.1. Пересечение луча с поверхностью 100 1.3.2. Отражение луча от поверхности 106 1.3.3. Преломление луча на поверхности 107 1.3.4. Прямая и обратная трассировка лучей 110 1.3.5. Лучевые методы построения оптических эффектов 112 1.3.5.1. Тень 116 1.3.5.2. Отражение 121 1.3.5.3. Преломление 128 Глава 2. Геометрические преобразования 139 2.1. Аффинные преобразования 140 2.1.1. Основные понятия и соотношения 140 2.1.2. Элементарные аффинные преобразования 144 2.1.2.1. Перенос 144 2.1.2.2. Масштабирование 144 2.1.2.3. Сдвиг 145 2.1.2.4. Вращение 148 2.1.2.5. Табличный расчет тригонометрических функций 149 2.1.3. Сложные аффинные преобразования 154 2.1.3.1. Методы расчета матрицы сложного преобразования 155 2.1.3.2. Кинематический метод построения объектов 170 2.1.3.3. Кинематическая задача перемещения в пространстве 182 2.2. Проективные преобразования 194 2.2.1. Ортографические проекции 196 2.2.2. Аксонометрические проекции 197 2.2.3. Косоугольные проекции 207 2.2.4. Центральные (перспективные) проекции 211 2.2.5. Проективные алгоритмы сложных преобразований 221 2.2.5.1. Проецирование пространственных линий на плоскость 223 2.2.5.2. Стереографические проекции 228
Содержание V 2.2.5.3. Картографические проекции 231 2.2.5.4. Построение сцены с подвижным наблюдателем 242 2.2.5.5. Проективные алгоритмы построения оптических эффектов 247 Глава 3. Математические модели поверхностей и объектов 261 3.1. Методы моделирования поверхностей 261 3.1.1. Методы изображения поверхностей 262 3.1.1.1. Выбор проекции изображения 263 3.1.1.2. Каркасные поверхности 264 3.1.1.3. Точечные поверхности 268 3.1.1.4. Модели освещенности и закрашивание поверхностей 271 3.1.2. Кинематические поверхности 278 3.1.2.1. Поверхности вращения, переноса и комбинированные 282 3.1.2.2. Линейчатые поверхности и их развертки 289 3.1.2.3. Нелинейчатые поверхности 307 3.1.3. Кусочно-определенные поверхности 324 3.1.4. Сплайны 329 3.1.4.1. Сплайновые кривые 330 3.1.4.2. Сплайновые поверхности 339 3.1.5. Фрактальные множества 347 3.1.5.1. Фрактал Мандельброта и алгоритмические фракталы 348 3.1.5.2. Геометрические фракталы 353 3.1.5.3. Свойства фракталов 370 3.1.6. Графические поверхности 376 3.2. Модели объектов в пространстве 379 3.2.1. Каркасные модели. Платоновы тела 381 3.2.2. Граничные модели 393 3.2.3. Сплошные модели 395 Глава 4. Геометрические задачи визуализации 405 4.1. Логические операции со списками 405 4.1.1. Объединение списков отрезков 408 4.1.2. Пересечение списков отрезков 411 4.1.3. Исключение списков отрезков 413 4.2. Методы отсечения 416 4.2.1. Регулярное плоское отсечение отрезка 420 4.2.2. Произвольное плоское отсечение отрезка 423 4.2.3. Произвольное плоское отсечение полигона 429 4.2.4. Объемное отсечение отрезка 432 4.2.5. Объемное отсечение полигона и полиэдра 434 4.2.6. Логическое конструирование Зс1-объектов 442 4.2.7. Дополнительные задачи отсечения на плоскости 448 4.2.7.1. Отсечение выпуклого полигона полуплоскостью 448 4.2.7.2. Расчет ядра произвольного полигона 452 4.2.7.3. Пересечение выпуклых полигонов 453
VI Содержание 4.2.7 .4. Отсечение проекции выпуклого полигона 454 4.2.7.5. Выпуклая полигональная оболочка массива точек 461 4.2.7.6. Полигонализация массива точек 464 4.2.7.7. Разрезание невыпуклого полигона 468 4.2.7.8. Триангуляция полигона 472 4.2.8. Дополнительные задачи отсечения в пространстве 484 4.2.8.1. Отсечение выпуклого полиэдра полупространством 484 4.2.8.2. Сечение выпуклого полиэдра плоскостью 493 4.2.8.3. Расчет ядра полиэдра 495 4.2.8.4. Пересечение выпуклых полиэдров 496 4.2.8.5. Выпуклая полиэдральная оболочка массива точек 498 4.3. Методы удаления 504 4.3.1. Предварительная обработка моделей объектов 509 4.3.1.1. Выбор мировой системы координат 509 4.3.1.2. Построение охватывающих оболочек 513 4.3.1.3. Разбиение граней 523 4.3.1.4. Отбраковка нелицевых граней и нормировка векторов 530 4.3.2. Удаление невидимых линий 533 4.3.3. Удаление невидимых граней 539 Заключение 545 Список литературы 549
Введение В основании бесконечно развивающегося здания компьютерной графики краеугольными камнями лежат фундаментальные дисциплины — аналитическая геометрия и оптика, скрепленные раствором — искусством программирования. Возникнув из потребностей рынка, развития информатики и вычислительной техники, компьютерная графика изучает методы построения изображений различных геометрических объектов и сцен. Главными этапами построения изображения являются: 3 моделирование как искусство применения методов математического описания объектов и сцен, природа которых может быть самой различной: обычные геометрические фигуры и тела в двух- и трехмерном пространстве; естественные явления природы — горы, деревья, облака и другие объекты; огромные массивы чисел, полученных в различных экспериментах, и многое другое; 3 визуализация (отображение) как искусство построения реалистичных изображений объемного мира на плоском экране дисплея ЭВМ, заключается в преобразовании моделей объектов и сцен в статическое изображение или фильм — последовательность статических кадров. В отличие от плоских изображений реальных трехмерных объектов, которые на фотографиях автоматически выглядят натурально благодаря действию в природе оптических законов, синтезированное компьютерное изображение будет похоже на реальное лишь при мастерском владении как методами моделирования геометрических форм, так и средствами их достоверной визуализации. Таким образом, компьютерную графику можно рассматривать как искусство создания реалистичной иллюзии действительного мира. Эта сторона ее применения нашла наиболее яркое воплощение в системах виртуальной реальности — комплексах аппаратных и программных средств имитации окружающей среды с помощью визуальных, акустических, тактильных и других эффектов. С другой стороны, методами компьютерного синтеза стало возможным создание и нереальных, фантастических изображений и эффектов, без чего не обходится ни одна популярная компьютерная игра или кассовая голливудская кинолента. Подлинное второе дыхание компьютерная графика придала рекламному бизнесу благодаря умению создавать анимированные, т. е. оживленные, персонажи рекламируемых товаров. Из более серьезных областей применения компьютерной графики можно назвать: □ системы автоматизированного проектирования (САПР), в которых осуществляется интерактивное взаимодействие конструктора и синтезированного с помощью компьютера изображения создаваемого изделия или сооружения;
2 Введение □ автоматизированные системы научных исследований (АСНИ), в которых осуществляется визуализация результатов экспериментов в виде трехмерных статических или динамических изображений, интерпретирующих огромные массивы первичных данных; □ распознавание и обработка изображений в системах искусственного зрения, авиационной и космической картографии, медицинской томографии и т. д. В качестве исходного материала могут быть отсканированные изображения, космические снимки, данные локации и т. п. Компьютерное преобразование этих данных в зримые геометрические образы помогает достаточно просто понимать суть происходящих процессов людям, далеким от вычислительной техники. Таким образом, интерес к машинной графике проявляют представители самых различных специальностей: программисты компьютерных игр, конструкторы, технологи, физики, биологи, медики, дизайнеры, кинорежиссеры, художники- мультипликаторы, клипмейкеры и др. Неудивительно поэтому, что постоянно ощущается острый дефицит литературы, раскрывающей возможности применения научных методов в современной компьютерной графике. К такого рода изданиям и относится настоящая книга. Наиболее близким к ней по духу является фундаментальный тандем книг [25, 26] по основам машинной графики. К удачным изданиям последнего времени хотелось бы отнести также [5, 18. 23] и особенно [36]. Глубоко уважаемый автор последней книги, как и большинство других авторов, отстаивает "подход программиста" при овладении знаниями в области компьютерной графики. Цель его книги — научить приемам решения простейших задач трехмерной графики, не останавливаясь на детальном исследовании излагаемых алгоритмов и оптимальных методов их реализации. Конечно, можно успешно водить автомобиль, не зная в деталях, что происходит под капотом. Но компьютерная графика— не массовое увлечение, а удел специалистов своего дела, знающих предмет изнутри. Основное содержание настоящей книги составляет детальное изложение методов и алгоритмов реалистичного изображения как статических, так и динамических объектов и сцен. Автор глубоко убежден в том, что гораздо интереснее и важнее понимать и уметь самому реализовать скрытые закономерности изображения сложных объектов, чем с восхищением наблюдать, как эти изображения создаются чужими, пусть и более совершенными графическими программами. Автор сознательно не приводит текстов программ на каком-либо алгоритмическом языке, т. к. мода на языки программирования преходяща (сохранившиеся кое-где книги с программами на раритетных ныне языках Basic, Fortran и Algol [20,24,31] не вызывают ничего, кроме умиления), стиль работы каждого программиста уникален, а алгоритмы, изложенные на понятном для всех языке формул и блок-схем, универсальны и существенно более долговечны. Книга призвана вооружить читателя удочкой— методами, алгоритмами и особенностями их реализации, а не готовой рыбкой — текстами программ; побудить его работать своей головой, а не использовать чужие решения.
Введение 3 По аналогичной причине книга не является инструкцией пользователя какого- нибудь популярного графического пакета. Более того, она не содержит ни одного названия подобных программ, простое упоминание которых лет через пять вызовет лишь снисходительную улыбку читателя по причине их безнадежной древности. Единственное исключение сделано уникальной программе MathCAD [22], которую автор использовал для создания геометрически достоверных рисунков и решения многочисленных примеров, иллюстрирующих работу алгоритмов. И снова читатель будет лишен удовольствия сравнить свое искусство программирования в среде MathCAD с авторским, поскольку в книге сознательно не приведено ни одного листинга конкретной программы. Этому есть еще одно объяснение. Курс "Компьютерная графика", читаемый автором на протяжении ряда лет в Нижегородском государственном техническом университете, предполагает выполнение лабораторных работ, где излагаемые в книге алгоритмы программируются в среде MathCAD. Для того чтобы доставить студентам удовольствие от самого процесса получения самостоятельного решения, тексты программ не включены в содержание книги. Автор выражает благодарность студентам факультета информационных систем и технологий Нижегородского государственного технического университета за роль подопытных кроликов, которую они доверчиво играли в процессе изучения курса, являясь одновременно экспертами методов и алгоритмов, излагаемых в книге. Нет границ признательности автора к членам своей семьи, в течение ряда лет терпеливо наблюдавших спину своего мужа и отца, работающего за компьютером над созданием и бесчисленными исправлениями этой книги. Спасибо всем неравнодушным за моральную поддержку!
Основные обозначения и соотношения & — символ, обозначающий начало алгоритма или примера. ^2 — символ, обозначающий конец алгоритма или примера R" — евклидово пространство размерности //. х°, у0 и z° — ортогональные векторы единичной длины (орты), направленные по осям декартовой системы координат xyz. f, h и р — фронтальная (ху), горизонтальная (xz) и профильная (yz) координатные плоскости декартовой системы координат. V = [Vx Vy\- Vxx° + Vyy° G R — вектор в плоскости ху с координатами V„ Vy и модулем (длиной) |к| = Jvx + Vy . У = Wx Vy ^z J= Vxx° + УуУ° + ^22° G R — вектор в пространстве xyz с координатами Vx, Vy, V. и модулем | V |= JVX + Vy + v} . 0„ е R" — нулевой вектор или блок вектора размерности п. 0„x„, е R"x"' — нулевая матрица или блок матрицы размерности п х т. V = [v l] G R"+l — расширенный вектор V, дополненный координатой, равной единице. V = [v О] G R"+l — расширенный вектор V, дополненный координатой, равной нулю. - V V'= нормированный вектор Vединичной длины. V\\ W и V# W— соответственно, параллельные и непараллельные векторы V и W. VI. Wv\ VLW — ортогональные и неортогональные векторы Vv\W. ZVWv\m\ Z.(V,W) — угол между векторами Vv\W.
6 Основные обозначения и соотношения V° W- Vt- Wx+ Vy- lVy+ V.- W.— скалярное произведение векторов V и W. Другое выражение для скалярного произведения F° W= |К] • IH7) - cos(ZVW) позволяет найти косинус угла между векторами Vv\ W: i \ К о И' cob(ZVW)=. .... ИМ V о W — 0 — шест ортогональности векторов V и W. V°W= ±1 — тесты параллельности (при +1) и антипараллельности (при -1) векторов Vv\W. pT(VV = \У\ ■ cos{ZVW)W = ]—}¥-W = (к о w)w in pr/jV = V-prNV = V-(von)~N имеющую вектор нормали TV. проекция вектора V на вектор W. проекция вектора Ке R1 на плоскость П, N = yxW = х° у0 -° Vx Vy Vz wx wy wz = Nxx° + Nyy° + Nzz° — векторное произведение векторов FeR3H^eR3, имеющее координаты vy v2 к* Wy Wz , Nv = V V w, wv , N. Vx Vy \VX \Vy и модуль \N\ = \V\ ■ \W\ - sm(ZVJV). Отсюда получаем значение синуса угла между векторами в пространстве: sin (zvw)= \VxW\ |КхИ/| = 0— тест параллельности {антипараллельности) векторов KeR1 и W е R-\ {р\рг —Рп} — ломаная линия (полилиния), заданная списком точек в порядке их соединения р\ —>/?2—> ... —>р„. {pi pi ...р„р\}— многоугольник (полигон), заданный списком точек-вершин в порядке их обхода по замкнутому контуру р\ —>pi —> ... —>p„—>pt. V/(//)= — вектор градиента скалярной функции/векторного аргумента V. AV Нпе(а, Ь) — функция рисования отрезка прямой линии ab на плоскости ху. й\г%[ми ... Мт\ — квадратная матрица М е R"*" с диагональными элементами Мц и недиагональными элементами МГ/ - О V/ * j.
Основные обозначения и соотношения 7 Еп =diag|l ... l] — единичная нхл-матрица. М 0|хи I 1 j^(n+i><(n+U — расширенная матрица Л/, дополненная нижней диагональной единицей. и tr(M)= ^Мц — след квадратной матрицы М е R"*". j=l rang(AZ) — ранг матрицы М, равный числу ее линейно независимых строк или столбцов. г Л fl, если выполняется условие cond; i£ond]= < [О, если не выполняется условие cond. if (cond: a, b)- апри cond =* О — условный оператор. Ь при cond = О sgn(x)=if(x>0:l,if(x<0:-1,0))= 1 при х>0 0 при х = 0 — знак действительного числа х. -1 при х<0 mod(fl, b) — остаток от деления действительного числа а на действительное число Ь =* 0. Знак остатка равен знаку числа а. Дробная часть числа х равна mod(jc, 1). j_-xrj — округление числа х до ближайшего целого числа m < х. \х\ — округление числа х до ближайшего целого числа М > х. [_.v -t- 0.5J или [х-0.5 | — округление числах до ближайшего целого числа. rnd(x) — случайное число, равномерно распределенное в интервале (0, х). Случайное число в интервале (я, Ь) равно a + md(b - а). Случайное целое число в интервале [л, т] генерируется как [п + rnd(m +1 -п)]. L = {Л,..., /„} — список п скалярных переменных. Lp - {/7i, ...,/?„} — список и точек, элемент которого есть вектор координат точки. Ls = {«I Ь\,..., а„ Ь„} — список п отрезков, элемент которого есть пара векторов концевых точек отрезка. Lm = {Li,..., L,„} — группа т списков, элемент которого есть список типа L или Lp. Гт = {Л,..., Г„,} — массив т групп списков, элемент которого есть массив списков типа Lm. size(S) — функция расчета числа элементов структурированного объекта S. sort(L) — функция сортировки элементов списка (вектора) L по критерию с.
Глава 1 Геометрические основы компьютерной графики Реалистичность восприятия человеком сложного компьютерного изображения определяется умением разработчика математической модели изображаемого объекта или процесса достоверно повторить на экране его развитие в пространстве и во времени. Модель включает в себя систему уравнений и алгоритмов их реализации. Математической основой построения модели являются уравнения, описывающие форму и движение объектов. Все многообразие геометрических объектов является комбинацией различных примитивов— простейших фигур, которые в свою очередь состоят из графических элементов — точек, линий и поверхностей. Положение точки в R" задается радиус-вектором р = \р\ р2 ... р„], имеющим п координатр\ -=-/?„ и разложение п Р = [Р\ Pi ■•• Pn\=Y,Piei (11) по п линейно-независимым базисным векторам е\ -s- е„. Совокупность базисных векторов и единиц измерения расстояний вдоль этих векторов составляет систему координат (СК). В пространствах размерностей п < 3 вместо цифр используются синонимы в виде буквенных обозначений координат. Например, первой координате можно сопоставить букву х, второй — букву у, а третьей — букву z. Если при этом векторы е^=х°, е2 - у0 и е3 - z° нормированы и взаимно ортогональны, то xyz является декартовой СК — наиболее распространенной системой координат. Для описания формы графических объектов, задания расположения объектов в пространстве и их проекций на экране дисплея используются различные СК, наиболее удобные в каждом конкретном случае. Перечислим системы, применяемые в настоящей книге, и кратко охарактеризуем их назначение: Э неподвижная мировая система координат (MCK) xyz содержит точку отсчета (начало координат) и линейно независимый базис, благодаря которым становится возможным цифровое описание геометрических свойств любого графического объекта в абсолютных единицах;
10 Глава 1 П экранная система координат (ЭСК) x^y-tZt, в которой задается положение проекций геометрических объектов на экране дисплея. Проекция точки в ЭСК имеет координату z3 = 0. Тем не менее, не следует отбрасывать эту координату, поскольку МСК и ЭСК часто выбираются совпадающими, а, кроме того, вектор проекции [хэ уэ о] может участвовать в преобразованиях, где нужны не две, а три координаты; П система координат сцены (СКС) Лс j'c zc. в которой описывается положение всех объектов сцены — некоторой части мирового пространства с собственными началом отсчета и базисом, которые используются для описания положения объектов независимо от МСК; □ объектная система координат (ОСК) х0у0 zD, связанная с конкретным объектом и совершающая с ним все движения в СКС или МСК. По умолчанию будем полагать, что все координаты задаются в МСК. В R2 наиболее распространены ортогональная декартова (х,у) и полярная (г, <р) системы (рис. 1.1, а), связанные друг с другом следующими соотношениями: x = rcos((p), ^ = rsin((p), r = y]x2+y2, tg((p) = A X (1.2) y& <s—► Рис. 1.1 (1.3, я) В R3 наиболее распространены ортогональная декартова (х, у, z), щтшдрическая (P. J', ф) и сферическая {г, ф, \\>) системы (рис. 1.1,6), связанные друг с другом следующими соотношениями координат: □ декартова СК с цилиндрической СК: дг = р5ш(ф), z=rcos^), D = Vx2+z2, tgfa)=-; 7 П декартова СК со сферической СК: х = г sin ^)sin (х|/), y = r cos(x|/), : = г cos^)sin (х|/), /2 2 2 / ч X , v Vx2+z2 (1-3,6) = V* +/+* , Ш)=-, tg(\j/) = ;
Геометрические основы компьютерной графики 11 3 цилиндрическая СК со сферической СК: p = rsin(\j/) >> = rcos(\j/), П. 2 t \ Р С-3,«) г = 1Р + У , tg(\|/) = -. У Для единообразия терминов и алгоритмов мы будем работать в правой декартовой СК, оси которой ориентированы в пространстве так, что вращения ортов л° —)у°, у0 —» z° и z° —»х° происходят в положительном направлении, т.е. против часовой стрелки с точки зрения наблюдателя, находящегося на конце третьего свободного орта. Взаимосвязь координат графического элемента может быть описана неявным уравнением/(р) = 0 и параметрической функцией p{t). Частным случаем неявного описания является явная форма, в которой одна из координат выражена через другие. Это возможно лишь для некоторых простейших линий и поверхностей. Не все графические элементы могут быть описаны неявными функциями. Наиболее универсальным является параметрическое описание каждой из п координат графического элемента соответствующей функцией времени, угла поворота или других параметров. Целью настоящего краткого экскурса в вычислительную геометрию, не претендующего на исчерпывающую полноту и строгость, является систематизация формул, необходимых для работы с графическими объектами, приведение их к алгоритмическому виду. Это отличает компьютерную графику от обычной, в которой свойства и взаимосвязь графических объектов визуально воспринимаются глазами человека и интеллектуально интерпретируются его мозгом. С методами решения задач классической геометрии можно познакомиться, например, в [6,7]. Компьютерная или вычислительная геометрия оперирует не с рисунками, а с числами (координатами точек, векторов, матрицами преобразований, списками данных) и отношениями между ними, выраженными также в цифровой форме. Исходная информация, обработанная специальными алгоритмами, преобразуется в другие цифровые данные, интерпретируемые как искомый результат — модель объекта, его экранное изображение, отношения между объектами сцены и т. п. Подробное изложение основ вычислительной геометрии приведено в [24, 29]. Рассмотрим основные соотношения между графическими элементами на плоскости R2 и в пространстве RA Все основные формулы будут записаны в координатной и векторной формах. Векторная форма компактнее координатной и предпочтительнее для понимания и программирования алгоритмов, хотя и требует несколько больших машинных ресурсов— объема памяти и времени счета. Увеличение ресурсов объясняется наличием в векторах и матрицах фиксированных элементов (единиц и нулей), с которыми иногда выполняются бесполезные арифметические операции. Выше приведены основные обозначения и соотношения векторной алгебры. Самые трудоемкие матричные операции — обращение квадратной п х «-матрицы
12 Глава 1 М и расчет ее определителя — рекомендуется выполнять с максимально возможной точностью простым в программировании рекуррентным алгоритмом Левер- рье—Фадаеева [10]: Ц = Е„, ос, = -^—", Li+X = ML, - щЕп V/ = 1, п, i М >=Al, Н = (-1Гаи. a„ (1.4) 1.1. Графические элементы на плоскости Точка на плоскости имеет две степени свободы. Расстояние между двумя точками pi = [л} у\ ]= [г\ <р,] и р2 = [х2 у2]= h Фг! Равно: d = \Р\ ~Рг\= \ (*1 ~х2У + (vi _У1Г — в декартовой СК, Vrl +r2 ~ 2^r2 cos(<P] - <р2 ) — в полярной СК. (1.5) Линия на плоскости имеет одну степень свободы. Уравнения линии в неявной (НФ) и параметрической (ПФ) формах имеют следующий вид: НФ: /(х, у) = 0 или/(/7) = 0; (1.6, а) ПФ: № = Ш М- О-6-6) В любой регулярной (гладкой и некратной) точке на линии р0 = [х0 у0]= /?('о) возможна линеаризация кривой (рис. 1.2), т. е. проведение к ней касательной прямой, уравнения которой имеют вид: Nx(x-xo) + Ny(y-yo)=0 НФ: "х = d/Ml Ах ,Ny = _ Af(x,y^ или Ay ПФ: *0'У0 J *Хо,Уо х(/)=х0 + Vxt, y(t)=yo + yj х At .?х _ Ay(t) х0.Уо At или х0,Уо К°(р-Ро)=Ь p(t)=p0+Vt; dp(t) V = At (1.7, я) (1.7,6) й> Вектор нормали N = [Nx Ny\ ортогонален к линии и по свойству градиента направлен в ту сторону, гдр/(р) > 0. При замене уравнения линии на -f(p) = 0 направление нормали меняется на противоположное. Направляющий вектор линии V = \УХ Vy\ начинается в точке ро и направлен по касательной к p(t) в сторону увеличения t. Для перехода от одной формы (1.7) к
Геометрические основы компьютерной графики 13 другой необходимо выбрать одно из двух ортогональных направлений нормали относительно направляющего вектора. Из условия ортогональности N о К= 0 => Nx Vx + Ny Vy = О получаем способ быстрого преобразования V-> N или 7V-> V: "3 координаты исходного вектора переставляются местами; П у одной из координат полученного вектора меняется знак. Рис. 1.2 Например, если дан вектор V = [l 2], то после перестановки координат он становится равным [2 l], а после изменения знака, например, у первой координаты получим вектор /V = [—2 lj, направленный влево от V. Проверка показывает, что векторы V и N ортогональны: № V =(-2)- 1 + 1 -2 = 0. Для единообразия изложения материала примем правую ориентацию нормали, означающую, что при движении точки по линии вектор N направлен перпендикулярно вправо от вектора V. Таким образом, связь векторов нормали и направления прямой будет следующей: N = Vy -Ух\У = \г"у Nx]. (1.8) 1.1.1. Модели прямой линии на плоскости Рассмотрим способы задания прямой на плоскости в различных формах. 1.1.1.1. Неявное уравнение прямой Неявное уранение прямой задается тремя коэффициентами А, В и D, составляющими вектор F = [А В d\. НФ: Ах + By + D = 0 или [р ]]°F = p°F = 0 . (1-9)
14 Глава 1 Хотя бы одно из чисел А или В должно быть ненулевым. Если оба коэффициента А ф О и В ф 0, то прямая проходит наклонно к осям координат и пересекается с ними в следующих точках (рис. 1.3, а): 'zR о" . А » 0 ^ В _ При А = 0 и В ф О уравнение By + D - 0 описывает горизонтальную прямую, а уравнению Ах + /) = 0 при А ф 0 и В = 0 соответствует вертикальная прямая. Отметим ограниченность "школьного" способа приведения неявного координатного уравнения к явному виду , s A D у(х) = х w В В и построения линии по точкам в желаемом интервале л е [хтп, лгтах]. Этот способ неприменим для вертикальных прямых с коэффициентом В = 0 и единственной координатой л = -DIА всех точек таких прямых. Прямая f{p)-p°F = 0 проходит через начало координат при /(От) = D - 0. Благодаря ее свойству разделять пространство плоскости на два подпространства с противоположными знаками/^), неявное уравнение позволяет с минимальными вычислительными затратами (за два умножения и два сложения) определить по условию f(cj) — 0 принадлежность произвольной точки q прямой линии, а также ориентацию двух точек аиЬ относительно прямой (рис. 1.3, а): П при/(д) /(b) > 0 точки лежат по одну сторону от прямой; П при/(я) f(b) < 0 — по разные стороны от прямой. Для построения прямой по уравнению Ах + By + D = 0 необходимо и достаточно иметь либо две несовпадающие точки ро и р\, через которые она проходит, либо точку ро и направляющий вектор V, с помощью которого вторая точка вычисляется как/?| =/?о+ V. Сравнивая формулы (1.9) и (1.7, я), заключаем, что координатами вектора нормали можно принять коэффициенты неявного уравнения А и В: n = [a в]. Тогда по (1.8) получаем направляющий вектор неявной прямой V = [-B А]. Рассмотрим два способа выбора точки р0 = [х0 уо\. 1. Первое, что приходит на ум — выбрать ее в том месте, где прямая пересекается с осью х при А Ф 0 или с осью у при А - 0 (только для горизонтальной прямой): ( А: ^ \-D J 0 L А J 0 -г>1 н J ч J Несмотря на легкость понимания, этот способ не самый лучший для программирования из-за наличия альтернативы выбора точки в зависимости от коэффициента А.
Геометрические основы компьютерной графики 15 2. Вычислим ближайшую к началу координат точку ро (рис. 1.3, а) методом наименьших квадратов (МНК) путем решения экстремальной задачи \р\2 -р °р-> min с ограничением р о N + D = 0. Для этого составим функцию Лагранжа 3(р, X) = 0.5(рор) + \(р о N + D). Из условий ее экстремума « = ^^,« = ^0 = 0 др И 2 дХ F получим р = -Ш, Х=- ° NoN и оптимальное решение Данное решение безальтернативно по сравнению с (1.10, я), более удобно в программировании и эффективнее в вычислении. Поэтому далее будет использоваться преимущественно оно. Таким образом, координатная и векторная параметрические формы прямой, заданной вектором F = [,4 В D], принимают вид А +Вп или Я')=^Лт[<4 В]+[-В A]t. (1.11) А2+В2 1.1.1.2. Нормальное уравнение прямой Нормапьное уравнение прямой [ро, N), заданной точкой ро и вектором нормали N, выводится из условия ортогональности векторов N и р-ро для всех точек р, принадлежащих прямой (рис. 1.3, б): НФ: N,(x-хе) + Ny(y-уо) = 0 или (p-Po)oN = 0; (\.\2,а) ПФ: x(t) = хо - Ny t, y(l) - j'o + Nx l или p(t) - po + Vt, (l.12,6) V = [-Ny Nx]. Сравнивая (1.12, а) с (1.9), получим зависимость вектора неявного уравнения от параметров нормального уравнения: F = [N -p0°N]. (1.13)
16 Глава 1 Неявная функция f(p) = (p-po)°N позволяет оценить положение точки р относительно прямой не только по знаку возвращаемого ей значения, но также и относительно направления нормали: П при f(a) > О точка а лежит в том полупространстве, куда направлена нормаль, а угол Z(a -ро, N) острый; П при/(6) < О угол Z(b -ро, N) тупой, а точка b и нормаль находятся по разные стороны от прямой (рис. 1.3,6). 1.1.1.3. Параметрическая функция прямой Параметрическая функция прямой {ро, V], проходящей через точку ро в направлении вектора F(cm. рис. 1.3, б), и эквивалентное ей уравнение в НФ будут иметь вид: ПФ: x(t) -хо+ Vj, y(t) =уо+ Vyt или p(t) = ро+ Vt; (1.14, д) НФ: Vpc- Vxy + D^O,D^-Vyxo+ Fj<o=> F = [N-p0°N], (1-14,6) где N = vy ~Vx\- Параметрическая форма удобна для задания и построения частей прямой — отрезков и лучей. Для этого в (1.14, а) необходимо указать пределы изменения параметра /. Например: П бесконечный интервал -оо < / < оо не ограничивает протяженность бесконечной прямой; Рис. 1.3
'еометрические основы компьютерной графики 17 3 задание / > 0 дает луч, выходящий из точки ро в бесконечность в направлении вектора V; 3 конечный интервал to < t < t\ определяет отрезок прямой между точками ро + Vto v\po+ Vt\. Благодаря левой ориентации направляющего вектора V относительно вектора нормали N, эквивалентная нормальной форме функция /Ы=(р-ро)°к -л]= р-Ро V позволяет определить положение точки относительно направления движения по прямой: 3 при/(д) > 0 точка а лежит справа, так что угол Z(a -ро, V) положительный; 3 при/(Ь) < О угол Z(b -ро, V) отрицательный, а точка b лежит слева от прямой. 1.1.1.4. Уравнения прямой, проходящей через две точки Неявная форма уравнения прямой, проходящей через две точки а = рх ау\ и b = \bx Ьу\ (рис. 1.3, в), выводится из условия принадлежности прямой этих точек и точки р = [х у\: НФ: р b а FT = "о" 0 0 => У 1 = 0: У х + = 0. (1.15, а) Выбрав направление движения по прямой от точки а к точке Ь, получим направляющий вектор V-b-аи параметрическую модель линии: ПФ: x(t) - a, + {bx-ajt,y(t) = ау + фу-a})t илиp{t) = а + ф-a)t. (1.15,5) Условие существования прямой очевидное: | У\ф 0, т. е. а * Ь. При изменении параметра от / = 0 до / = 1 движение точки происходит внутри отрезка ab от точки а до точки Ь. Ниже рассматриваются свойства плоских многоугольников (полигонов), определяемые ориентацией векторов нормалей к их ггоронам. С учетом принятого соглашения (1.8) внешняя ориентация нормалей к сторонам полигона обеспечивается при его обходе против часовой стрелки. Соответствующая данному способу задания прямой функция /Ы= р-а Ь-а позволяет определить нахождение точки р относительно движения по прямой от J до Ь. При/(р) > 0 точка р лежит справа от прямой, а при/(^) < 0 точка q находится от нее слева.
18 Глава 1 1.1.1.5. Уравнения прямой в отрезках Неявное уравнение прямой в отрезках hx и Л одновременно не равных нулю и отсекаемых прямой на осях х и у (рис. 1.3, г), получим из уравнения (1.9) при D - -1 с учетом соотношений Лд = -DIА ипг = -DI В: НФ: + ^--\=0 =>hyx + hxy-hJiy = Q=>F = ^iy hx -hxhy\. (1.16. д) hx hy Выбрав на прямой две точки а = \hx о], /> = |0 hy\, получим ее направляющий вектор V = b-a = [-hx hy] и координатные параметрические функции прямой в отрезках: ПФ: *(/) = hx( 1 - /), jit) = hyt. (1.16,5) 1.1.2. Взаимное положение графических элементов на плоскости Рассмотрим некоторые полезные формулы, тесты и алгоритмы, описывающие свойства и взаимное расположение точек, прямых и полигонов на плоскости. Для получения необходимых результатов активно используются тесты ортогональности и параллельности векторов, приведенные в перечне основных обозначений и соотношений. 1.1.2.1. Коллинеарность точек Три точкир,, р: up, коллинеарны, т. е. лежат на одной прямой (рис. 1.4, а), если 0. (1-17, а) Обобщение (1.17, а) на произвольное число точек р\ +рп: х\ х2 х3 Ух 1 Уг 1 Уъ ' = 0 или Pl-Pl P3~Pl rang Pi Pi Pn = 2 или rang Pi РЪ~ Pr,- ~P\ -P\ 'Pi = 1 (1.17,6)
Геометрические основы компьютерной графики 19 Точкар лежит на отрезке ab при нулевом угле между векторамир-а nb-р: (р-а)оф-р) = \р-а\-\Ь-р\. (118) Значение параметра /, соответствующее положению точки р-а+ф- a)t на прямой относительно ее отрезка ab, вычисляется с помощью скалярного произведения: (р-а)°ф-а) = ф-а)юф-а) = \Ь-а\2-1, откуда t_{p-a)o(b-a) (b-a)o(b-a) 1.1.2.2. Взаимное расположение прямых Лее прямые совпадают (рис. 1.4, б), если НФ: Fi х Fi = Оз; ПФ: = 0 П Р20~РЮ = 0 Лее прямые параплельны (рис. 1.4, в), если TV, НФ: N, = 0: ПФ: = 0. Расстояние между параллельными прямыми равно: Нф: d = |pr^ [p2Q - Pl0)\=\{p20 - Рю)° Ni\; d = ПФ: P20~ PlO = |/>20 _ P\Q ~ PrF, (P20 -Plo)\- Лее прямые ортогональны (рис. 1.4, г), если НФ: N\oNi = 0; ПФ: Vi о Vi = 0. (1.19) (1.20) (1.21) (1-22, я) (1.22,6) (1.23) 1.1.2.3. Взаимное расположение точки и прямой Уравнения перпендикуляра, опущенного из точки q = щх qy\ на прямую, заданную э НФ или ПФ (рис. 1.4, д), выглядят следующим образом: НФ: NJ&x-qJ-N:jy-q,) = 0=*N1=[Ny -NX],FX=[NX -N±oq]- (1.24, а) ПФ: p±(t) = q + NtunnpL(t) = q+ VLt,где VL = [vy -Vx]. 0-24,6)
20 Глава 1 Расстояние от точки q до прямой равно \qoF\ НФ: ПФ: d = N = |рглг(<?-/>о)| = |(<?-Ро)оЛф (1-25, я) d = q-_Po v = \q- pq-wv{ci- ро)\ = \я~ Ръ-iq- ро)оуЩ- (1.25,6) Зеркапьное отражение точки q от прямой лежит на перпендикуляре к прямой на расстоянии 2d от q в сторону, противоположную проекции вектора q-po на нормаль N (рис. 1.4, д): НФ: ПФ: g' = g-2pr„(fl-^)=9-2(k-A>o)oN)N; (1.26, а) q' = q~2(q-p0-pry(q-p0)) = 2p0-q-2((q-p0)ov)v . (1-26,6) Рис. 1.4 & Пример 1.1. Отразить треугольникр\ргрг с вершинами рх = [о о], р2 = [о \\ и /?з = & О] от прямой линии, проходящей через точки а = [з 0] и Ь = [2 2] (рис. 1.5). Решение. Находим направляющий вектор прямой V = b-a = [-\ 2J, по формуле (1.8) нормаль N = [2 \] и квадрат ее длины No N=5. Пусть ро = а, тогда по (1.26, а) последовательно для точек р\,р2 иръ вычисляем отраженные точки 2(д-с)°Л^,. А = А • №7V -TV: А: [=[0 0]-0.4([-3 0]о[2 l])[2 1]= [4.8 2.4],
> еометрические основы компьютерной графики 21 р'2=[0 l]-0.4([-3 l]o[2 1])[2 1]=[4 3], /?3=[2 0]-0.4([-1 0jo[2 l])[2 l]=[3.6 0.8]. □ Рис. 1.5 1.1.2.4. Построение прямой, наименее удаленной от совокупности точек Рассмотрим интересную задачу, связанную с понятием расстояния от точки до -трямой линии. Допустим, в R" (здесь при решении задачи на плоскости ху будем полагать п = 2) задано ш>2 произвольных точек р\ +р„. Сформируем из них матрицу Р = Pi Lrm eR nfx.n (1.27) Так как в общем случае точки не коллинеарны, то не существует ни одной прямой f{p) = 0, для которой все числа с/, =f(p!) обращаются в ноль. Другими словами, расстояния ЩI \N] от точек р, до прямой с нормалью N, вычисленные по (1.25, а) и пропорциональные dh не могут быть одновременно все нулевыми (рис. 1.6). 2 0 : : 1 : '--I to"3!-r~f IP.! Р4£ \ —afpyirr^ : ! f: \ ' i'' 2 ' —I 4— i/>3 ] 3 x Рис. 1.6
22 Глава 1 Построим аппроксимирующую прямую {ро, N}. наименее удаленную от совокупности точекph путем решения экстремальной задачи т JV, -»min . 1=1 С целью уменьшения неопределенности зададим ограничение \Щ - 1, поскольку ориентация прямой линии зависит лишь от направления, а не от длины вектора нормали. При выполнении данного ограничения числа rf, являются алгебраическими, т. е. со знаками, расстояниями от точек до прямой. Из пяти рассмотренных выше способов описания прямой линии выберем неявную форму (1.9) с вектором F = [N D\, имеющим минимальное число скалярных параметров, равное трем при п = 2. При таком выборе вектор d е R'" расстояний от точек до прямой принимает вид d = FPr = NPr + D [l ... l]. а квадрат его длины равен \d\2=ddr =(npt + d[\ ... l]) PNT +D NPyPNr +2D\ J>, Л NJ + mD2 = NPT PNT +2mD(N о c)+ mD2 где точка 1 m m (1.28) i=l есть геометрический центр массива точек /?,. Задача аппроксимации решается методом наименьших квадратов путем минимизации функции Лагранжа 3(/V,D,X)=|c/|2+A.f|/V|2-lj = = NPrPNT + 2mD(N ° с)+ mD2 + X[NNT -1). (1.29. я) Из условий ее экстремума 1 _ = /v/>TP + mDc + AiV = 0 _; 2 М - — = m(NoC)+mD = 0, — = NNr-l=0 2 3D V М (1.29,6)
'еометрические основы компьютерной графики 23 л свойства произведения скалярного произведения двух векторов на третий вектор \aob\c = a- \ртс) следует, что D = -NoC, N\PTP-mcrc + XE„)=On. (1-29, в) Сравнение выражений для коэффициента D в (1.29, в) и (1.13) убеждает, что все -рямые, доставляющие экстремум 3(N, D, X), проходят через точку ро - с. Второе соотношение в (1.29, в) представляет собой однородную систему линейных алгебраических уравнений относительно координат вектора N. Она имеет нетривиальное решение 7V* 0„ при нулевом определителе матрицы ХЕ„ - Л/, где M = mcrc-PTPeRnXn. (1.29, г) Следовательно, множитель Лагранжа X есть одно из п собственных чисел • значений), a JV— соответствующий ему нормированный собственный вектор матрицы М. Количество собственных значений квадратной матрицы равно ее размерности. В случае л = 2 симметричная матрица М имеет две действительные собственные пары {Я.1.М} и {Я.2, Ni], причем N\A-Ni при h * Хг [см. 9, 13, 32]. Это означает, что прямые, доставляющие экстремум функции 3(N, D, X), ортогональны. Вычисление собственных чисел и векторов матрицы — хорошо отработанная процедура вычислительной математики, например, в [10,27,32]. Слезет обратить внимание на нормирование собственных векторов в том случае, гели алгоритм их вычисления не делает эту операцию сам. Возникает закономерный вопрос: какой из полученных векторов N\ или Ni следует выбрать в качестве нормали искомой прямой? Ответ очевиден: тот, чья -рямая доставляет минимум функции Лагранжа (1.29, а). Ведь условия (1.29,6) _ают лишь экстремальные значения, которые при D = —N ° с и \N\ = 1 равны 3 = NPrPNr -m(N о cf = -NMNr = -XNNT = -X>0. Отсюда следует, во-первых, что все собственные числа матрицы М не положительны, во-вторых, что минимум функции Лагранжа доставляет собственная -ара {X, N} с максимальным значением Х = тг.х{Х\,Хг) и соответствующим ему лектором N— нормалью искомой прямой {с, N}. Для удобства построения найденной прямой линии можно перейти от ее нормальной формы (1.12, а) к параметрической форме (1.14, а) с вектором i=[-"y Nx]. Оставшаяся собственная пара матрицы М с минимальным собственным числом лает максимум функции Лагранжа и ортогональную (при Х\ * Хг) прямую (на гис. 1.6 она изображена пунктиром), пересекающуюся с оптимальной прямой в точке с. ^" Пример 1.2. Построить прямую линию, наименее отклоненную от точек -=[1 2], Р2=[2 1],рз = Ь l],P4 = [l 1]ий=[2 2] (см. рис. 1.6).
24 Глава Решение. Из заданных точек составим матрицу (1.27) и найдем их центр (1.28): Р = "1 2 3 1 2 2 1 1 1 2 РХ+Р2 + Р1 + Р4+Р5 _[[g ,4] 5 Вычислим по (1.29, г) матрицу Л/ и ее собственные параметры 1.8 г , I 'I 5 I z 1 l i 1 z М=5 1.8 1.4 12 3 12 2 1112 [1.8 1.4]- Я.,=_ЗД2 = -1, Л^,=[-0.949 0.31б], /V2=[0.316 0.949] 12 3 12 2 1112 -2.8 0.6 0.6 -1.2 Отделив максимальное значение к = Ъ, получим параметры неявной формы искомой прямой: N = [0.316 0.949], £>=-7Vof = -1.897. Таким образом, аппроксимирующая прямая описывается неявным уравнением 0.316л: + 0.949^ -1.897 = 0 или параметрическими функциями x(t) = 1.8 - 0.949/, yd) = 1.4 + 0.316/. Алгебраические расстояния от точек до этой прямой равны «"1=0.316. di = -0.316, Л = 0, Я4 = -0.632 и as = 0.632, а минимум функции Лагранжа составляет 3min = 1. Для сравнения на рис. 1.6 построена пунктирная прямая, соответствующая собственной паре {Xi,Ni}. Расстояния от нее до заданных точек равны d\ =0.949, Л = —0.316, di = -1.265, «4 = 0.632 и rfs = 0, а значение функции Лагранжа Зтах = 3 > 3min, что подтверждает правильность решения задачи. □ 1.1.2.5. Пересечение двух прямых Важнейшей задачей геометрии на плоскости является расчет точки о пересечения двух прямых (рис. 1.7, а), который в зависимости от формы их задания выполняется следующим образом: g[Nj Nj\=[pl0oN{ p20°W2]=> НФ: (1.30,0) =><7=ФюоЛГ1 Р20°^2]КТ Nj\ ;
Геометрические основы компьютерной графики 25 рю+ Viti=p2o+ Viti => \fi t2] = (/>20~ ПФ: Рю) =>q=pw+ Viti. Условия существования решений в (1.30) \N{ Nl |*0 или -У2 ф0 Ух -У2 (1.30,6) равносильны непараллельности прямых. Введем функцию вычисления угла между векторами VwW ang{y,w)=\f (Г d = V W *0: sgn(4 1 arccos ' V°W " (1.31) как угла кратчайшего вращения от Vk W. По свойству скалярного произведения векторов модуль угла равен arccos(p° W]е [0, л], а правильный знак определяется по ненулевому знаку определителя d матрицы, построенной на этих векторах. При d = 0 векторы Vw W линейно зависимы, а знак sgn(d) = 0 в (1.31) игнорируется. Это может быть в двух случаях: D при параллельности векторов угол между ними нулевой, a arccos(l) = 0; D при антипараллельности векторов угол между ними развернутый, а по (1.31) получим arccos(-l) = п. Таким образом, угол пересечения двух прямых находится с помощью функции (1.31) как у = ang(Ni, N2) или у = ang( V\, Vi). О -32) 1.1.2.6. Уравнения пучка прямых и биссектриса угла Уравнения пучка прямых, заключенных между двумя прямыми (рис. 1.7, б), выводятся следующим образом: НФ: ПФ: {h\p)=P° Рг pM=Pxo+Vxt (W) />2(')=/>20+ уг* />A+l(')=<7+*W; *От=0-А)Г1+АГ2. (1.33, а) (1.33,6) Изменение параметра пучка в интервале 0 < X < 1 дает такие промежуточные прямые, что вращение векторов N\+i и Vx+i происходит по кратчайшим углам от начальных положений Ni и Vi до конечных положений Ni и Vi. Уравнение U.33,6) можно также рассматривать как параметрическую (с параметром К) мо-
26 Глава 1 дель прямой линии, соединяющей точки исходных прямых pi = q+V\t и pi = q + F2/ при фиксированном значении параметра t. Рис. 1.7 На основе этой трактовки несложно и без вычисления углов решается задача построения дуги окружности радиуса г, заключенной в створе между векторами V\ и V2, выходящими из точки q (рис. 1.7,в). Точки дуги dx+\, соответствующие параметру X е [О, I], вычисляются по формуле в которой нормируемый вектор Vx+i находится по (1.33,6). Для изображения дуги в виде ломаной линии, состоящей из N отрезков между точками d\ и di, можно разбить диапазон изменения параметра X на /У равных интервалов (рис. 1.7, в построен при N - 5), сформировать набор значений Х = / / N V/ = О, N, рассчитать векторы Vx+i и точки дуги d^+\, после чего соединить эти точки отрезками прямых. Уравнения биссектрисы угла между двумя прямыми получим по уравнениям (1.33) с параметром X = 0.5 только при |М| = |jV:| или \Vi\ = \Уг\, т. е. когда треугольник с вершиной в точке q и сторонами V\ и Vi является равнобедренным, у которого биссектриса совпадает с медианой. В противном случае можно искусственно создать равнобедренный треугольник со сторонами \V-^V\ и \V\\Vi равной длины \V\\ ■ |Кг|. В результате параметры биссектрисы можно найти по формулам F6,,c = \N2\F, + \Ni[F2, рбис(/) = q + Vend, К6ис = ЩУ, + \V,\V2. (1.34)
Геометрические основы компьютерной графики 27 Расчет биссектрис бывает необходим, например, при построении окружности, вписанной в треугольник (рис. 1.7, г). Как известно, ее центр лежит в точке пересечения любых двух биссектрис внутренних углов этого треугольника. При построении биссектрисы внутреннего угла следует учитывать направления подставляемых в (1.34) векторов сторон треугольника: они должны либо оба выходить из вершины, либо оба в нее входить. При несоблюдении этого правила по (1.34) будет построена биссектриса дополнительного угла треугольника, а окружность окажется вневписанной. Итак, допустим, что вершины треугольника находятся в точках a, b и с. Вычислив векторы сторон V\=b-a, Vi = c-b, Уз = а-с, найдем по (1.34) направляющие векторы биссектрис двух внутренних углов В. = |Из|Fi -1V\\Уз, Bh = \V,\V2-\V2\Vi. Тогда центр вписанной окружности о лежит на пересечении параметрически заданных прямых {а, Ва) и {b, Bh) и может быть вычислен методом (1.30,6), а ее радиус г есть расстояние от точки о до прямой {a, Fi}, вычисляемое по (1.25, б). 1.1.2.7. Тесты свойств графических элементов на плоскости Рассмотрим вначале тесты, основанные на свойстве сепарабельности прямой f{p) - 0 разделять плоскость на два подпространства с противоположными знаками функции/(р). □ Тест ориентации точки р = [х у] относительно прямой заключается в проверке знака числа f{p), для вычисления которого в зависимости от способа задания прямой в разд. 1.1.1 используется соответствующая функция nf*, где "*" означает варьируемый третий символ "F', "N", "V" или "2" в имени функции: n/F(F,p)=p°F; (1.35, я) nfN(po,N,p) = (p-po)°N; (1.35,6) nfV{pQ,V,p) = nfl(a,b,p) = р-Ро V р-а b-a (1.35, в) (1.35, г) Все точки q справа от прямой, т. е. со стороны ее нормали, дают значения каждой из этих функций nf* > 0, а слева — nf* < 0. Для доказательства данного факта подставим, например, в функцию (1.35, б) точку q = po + Vt + XN, правую при X > 0 и векторе VI. 7У(рис. 1.8): nfN{po,N,q) = (Vt + XN) ° N = (V° N)i + Х(№ N) = 0 ■ t + X\N\2 > 0.
28 Глава 1 Рис. 1.8 Так как значение f(q) не зависит от коэффициента t, отсчитываемого вдоль направляющего вектора V, то линии постоянных уровней f(p) проходят параллельно прямой и также являются прямыми. Как следствие, получим расстояние от точки q до прямой, равное и совпадающее с (1.25, а). Ввиду простоты вычисления функция f(p), реализуемая на практике одной из функций nf* в (1.35), идеально подходит для сортировки точек относительно прямой линии на правые, левые и лежащие на ней. Тест ориентации точки относительно прямой применяется в алгоритмах, связанных с обработкой точек, вершин полигонов, а также во многих других задачах вычислительной геометрии. П Тест пересечения прямой линии f{p) = 0 с полигоном Р = {р,р2 ...р„р{}, имеющим произвольное направление обхода вершин, выполняется с помощью следующей функции: cross2{f, Р) = {3 1 <j<i<n :f{p) f{pj) < 0}. (1.36) Прямая пересекает полигон, если существует хотя бы одна пара вершин, лежащих от нее по разные стороны (рис. 1.9, а). Обсудим некоторые подходы к реализации теста в виде конкретного алгоритма, стремясь получить его наиболее эффективным в смысле минимальной трудоемкости. Следует ясно понимать, что нужно сравнивать положение относительно прямой линии не только смежных вершин полигона р, и />,+,, а всех различных пар вершин {phPj), т. к. прямая может, пересекая полигон только в вершинах, не пересечь ни одного ребра внутри (рис. 1.9, б). Свойство сепарабельности позволяет по разным знакам чисел /(р,) и/(р,) обнаружить вершины /з, и pj, лежащие по разные стороны от пересекающей полигон прямой. Если же не
еометрические основы компьютерной графики 29 найдется ни одной пары разносторонних вершин, то прямая и полигон не пересекаются. Число всех пар из п вершин полигона равно п (п + 1) / 2. Если решать задачу алгоритмизации теста (1.36) "в лоб" (с двумя вычислениями/^) для каждой пары вершин), то при больших значениях п (например, когда некоторая замкнутая кривая аппроксимируется полигоном с числом сторон порядка нескольких тысяч) трудоемкость теста будет пропорциональной л2, т. е. недопустимо большой. Уменьшения этой зависимости до линейной можно достичь с помощью специальных приемов. Рассмотрим некоторые из них: • во внешнем цикле / = 1, п вычисляем значения s, =f(p,)- Во внутреннем цикле 7 = 1,/-1 V/>1 анализируем знак произведения S/Sj (заметим, что число Sj =/(р;) уже вычислено). При S/Sj < О тест немедленно завершается, возвращая 1 — признак пересечения прямой с полигоном. После нормального окончания внешнего цикла алгоритм возвращает 0 — признак отсутствия пересечения либо касания прямой с полигоном; ( crossig Р)) г=/=е=0 —>«<^ /=1.. .п \-end г;<0^^)>->0^ С Возврат 1 J (Возврате-1 J Рис. 1.9
30 Глава 1 • в цикле /' = 1, и вычислим значения 5, =/(/>,), а затем сделаем сортировку вектора s. Результат тестирования возвращается числом res = sgn(si sn). При res = -1 крайние элементы s\ и s„ имеют разные знаки, что означает пересечение прямой с полигоном. По сравнению с предыдущим алгоритмом данный вариант теста способен различить касание (res = 0) и отсутствие пересечения прямой с полигоном (res = 1). В качестве недостатка отметим наличие операции сортировки, трудоемкость лучших методов которой оценивается зависимостью п ■ \og(n) < п2 [13, 24]; • наилучший, по мнению автора, алгоритм теста пересечения представлен блок-схемой на рис. 1.9, в и использует три флажка, сигнализирующих о наличии вершин полигона слева (флажок /), справа (флажок г) и точно на прямой (флажок е). Вначале все флажки сбрасываем в ноль. В цикле / = 1, п вычисляем значение s =/(/»,) и устанавливаем в единицу один из флажков: / при s < 0, е при s = 0 или г при s > 0. Тут же по условию / • г * 0 проверяем наличие любой пары вершин полигона по разные стороны от прямой. Если это условие выполняется, то тест немедленно завершается, возвращая 1 — признак пересечения прямой с полигоном. После нормального окончания цикла обхода вершин алгоритм возвращает значение е-\, равное 0 при касании или -1 при отсутствии пересечения прямой с полигоном. □ Тест выпуклости полигона Р= {pt ... рпр,}: conv2(P) = {sgn(w/2(/3,.,, #,/?,+,)) = const} V/ = 1, п, гдеро =p„,p„+t =р,- 0-37) У выпуклого (convex) полигона все углы Z/з, ,/з,/з,.+, одного знака. Другими словами, при обходе выпуклого полигона по замкнутому контуру в произвольном направлении каждая вершина /з,+, расположена относительно ребра /з,_. Pi одинаково для всех значений /: слева при положительном направлении обхода и справа при отрицательном (рис. 1.10, а). Благодаря свойству сепарабельности в процессе обхода невыпуклого полигона рано или поздно обязательно произойдет инверсия знака числа s = nf2.(piy,phpi+i) по сравнению со знаком числа c-nfl(pn,p\,pi) в начальной вершине /з,, как показано на рис. 1.10,6. Блок-схема теста выпуклости приведена на рис. 1.10, в. По сравнению с (1.37) алгоритм convl стал способен определять наличие у полигона развернутого угла при вершине/?, по нулевому значению п/2(р^,р„рм) = 0. Определенная блок-схемой функция convl возвращает I для выпуклого полигона, 0 для невыпуклого и -1 для полигона, имеющего хотя бы одну вершину с развернутым углом. □ Тест самопересечения полигона Р = {/>, ...p„pt}: где п > 3, af0 - nf2(phpi+l,Pj) — значение НФ (1.35, г) прямой отрезка /?,/?,+, в точке pj. Полигон является самопересекающейся замкнутой ломаной линией,
Геометрические основы компьютерной графики 31 если у него существует хотя бы одна пара пересекающихся отрезков. Два отрезка PiPi+i и PjPj+i пересекаются друг с другом, если концы одного находятся по разные стороны от прямой другого и наоборот. Интервалы изменения индексов i и j выбраны так, чтобы были протестированы все пары не смежных ребер полигона: • индекс I перебирается в интервале от 1 до п - 2; • при /' = 1 индексу перебирается в интервале от 3 до п — 1; • при i > 1 индексу перебирается в интервале от / + 2 до п. A-A.+I С conv2(P) ) n=size(P)-\ с=п/2{р„,р1,р2) >^ i=2...п \- end s=nf2(j>,_l,p„pM) ■>0 ( Возврат 1 J О—►Гвозврат-М ( Возврат О J Рис. 1.10 Функция self_test возвращает I при наличии самопересечения полигона и О при его отсутствии. Для того чтобы тест был способен обнаруживать не только "чистые" пересечения несмежных ребер, но и их касания, используемое в нем логическое условие должно быть записано немного сложнее: {/уДу+i <o}nfry,/y,/+1 <о}и{гу/и+1 <o}nfc,/y-,+, <о}.
32 Глава 1 1.1.2.8. Тесты ориентации точки относительно полигона Рассмотрим тесты ориентации точки q = [x у] относительно полигона Р= {p,...p„Pi). □ Выпуклый тест -1, если sgn(fj) = const V/ = 1, и; 1, если 31 < j < i < п: fjj < 0; (1.38) 0, если не ±1 convl _ test{q, Р) = определяет внутреннее положение точки qmy относительно выпуклого полигона при одинаковых знаках чисел/ = nf!{phpi+bqmy), вычисленных по (1.35, г) для всех ребер Pipi+I (рис. 1.11, а). Любую внешнюю точку qem тест обнаруживает по разным знакам чисел/ и fj, соответствующих ребрам p,w, и PjPj+i (рис. 1.11,6). Как и в тесте cross!, здесь также нужно сравнивать положение точки q не только относительно соседних ребер полигона p,pi+l и /э,+| А+2> а всех различных пар ребер PiP,+l и PjPj+l. Наконец, все точки, не идентифицированные как внутренние или внешние, считаются граничными точками gvp- Тесты cross! и conv!_test имеют много общего и фактически являются двойственными формами общего метода обработки точек и прямых на основе свойства сепарабельности прямой. Схожесть тестов наглядно иллюстрируется блок-схемой алгоритма conv!_test, изображенной на рис. 1.11, в. В соответствии со знаком числа 1, возвращаемым тестом для внешних точек, назовем внешнее подпространство полигона положительным. Внутреннее пространство полигона будем считать отрицательным согласно знаку возвращаемого значения -1. Все точки qvp на границе полигона (в вершинах или на ребрах) дают значение conv!_test(qrp, Р) = 0. Если тест (1.38) проводится в экранной системе координат, то все расчеты являются целочисленными и максимально быстрыми. ft v/V. *В1 Рг Рис. 1.11, а, б
еометрические основы компьютерной графики 33 ( convljest(q,P) J n=size(P}-\ r=l=e=0 ^ i-l...я Ъ-end — ( Возврат I J ( Возврат е-1 J Рис. 1.11, в 3 Габаритный тест gab!_test(q, Р)={х< pxmin }U {* > Pxmm } U U{v<P_ymin}u{v>p>,max} (1.39, a) определяет по возвращаемому значению gab2_test — l гарантированную непринадлежность точки q произвольному полигону Р путем сравнения ее координат с габаритами полигона— минимальными и максимальными координатами его вершин р, V/ = I, и: Pimm = min{/j,v},/7vmax = тах{р/Л.},/э,,тш = min{piy},рутЛх = max{piy}. (1.39, б) Полностью габаритный тест задачу ориентации не решает, возвращая значение 1 только для тех внешних точек ^вне, которые расположены вне габаритного прямоугольника (рис. 1.12, а). Результат gabljtest = 0 означает, что точка находится внутри габаритного прямоугольника, но не может быть однозначно идентифицирована как внешняя, внутренняя либо граничная. Тем не менее, благодаря своей простоте габаритный тест применяется во многих алгоритмах для быстрого обнаружения заведомо непересекающихся геометрических объектов, что освобождает от необходимости решения трудоемких задач внешнего и внутреннего отсечения.
34 Глава 1 Точечный тест (1.39) легко обобщается, как показано на рис. 1.12,6, на случай полигона Q - {qx ... q„, qx} с габаритными координатами qxwm = rnm{qix}, qxtnax = max{qix}, qfmin = min{#i:j,}, qytnia = max{qiy}: gab! _ poly(Q,P) = {qxmux < pxmin }U {qxm\n > pxmax }U ufc у max Pym'm и ymm >P у max }• (1.40) jxXXXXXXJBWsf'/Ay/,] Рис. 1.12 □ Угловой тест основан на вычислении и анализе алгебраической суммы углов б;= £{Vh VM) между смежными векторами V^pj-q, соединяющими точку q с вершинами ph при обходе произвольного полигона Р по замкнутому контуру в произвольном направлении. Тест основан на следующем опыте: наблюдатель, просматривающий вершины полигона из внутренней точки qBny, совершает вокруг себя полный оборот (рис. 1.13, а), а из любой внешней точки <7вне — ни одного оборота (рис. 1.13, б). Воспользуемся для вычисления угла между двумя векторами функцией ang, определенной в (1.31) и возвращающей радианную меру угла. Тогда при всех ненулевых векторах V: радианный вариант углового теста примет вид и ( 0 < Я => Овне И Р; В связи с неизбежными погрешностями, возникающими при суммировании углов, вычисляемых с помощью приближенной функции ang, в (1.41) нельзя сравнивать результат ни с нулем, ни с 2п: он всегда будет хоть на немного, но отличаться от этих чисел. Предлагается взять пороговое значение, равное п: оно ни при каких погрешностях не даст неверного результата тестирования. Граничная точка q^, обнаруживается по следующим признакам: • если при расчете векторов будет получен нулевой вектор длиной \V\ = 0, то тестируемая точка совпадает с вершиной р,;
Геометрические основы компьютерной графики 35 • если при расчете углов б, будет получен развернутый угол с модулем |8,J = п, то тестируемая точка лежит на ребре PiPi+i (рис. 1.13, б). Резюмируя сказанное, получим алгоритм rad_test{q, Р) радианного углового теста ориентации точки q относительно произвольного полигона Р (рис. 1.13, в). Поскольку для вычисления угла б, нужна лишь пара смежных векторов Vj и Vj+l, то при обходе вершин полигона можно вычислять текущий вектор V, а в конце цикла запоминать его в векторе W для использования в следующей итерации, экономя тем самым память компьютера. Алгоритм возвращает 1 для внешних точек, -1 для внутренних и 0 для граничных. (rad_test(q,P)J =8=0 i—w\^ i=\...size(P)-\ \— end —i I f Возврат Л РгЧ I ^sgn(7i-№y/ w=v s-s+di Ifl J>—o- b=ang(W,F) |бГ^>— n ->Гвозврэт 0 J Рис. 1.13 Ввиду важности места, занимаемого угловым тестом в задачах компьютерной графики, обсудим как явные, так и скрытые недостатки алгоритма rad_test: • необходимо нормировать все ненулевые векторы V,, что связано с операциями вычисления квадратного корня и деления, которые относятся к не-
36 Глава 1 целочисленным операциям с плавающей точкой, выполняющимся гораздо медленнее операций с целыми числами; вычисление угла в (1.31) тригонометрической функцией arccos производится путем суммирования бесконечного степенного ряда до сходимости по точности, предусмотренной компилятором используемого языка программирования. Этот итерационный процесс с плавающей точкой также не отличается высоким быстродействием; вычисления с плавающей точкой приводят к накоплению погрешностей при суммировании степенных рядов и углов в (1.41). В связи с этим обнаружение граничной точки q е p/pi+l с помощью сравнения |б,| = я на практике должно быть заменено условием | |5,| - 7Г | < Е, где е — экспериментально подобранная минимальная константа, надежно поглощающая ошибки округления; при малом е необходимо иметь число я с максимально возможной точностью, а не как обычно задают Р1= 3.1415926. Фактически это означает, что если константа я отсутствует в используемом языке программирования, то она должна вычисляться с машинной точностью. Для этого можно воспользоваться абсолютно, но медленно сходящимся степенным рядом k=o (-0* 2А+1 л. Модифицируем радианный угловой тест так, чтобы расчет углов 8, с высокой точностью стал не обязателен. Будем считать углы в целочисленных октантах. Руководствуясь неравенствами на рис. 1.14, сопоставим вектору V = [х у] октантный угол 1 < v < 8 и функцию вычисления октантного угла oct(V), возвращающую 0 при х = у - 0 и целое число ve {1, 2,..., 8} при \V\ ф 0. Как и в радианном тесте, получение нулевого значения v, = oct(p,-q) означает принадлежность точки q границе полигона в его вершине р, и немедленное завершение теста с возвращением нуля. У* -у<х<0 0<у<-х 3 4 5 х<у<0 о у<х<0 к 0<х<>> jf 2 /V sf 0<у<х 8 х 7 -х<у<0 0<х<-у Рис. 1.14
Геометрические основы компьютерной графики 37 При q Фр( V/ = 1, и вычислим приращения октантных углов Д, = vi+l - vt на переходах Pj->Pi+\. Для получения кратчайших угловых приращений необходима коррекция величин и знаков октантных углов с |А,| > 4: • если Д,-> 4, то Л, = Л, - 8; (1.42, а) • если Д, <-4, то Д, = Д, + 8; (1.42,6) • если А,, = ±4 и/= nf2(phpi+l,q) *0, то A, = -4sgn(/). (1.42, в) Поясним коррекцию в (1.42, в). Значение |Д,| = 4 возможно в трех случаях расположения точки q в окрестности ребра р,-р1+х, ПРИ которых угол Zptqpl+l близок к развернутому или равен ему: • точка находится точно на ребре/>,/>,+! (на границе полигона Р, рис. 1.15, я). Этот факт устанавливается проверкой/= 0 и завершает тест, возвращая 0; • при/> 0 точка лежит справа от отрезка/>,/>,+i> а Д; = -4 (рис. 1.15, б); • при / < 0 точка лежит слева от отрезка р, /7,+,, а Д, = 4 (рис. 1.15, в). Обозначим за oct_cor(q, а, Ь) функцию вычисления октантной меры угла Zaqb и его коррекции по (1.42). Тогда целочисленный октантный тест, аналогичный радианному тесту (1.41), принимает вид и Г о =>,7g р- Y oct coriq, Pi, pi+,) = •! ' (1.43) Й ~ \±**0=>qeP. V ' Точка q является внешней относительно полигона Р, если суммарный октантный угол поворота вектора V, при обходе вершин pt по замкнутому контуру равен нулю. Точка лежит внутри полигона, если этот угол ненулевой. Наконец, точка находится на границе полигона, если либо при oct(pt -q) = 0 она совпадает с вершиной/?,, либо при |Д,| = 4 и nf2(p,;pi+l, #) = 0 она лежит на ребре/7,/7,+1. Обозначим за oct_test{q, Р) функцию октантного углового теста ориентации точки q относительно плоского полигона Р = {р, ...рпрх), возвращающую -1 для точки внутри полигона, 1 — вне полигона и 0 — на его границе. Блок- схема октантного теста построена на рис. 1.15, в. Пунктиром выделена часть алгоритма, в которой происходит вычисление и коррекция приращения октантного угла по (1.42). Рис. 1.15, а, 6, в
38 Глава 1 ( oct_test{q,P) J s=A=0 -*St=l...size(P)-l \—end f Возврат Л U Возврат 0 ) Рис. 1.15, г & Пример 1.3. Определить ориентацию точек ^=[4.5 з], q2=\2.5 l] и <7з = [l-5 1.5] относительно невыпуклого полигона Р = {р\рг...р\} с вершинами p,=[l 2], р2=[2.5 0.5], р3 = [2 2.5], р4 = [4 0.5], р5 = [5 4], Рб = [3 З]и /77 = [1.5 4.5] (рис. 1.16). Решение. Для первой тестируемой точки ^] = fx-j j>t ] вычислим октантные углы векторов Vt = p(-q{ и их приращения: v, = 5, V2 = 6, ю = 5, V4 = 6, V5 = 2, V6 = 5, V7 = 4, и = v, = 5; А, = 1, Д2 = -1, Аз= 1, Д4 = -4, As = 3, Аб = -1,А?= 1. Без коррекции приращения угла на ребре p*ps сумма октантных приращений равна нулю, что не соответствует внутреннему положению точки. Подставив координаты точки qt в функцию прямой (1.35, г) ребра/74/75 nf2(p4,ps, q{) = 3.5х, -у, - 13.5 = -0.75 < 0, получим по (1.42, в) скорректированное значение А4 = 4 и скорректированную сумму s = 8. Согласно (1.43) точка qx лежит внутри полигона.
еометрические основы компьютерной графики 39 у\ 4 3 2 1 0 к Р\ Pi г~ / .-,..,. / fpi 4s / -—-St sfv } —4-*— v! x<4***" /~t'if 1 и \ i Щ 2 3 !p« A jPb \ y^l! ; 5 * Рис. 1.16 Для второй точки qi октантные углы и их приращения равны: v, = 4, V2 = 7, V3 = 3, V4 = 8, vs = 2, V6 = 2, w = 3, w = 4; Л, = 3, Д2 = -4, Дз = 5 = -3, Д4 = -6 = 2, Д5 = 0, Дб = 1, Д? = 1. Значение функции прямой для ребраргръ в точке qi nfl{pi,p-i, qi) = 2x2 + 0.5^2 - 5.25 = 7.75 > 0 положительно, поэтому Дг = -4, а сумма приращений октантных углов 5 = 0. Из (1.43) следует, что точка qi является внешней. Наконец, для точки qi на первом же ребре рхрг получим приращение октант- ного угла Д, = 8 - 4 = 4. Подставив координаты этой точки в функцию ребра Р\Рг nf2(pbp2, qi) = 1.5хз + 1 .5уъ - 4.5 = 0, заключаем, что точка #з принадлежит границе полигона. □ С помощью суммирования углов можно алгоритмически определить направление обхода вершин полигона. Установим граничную точку <7гР Р\+Рп в середине последнего ребра р„р{ и вычислим алгебраическую сумму углов вращения векторов Vt = А- <7п> при обходе вершин отр( до/?„ (см. рис. 1.13, б). Если общее направление обхода вершин полигона против часовой стрелки, то этот суммарный угол равен п [рад] или +4 октанта. При обходе вершин по часовой стрелке, т. е. в отрицательном направлении, знак суммарного угла отрицателен.
40 Глава ' Отсюда получаем два варианта теста dir_test(P) направления обхода вершин полигона Р - {рх ...р„рх), возвращающего знак направления обхода (1 — против часовой стрелки, либо -1 — по часовой стрелке): • радистный тест направления обхода (п-\ \ dir test(p)= sgn Jangip,:-<3Vp,p/+i -qrp) октантный тест направления обхода '«-1 dir_test{p)=sgn ^Orf_COr(^rp,/7j,jr?j+I) /=1 (1.44,0) (1.44.5) гораздо более эффективный, чем радианный тест, благодаря целочисленным и не итерационным вычислениям. □ Лучевой тест ориентации точки q относительно произвольного полигона Р заключается в выпускании из этой точки в произвольном направлении Глуча p(t) -q+ Vt Vt > О и подсчете числа его пересечений с ребрами полигона. Параметры пересечения луча с отрезками /»,- + (pi+i -р,)х VO<t< 1, непараллельными вектору V, находятся по следуемой из (1.30, б) формуле -1 [', *,]=(ft-qr) V Pi-P,+\ Vi = l,«. (1-45) Анализ параметрических пар {г„ т,} дает следующие критерии ориентации точки относительно полигона: • точка является внутренней, если число пар {/,-> 0,0 <т,-< 1} нечетно (рис. 1.17, а); • точка является внешней, если число таких пар четно, в том числе и равно нулю (рис. 1.17, б); • точка лежит на границе полигона, если найдется хотя бы одна пара {г, = 0,0<т,<1}(рис. 1.17,в). Особенности лучевого теста: • неопределенность числа пересечений при прохождении луча точно через вершину р, при т, = 1 или вершину /?1+| при т, = 0 (рис. 1.17, а, б). Необходимо повторить тест заново с другим направлением луча V; • требуется расчет по (1.45) (с плавающей точкой и вычислением обратной матрицы) параметров пересечений луча со всеми ребрами полигона. Обозначим за ray2_test(q, Р) функцию лучевого теста ориентации точки q относительно плоского полигона Р, возвращающую результат: • -1, если точка находится внутри полигона; • 0, если точка на границе полигона; • 1, если точка вне полигона.
Геометрические основы компьютерной графики 41 Блок-схема алгоритма лучевого теста приведена на рис. 1.17, г. Направление луча задается вектором V = [cos((p) sin((p)J единичной длины со случайным углом ф = rnd(2n), равномерно распределенным в интервале (0, 2п). Параллельность луча и /-го ребра р,рт устанавливается тестом (1.21) по нулевому значению определителя обращаемой в (1.45) матрицы. Расчет четности числа пересечений луча с ребрами полигона ведется с помощью флажка/, устанавливаемого сначала как для внешней точки в 1 и инвертируемого при каждом пересечении ребра лучом. В результате после завершения обхода полигона возвращаемое значение/автоматически будет равно 1 для внешней или -1 для внутренней точки. /=1, <p=rnd(2n) V=[cos(fp) sin(<p)] [l ThiPi-qW' Рис. 1.17
42 Глава " 1.1.2.9. Алгоритмы пересечения на плоскости П Перенесение отрезка прямой линии ab с отрезком cd. Когда в (1.30, б) ищется пересечение не бесконечных прямых, а их отрезков то кроме проверки непараллельности прямых необходимы дополнительные проверки 0 < г < I и 0 < т < 1 принадлежности точки их пересечения одновременно обоим отрезкам. Составим алгоритм расчета точки q и параметров t и: пересечения отрезков ab и cd, возвращающий признак пересечения: • -1, если прямые отрезков параллельны (не пересекаются) или совпадают (точка пересечения не определена); • 0, если непараллельные отрезки не пересекаются; • 1, если отрезки касаются или пересекаются. При непараллельности отрезков возвращаются значения параметров и точкг пересечения прямых, на которых лежат эти отрезки. При возвращении значения cross_segm = 1 эта точка одновременно является точкой пересечения отрезков. & cross_segm(ab, cd, t, т, q) V с — d если \М\ = 0, то возврат -1; [t х]={с-а)М~х; q = a+ Vt; возврат {0 </ <1}П{0 <т<1}; Максимальная трудоемкость алгоритма составляет 11 операций сложения/вычитания и 10 операций умножения/деления. Сравним эти затраты со вторым вариантом того же алгоритма, основанным на использовании неявных функций (1.35, г). { V-b~a, М = II матрица направляющих векторов // тест параллельности прямых // параметры пересечения прямых // точка пересечения прямых // тест пересечения отрезков & cross_segm{ab, cd, t, т, q) {fa = nfl(c, d, a), fh = nfl{c, d, b); fc = nfl(a, b, c), fa = nfl(a, b, d); если/с. =/,, то возврат -1; Ja *■ — Jc . t = T = - fa~fb fc~fd q = a + (b-a)t; возврат {fafb <0}r]{fcfd <0}; IIНФ точек а и b относительно cd II НФ точек с и d относительно ab II тест параллельности прямых // параметры пересечения прямых // точка пересечения прямых // тест пересечения отрезков
Геометрические основы компьютерной графики 43 Несмотря на кажущуюся простоту второго варианта, его трудоемкость вдвое выше— 41 арифметическая операция, в числе которых 27 сложений/вычитаний и 14 умножений/делений. Далее с именем cross_segm будем связывать более эффективный первый вариант функции расчета пересечения отрезков. 3 Пересечение отрезка ab с полигоном Р = {pt ... р„Р\). Требуется отсечь от отрезка те его части, которые находятся вне полигона (рис. 1.18, а). Здесь мы рассматриваем задачу внешнего отсечения отрезка выпуклым полигоном. Другие варианты отсечения обсуждаются в конце этой главы и в гл. 4. ( clip2_cross(ab,P) j *=0, У=Ь-а Si=\...size(P)-\^>—er\(i с = cross _segm(ab, р,- pl+t ,l,x,l) *=*+1,0.=1 ^^ Расчет [a,b] no табл. 1.1 <^K£>-o- f Возврат 1 J С Возврат 0 j Рис. 1.18 На рис. 1.18,6 построена блок-схема алгоритма clip2_cross{ab,P) отсечения отрезка ab выпуклым полигоном Р, основанного на расчете пересечений прямой {а, Ь}, несущей отрезок, с отрезками ptpm — сторонами полигона. Алгоритм возвращает через аргумент ab неотсеченный фрагмент отрезка внутри полигона, а сама функция clip2_cross возвращает признак видимости отрезка ab в "окне" полигона Р: • 0, если отрезок находится вне полигона и целиком им отсекается; • 1, если отрезок весь или частично расположен внутри полигона.
44 Глава 1 Работа алгоритма начинается с инициализации счетчика пересечений к = 0 и вычисления направляющего вектора отрезка V=b-a. Далее выполняется обход ребер полигона ppi+l Vi = 1, п и расчет пересечений с ними не самого отрезка ab, а несущей его прямой a + (b - d)t с помощью функции cross_segm. Если возвращаемое ею значение не отрицательно и прямая пересекает ребро (это обнаруживается по условию 0<т< 1), то счетчик пересечений к инкре- ментируется, а параметр / сохраняется в переменной ок. По достижении двух пересечений (к = 2) дальнейший обход выпуклого полигона прекращается. Концевые точки неотсеченного отрезка [я, Ь] рассчитываются с помощью табл. 1.1 в зависимости от значений ot = ?, и а2 = tj параметра /, при которых прямая пересекла ребра ptpl+l и PjPJ+l. Две ячейки {а, <0,а2> 1} и {а, > 1, а2 < 0} соответствуют внутреннему положению отрезка, при котором он не отсекается. В ячейках {а, < 0, а2 < 0} и {ot > 1, а2 > 1} формируются отрезки [а, а] и [b, Ь] нулевой длины, которые обрабатываются алгоритмом как полностью отсеченные с возвращением нуля. Остальные ячейки таблицы соответствуют частичному отсечению отрезка ab и стягиванию его внешних концевых точек на границу полигона — в точки a + VoK и а + Уог. Таблица 1.1 ^г-^ а,<0 0<а,<1 о, > 1 а2<0 [a, а] [а,а+ Vat] [a,b] 0<а2<1 [а, а + Va2) [а+ Vo,,a+ Vof] [a+Vaub] а2> 1 [a,b] [a+Voub] [b,b] Естественное завершение цикла обхода вершин полигона означает, что прямая отрезка ab либо касается полигона, либо не пересекает его вовсе (рис. 1.18, я). В обоих случаях алгоритм завершается возвращением нуля. Возможно и второе решение задачи отсечения отрезка полигоном на основе выпуклого теста ориентации точки (1.38). Оно представлено на рис. 1.19 блок-схемой алгоритма clip2_test{ab, Р) отсечения отрезка ab выпуклым полигоном Р = [р\ ...p„pt}, работающего следующим образом. &Шаг1. Инициализируем список L= {0, 1}, в который будем записывать значения параметра t е [0, 1] положения точек на прямой p(t)-a + (b-a)t. Начальный состав списка соответствует концевым точкам отрезка а =£>(0) и b=p(l). Шаг 2. Рассчитываем не более двух пересечений отрезка ab с отрезкамиPiPi+i, i= 1,2,... Значения параметра пересечения t добавляем в список L. Шаг 3. Сортируем список L по возрастанию, после чего точки qk = p(Lk) разбивают отрезок ab на непересекающиеся фрагменты общим числом не более трех.
Геометрические основы компьютерной графики 45 С clip2jest(ab,P) J k=Q, V=b-a,L=lO,l) L=sort(L) +\i=\...size(P)-\ N-end k=l...size(L)-\ V-end m=a+0.5(Lk+LkHy c=com>2_test{m, P) L^°-<C> ab={p+LkV,a+Lk+xV} ( Возврвт {c=-\) J Рис. 1.19 Шаг 4. С помощью выпуклого теста ориентации convljtest определяем внешнее либо внутреннее положение каждого фрагмента [qk, %+ii^0* относительно полигона по его средней точке (рис. 1.18, о) * 2 2 Внутренний фрагмент, удовлетворяющий условию conv2_test(mk, Р) = -1, возвращается через аргумент ab наряду с признаком отсечения clip2_test = 1. При отсутствии внутреннего фрагмента отрезок отсечен полигоном целиком, а возвращаемый признак отсечения равен нулю. СЗ Из-за наличия теста ориентации convljtest алгоритм clipl_test имеет ббльшую трудоемкость по сравнению с алгоритмом clip2__cross, но его идейная основа лучше приспособлена для решения других задач отсечения: • при внутреннем отсечении отрезка выпуклым полигоном (рис. 1.20, о) отбор неотсеченных фрагментов выполняется по условию их внешней ориентации conv2_test(mk, Р)= 1. Число таких фрагментов может быть от нуля (весь отрезок лежит внутри полигона) до двух (средняя часть отрезка экранируется полигоном); • при отсечении отрезка невыпуклым полигоном необходимо вместо выпуклого теста conv2_test использовать угловые rad_test, oct_lest или лучевой ray2_test тесты для определения ориентации средних точек фрагментов относительно произвольного полигона. При внешнем отсечении (рис. 1.20, б) отбираются фрагменты, средние точки которых лежат внутри полигона, а при внутреннем (рис. 1.20, в)— фрагменты со средними точками вне полигона.
46 Глава 1 Рис. 1.20 □ Пересечение полигона А = {а, ... а„ а,} с полигоном В = {bt ... b,„ bt}. Требуется найти общую часть полигонов, принадлежащую как А, так и В. т. е. их логическое произведение А &.В. Здесь мы рассматриваем пересечение только выпуклых полигонов. Логические операции с произвольными полигонами детально изучаются в гл. 4. Общие принципы расчета пересечения поясним на примере выпуклых полигонов Л = {л| а2сншах} иВ= {bt Ь2Ьъ Ь* Ьъ bt}, изображенных на рис. 1.21, я. • Сначала функцией clip2jtest(ajaj+uB) \/i = \,n выполняем внешнее отсечение ребер полигона А полигоном В, который в этой операции играет роль отсекателя. В результате получаем список отрезков Ls = {g, а2, а2 дъ gig*}. • Далее функцией clip2_test(bjbj+,, A) \/j = \,m выполняем внешнее отсечение ребер полигона В отсекателем А и добавляем в список Ls новые отрезки b\q2,q\q* и дзЬ,. • Из элементов полученного списка Ls = {g, а2, а2 дъ дъ д*, Ь, д2, дх д*, дъ *,} собираем замкнутый контур соединением отрезков друг с другом совпадающими концами. Берем первый отрезок д, аг, а среди оставшихся элементов списка Ls ищем отрезок, любой из концов которого совпадает с точкой а2. Этот отрезок а2 д2 образует с д, а2 цепочку С = {gt а2 д2}. Среди оставшихся элементов Ls находим продолжение цепочки — отрезок Ь, д2. После его присоединения к концу С точкой д2 цепочка принимает вид С = {gt а2 д2Ь,}. Продолжая процесс поиска и присоединения отрезков до полного исчерпания списка Ls, получим окончательный вид замкнутого контура С= {дха2д2Ьхдъд*дх}. Если полигоны А и В не пересекаются, то после обоюдного внешнего отсечения их ребер список Ls остается пустым, вследствие чего и результат операции А & В пуст.
еометрические основы компьютерной графики 47 ' А, '°2 :^ :*. 3 в Рис. 1.21 Аналогичным образом формируется объединение полигонов А + В (рис. 1.21, б). • Выполнив внутреннее отсечение ребер полигона /1 отсекателем В, получим список отрезков Ls = {a, q,, 92 "з, аз fl4, fl4 оз, q* а,}. • В результате внутреннего отсечения ребер полигона В отсекателем А дополняем список Ls отрезками q2 b2, b2 Ьз, Ьз qt, q* Ы, Ы Ьъ и Ьъ q$. • Из одиннадцати отрезков полученного списка Ls формируем замкнутый контур С = {a, <7i Ьз Ь2«2°зшqi Ьъ b*q4a,}. Если полигоны А а В не пересекаются, то их объединение состоит из двух фрагментов, при сборке которых нужно после присоединения очередного отрезка к имеющейся цепочке сравнить ее новый конец с началом. При совпадении этих точек первый фрагмент собран. Из оставшихся в списке Ls отрезков собираем второй замкнутый контур. Описанный метод сборки нескольких фрагментов из общего списка их ребер применяется при вычислении исключения А -, В полигона В из полигона А (рис. 1.21, в). • Выполнив внутреннее отсечение ребер полигона А отсекателем В, получим список отрезков Ls = {atqu q2 аз, аз а*, Я4 #3, #4 ах}. • Внешнее отсечение ребер полигона В отсекателем А дополняет список Ls отрезками £, q2, q, qa, и q3 bv • Из восьми отрезков полученного списка Ls - {a, q,, q2 аз, аз «4, «4 ?з, </4 a,, *i Яъ Ч\ Я^ (Р *i} собираем первый замкнутый контур С, = {а, #,?4а,}. Из пяти отрезков, оставшихся в списке Ls- {q2a3, азан, cuqi, btq2, <?з£|}, формируем второй фрагмент С2= {q2a3a4q3btq2}. « 94 <7з *>, о. А
48 Глава 1 Если весь полигон А лежит внутри полигона В, то первые два этапа отсечений дают пустой список Ls, вследствие чего и результат операции А -, В пуст. 1.1.2.10. Площадь и геометрический центр полигона Рассмотрим методы вычисления площади S и геометрического центра g полигона Р = {Р\ -РпР\}- П Простейшим полигоном является треугольник {abca} (рис. 1.22). Его площадь может быть найдена несколькими способами [13]: • расчет по формуле Герона Sb=Jh(h-\a-b\)(h-\b-c\){h-\c-a\), требует вычисления длин его сторон \а - b\, \Ь - с\, \с - а\ и полупериметра \a-b\ + \b-c\+\c-a\ 2 ценой четырех итерационных приближенных вычислений квадратного корня. Все эти затраты делают формулу Герона наименее эффективным инструментом расчета площади треугольника; • известная из тригонометрии формула SA = 0.5|* -а\-\с-а\- sin(Zbac), равносильная половине произведения длины стороны ab на длину высоты, опущенной на нее из вершины с, также включает приближенные вычисления длин векторов V= b-a, W=c-an синуса угла между ними; сравнение последнего выражения с нормой векторного произведения векторов Vy Oje ху и W - fVx Wy Oje ху позволяет записать его в виде /CLJ-'I 1VI 5д=0.5КхИ = 0.5 b-a с-а Рис. 1.22
"еометрические основы компьютерной графики 49 Введем функцию алгебраической площади треугольника {abca} b-a c-a a(a,b,c)=0.5 = 0.Snf2(fi,c,b), (1.46) сводящуюся к неитерационному вычислению с помощью функции л/2, определенной в (1.35, г), половины значения НФ вершины b относительно стороны ас. Знак алгебраической площади о(а, Ь, с) совпадает как с ориентацией точки b относительно прямой {а,с}, так и с направлением обхода вершин треугольника {abca}. Окончательное выражение площади треугольника принимает следующий вид: SA = \a{a,b,c)\. (1.47,0) Геометрический центр треугольника расположен в точке пересечения его медиан и делит каждую из них в отношении 2:1. Отсюда получаем 2(Ь+с } а+Ь+с е = а + —\ а = 3[ 2 J 3 (1-47,6) 3 Выпуклый полигон {pt ...p„pt} после разрезания диагоналями, проведенными из вершины pt (рис. 1.23), представляет собой объединение (л-2) непересекающихся треугольников {р\Р2рзР\} + [Р\Рп-\РпР\}-> площади которых S, и геометрические центры g, вычисляются по (1.47): si = Р\Р\ >PiPi+\ )\> Si = (1.48, я) Представляя совокупность треугольников системой точечных масс 5„ закрепленных в точках g, [15], получим площадь и геометрический центр выпуклого полигона: и-1 1=2 й (1.48,6) Рис.1.23
50 Глава 1 Площадь невыпуклого полигона можно вычислить по (1.48,6), выполнив его триангуляцию — разрезание на непересекающиеся треугольники (рис. 1.24, о). Задача триангуляции произвольного полигона достаточно сложна. Некоторые алгоритмы триангуляции рассматриваются в гл. 4. Между тем, после небольшой модификации метод (1.48) может работать и с невыпуклыми полигонами (рис. 1.24,6): 5 = и-1 1=2 и-1 £(/>! +Pi+Pi+\)°i ./=2 п-1 з2>,- /=2 , где а, = о(р,,Pi,pi+i). (1.49) Рис. 1.24 Знаки площадей а, треугольников {p\PiPi+\P\} совпадают с направлениями их обхода. Фрагменты треугольников, лежащие вне полигона, суммируются в (1.49) с противоположными знаками четное число раз, в результате чего их площади взаимно сокращаются. Фрагменты треугольников внутри полигона суммируются с противоположными знаками нечетное число раз. Таким образом, алгебраическая площадь полигона включает площади только внутренних фрагментов и только однократно. Геометрический центр полигона также является взвешенной алгебраической суммой центров треугольников с учетом знаков их площадей. Знак алгебраической площади полигона совпадает с общим направлением обхода его вершин. Вот мы и получили самый быстрый тест направления обхода полигона dir_test(p)= sgn (п-\ Л 2jnf2(p\,Pi+\,Pi) (1.50) имеющий трудоемкость 8л- 15 арифметических операций. По эффективности тест (1.50) даст сто очков вперед полученным в (1.44) радианному и октант- ному тестам направления обхода полигона.
Геометрические основы компьютерной графики 51 1.1.2.11. Алгоритмы генерирования случайных полигонов 3 процессе создания и отладки алгоритмов компьютерной графики необходимы образцы различных графических объектов, служащие исходными данными для моделирования. Принципиально различаются два типа данных: 3 задаваемые вручную и позволяющие добиться верного решения задачи при заранее известном ответе. Сложность ручного задания заключается в искусстве заранее предвидеть все нюансы задачи, поставить нужные цифры в нужное место так, чтобы за минимальное число испытаний пройти по всем ветвям алгоритма и добиться его правильной работы; 3 задаваемые случайно и позволяющие увеличить объем и статистическую достоверность работы алгоритма. При большом числе испытаний со случайными исходными данными и хорошо продуманной системой диагностики рано или поздно должны быть обнаружены все имеющиеся в алгоритме ошибки вычислительного характера. Нмея в распоряжении функцию rnd(x)— генератор равномерно распределенных случайных чисел (РРСЧ) в интервале (0, х), можно построить генераторы других -ипов случайных равномерно распределенных данных: 3 а + md(b -а) — генератор РРСЧ в интервале (а, Ь); 3 [n + rndim +1 -п)\ — генератор целых РРСЧ в интервале [и, /и]; 3 Vt = а + rnd(b - а) V/ = 1, и — генератор случайного вектора V е R", элементы которого есть РРСЧ в интервале (а, Ь); 3 K = [cos((p) sin((p)J — генератор единичного вектора на плоскости со случайным углом направления ф = rnd(2n); 3 K = [sin((p)sin(\|/) cos(\|/) cos((p)sin(\j/)] — генератор единичного вектора в трехмерном пространстве со случайными углами места ф = rnd(2n) и азимута у = rnd(n) (см. рис. 1.1,6). Разработаем два алгоритма генерирования случайных полигонов — системы слу- ■шшного количества (не менее трех) случайных точек на плоскости, последова- -ельно соединенных друг с другом не пересекающейся замкнутой ломаной линией со случайным направлением обхода вершин. 3 Случайный произвольный полигон строится следующим методом (рис. 1.25, а). ZD Шаг 1. Из заданной точки Т как из центра проводим лучи под углами 0° < ф < 360° к оси х. Начальное значение угла ф, = 0°, а последующие углы рассчитываем путем приращения Фл-Н = Фл + Афл на случайные значения Дф„ = rnd{&). Максимальное приращение углов 120° < 0 < 180° выбираем с таким расчетом, чтобы минимальное число лучей было равно трем.
52 Глава 1 Шаг 2. Вдоль лучей откладываем расстояния rn = a + rnd(b - а), генерируемые как РРСЧ в интервале (а, Ь). Таким образом, получаем вершины полигона Pn=T+r„[cos((p„) sin((p„)],«= 1,2,... Шаг 3. Генерируем РРСЧ d = rnd(2), равновероятно принадлежащее как интервалу (0, 1), так и интервалу [1, 2). При d> 1 нумеруем вершины полигона Р в обратном порядке. Шаг 4. Возврат Р. СЗ Воплощая описанный метод в алгоритм, получаем функцию rpoly(T,a,b,@) генерирования случайного произвольного полигона (рис. 1.25, б). Рис. 1.25 Автором проведен статистический анализ числа сторон генерируемых полигонов в зависимости от параметра 0 е {90°, 120°, 150°, 180°} на выборке в 10 000 испытаний. Процентное соотношение л-угольников приведено на рис. 1.26. Соотношение положительного и отрицательного направлений обхода оказалось очень близким к 1 : 1. П Случайный выпуклый полигон строится следующим методом (рис. 1.27, а). £D Шаг 1. Размещаем первую вершину полигона /?, в исходной точке Г и задаем начальный угол ф, = 0°. Очередную вершину p„+i, п- 1,2,... получаем путем проведения из предыдущей вершины рЛ луча под углом Фл+| = Ф„ + Дф„
еометрические основы компьютерной графики 53 со случайным приращением Аф„ = rnd(@) и откладывания вдоль этого луча расстояния г„ = a + rnd(b - a), генерируемого как РРСЧ в интервале (a, Ь). Максимальное приращение углов 90° < 0 < 180° выбираем с таким расчетом, чтобы минимальное число лучей было равно трем. 40 30 20 10 0 Т' I II 4 5 6 7 8 9 10 11 Число сторон произвольного полигона 12 ■% О 90 ■ 120 □ 150 ■ 180 Рис. 1.26 Шаг 2. Полученную точку <l = Pn + rn[cosM sin(<P«)] тестируем, начиная со значения n = 2, на пригодность быть вершиной выпуклого полигона, т. е. на попадание в заштрихованную область. Точка q должна, во-первых, лежать левее прямой {Т,р2}, во-вторых,— правее прямой {р„, 7}. Только при одновременном выполнении этих условий сохраняем точку q как очередную вершину полигона/?л+|. Шаг 3. По окончании цикла генерируем РРСЧ d = rnd(2), равновероятно принадлежащее как интервалу (О, I), так и интервалу [I, 2). При d> I переставляем вершины полигона Ръ обратном порядке. Шаг 4. Возврат Р. О Воплощая описанный метод в алгоритм, получаем функцию rcpoly{T, а, Ъ, 0) генерирования случайного выпуклого полигона (рис. 1.27, б). Гистограммы числа сторон генерируемых полигонов в зависимости от параметра © е {90°, 120°, 150°, 180°} на выборке в 10 000 испытаний приведены на рис. 1.28. Соотношение положительных и отрицательных направлений обхода оказалось практически равным.
54 Глава 1 (rcpoly(T,a,b,&)^) п=0, (р=0°, q=T n=n+\,p„=q r=a+rnd(b-a) <l=P„+rtcos(is>) sin(q>)] Рис. 1.27 20 10 0 к-ъ* ~ч \ . I Г- - - :i 4 5 6 7 8 9 10 11 Число сторон выпуклого полигона Рис.1.28 12 □ 90 ■ 120 □ 150 ■ 180 1.1.3. Квадратичные и параметрические кривые Кривые второго порядка (квадратичные кривые) на плоскости описываются координатным уравнением в НФ f(x, у) = Ах2 + By2 + 2Еху + 2Gx + 2Jy + D = 0 (1.51, a)
Геометрические основы компьютерной графини 55 или в векторном виде f(p)=pFpT = 0, r№F = А Е G Е \G В | J J | D = ^11 F2\ F2] D . ^11 - ^11 • (1.51,6) Вектор нормали к кривой в точкеро е/(р) вычисляется по (1.7, а) путем дифференцирования (1.51): N=2[x0 у0 1] А Е Е В G J = 2[р0 1] F2l = 2(P0FU+F2l)- Для любой квадратичной кривой три величины Il=A+B,I1 = \FU\ = АВ-Е?, /з = |*1 (1.52) (1.53, а) называются инвариантами, не изменяющими значения относительно невырожденных преобразований переноса и вращения, изучаемых в гл. 2. Число /; = A G G D + В ./ J D = IXD-GA-J* (1.53,6) есть полуинвариант относительно преобразования вращения. Знание легко вычисляемых инвариантов и полуинварианта позволяет быстро определить тип и каноническое уравнение кривой по уравнениям (1.51) и табл. 1.2. Таблица 1.2 ^^^-~~~^ь h ^^^ Центральные кривые с /2*0 /2*0 /2 *о Невырожденные кривые с/з*0 £<п h ^0 /l Действительный эллипс {- {aj 4*1 l*J 2 -1 = 0 Мнимый эллипс / \2 ' ^2 - Ц)+- Гипербола ( V 1 2-и 2 -1 = 0 Вырожденные кривые с/з = 0 Точка вырожденного эллипса (- (", 4f К 2 = 0 Две асимптоты вырожденной f£) {") гипербс 2-И UJ ЛЫ 2 = 0
56 Глава 1 Таблица 1.2 (окончание) ^^^^^/з Нецентральные кривые с /2 = 0 Невырожденные кривые с/з*0 Парабола Вырожденные кривые с/з = 0 /2<о /2=о /2>0 Две параллельные прямые fxf - -1 = 0 [a) Мнимая прямая Г* У - +1=0 Уа) Одна двойная прямая (х\2 - +1=0 Неявная форма непригодна для построения кривых и используется для анализа их свойств по инвариантам и расчета пересечений. Исключением являются редкие случаи функций, явно выраженных через одну из координат. Рассмотрим взаимное расположение квадратичной кривой и прямой линии. Подставим параметрическое уравнение прямой p(t) - q+ Vt в неявное векторное уравнение (1.51, б): [q + Vt 1] [q + Vt l]T=0 ^11 F2\ |F21 D => (^ + Vt)FX](q + Vt)T+ 2(q + ^)/¾ + D = 0. Раскрыв скобки, получим квадратное уравнение at1 + 2Ы + с = Ъ с коэффициентами a = VFuVT, b = (qFu+F2]yT, с = qFuqT +2qF^ + D. В зависимости от их значений и дискриминанта d = Ь1 - ас (1.54) (1.55, о) (1.55,6) (1.55, в)
Геометрические основы компьютерной графики 57 возможны следующие решения задачи пересечения прямой с квадратичной кривой (рис. 1.29): 3 при {а*0}Л{£/>0} прямая (1) пересекает кривую в двух различных точках Р\= q+ Vt, и р2 = q + Vt2c параметрами -b-jd -b+jd 4= <i2= ; (1.56,a) a a □ при прямая (2) касается кривой в единственной точке pt = q + Vtt с параметром _-Ъ '1- —' (1.56,6) TS при {д = 0}П{Ь^О} прямая (3) пересекает кривую в единственной точке Р\= q+ Vtt с параметром '1 = ^; (1-56, в) 3 при {а = О/Л {б = 0}П {с = О} прямая касается вырожденной нецентральной кривой (прямой линии) в бесконечном множестве точек; 3 в остальных случаях прямая (4) не имеет с кривой ни одной общей точки. Рис. 1.29 Параметрическая форма как самая гибкая и универсальная наиболее распространена для описания и построения геометрических объектов благодаря разнообразию выбора функций, задающих движение точки по направлениям ее степеней свободы. Параметрическая функция p(t) квадратичной кривой может быть получена следующими способами.
58 Глава 1 О Заменой аргументов л: и у канонического уравнения из табл. 1.2 функциями одного параметра (например, /) на основе известных тождеств cos2(0 + sin2(0 = 1, ch2(/) - sh2(0 = 1. Простейший пример— окружность единичного радиуса. Ее каноническое уравнение л2 + у2 - 1 = 0 допускает подстановку x(t) = sin(0, y{t) = cos(/). О Суперпозицией одновременных движений точки вдоль координатных осей из заданного начального положения. Например, сложение гармонических колебаний по осям координат л(0 = cos(f), y(t) — sin(;), записываемое в векторной форме как c(t)= cos(t)x° + sin(t)y° = [cos(/) sin(/)] VO < t < 2n , (1-57) дает вращение точки по окружности единичного радиуса из начального положения х(0) = 1, у(0) = 0 (рис. 1.30, а). Направление вычисленного по (1.7,6) вектора скорости K(f)=[-sin(f) cos(/)]±c(f) ортогонально влево от вектора c(t) соответствует вращению точки против часовой стрелки. Вращательное движение является основой для построения более сложных трансцендентных кривых: фигур Лиссажу, спиральных, циклических и полярных. П Фигуры Лиссажу образуются суперпозицией разночастотных колебаний вдоль ортов СК: x(t) - cos(cov0, y(t) = sin(oy) или /?(/)= Icos^fjsi^ttyjj. На рис. 1.30, б изображена такая фигура, построенная при cov = 4, со, = 7 в интервале изменения параметра / е [0, 2л]. Рис.1.30
Геометрические основы компьютерной графики 59 3 Спиральные кривые описываются моделью p(t) = r(t)c(t) и образуются вращением точки по дуге монотонно изменяющегося радиуса r(t). Примеры: • спираль Архимеда (рис. 1.31, а) имеет равномерно увеличивающийся радиус /■(0 = го +г,/; • спираль Бернулли (рис. 1.31,6) образуется при экспоненциально изменяющемся радиусе /•(/) = r0er,t; • радиус параболической спирали, изображенной на рис. 1.31, в, описывается зависимостью r{f) -rQ + rt Vf. Параметры го = г(0) и г, задают начальный радиус и характеристику его изменения за один оборот спирали, т. е. за приращение t на 2п. Рис. 1.31 П Простейшие циклические кривые описываются векторной параметрической функцией р(.0=М0 + гф>0, (1-58) где pu(t) — траектория переносного движения центра окружности радиуса г, по которой одновременно вращается точка с угловой скоростью to. На рис. 1.32, а изображена циклическая кривая при pu(t) = 3c(t), г = 2, to = 3.5 и / е [0, 4п]. П Многие известные трансцендентные кривые [8, 13] задаются полярной функцией г(ф). После подстановки t = ф, x(t) = r{t)cos{t), y(t) = r(0sin(0 получим параметрическую функцию кривой p(i) = r(t)c(t). Например: • улитка Паскаля (рис. 1.32,6) описывается следующими соотношениями в неявной, полярной и параметрической формах: (х2 + у2 - ах)2 - Ь\х2 + у2) = 0, г(ф) = а ■ соб(ф) + Ь, p(t) = (а ■ соб(ф) + b)c(t);
60 Глава 1 трисектриса (рис. 1.32, в) описывается соотношениями х\х ~а + b) + у2(х + Ь)-0, >-(ф)= acos((p)- ( Ь Л гл, p(t)= acos(0-—77\ cos(<p) ^ c°sy/, :(,). 1 i-З i т 1" ! л=1 \ -з! с/ i 1 1 V Jf3 £ i i i -з ■""!" Рис. 1.32 1.2. Графические элементы в пространстве Точка в пространстве имеет три степени свободы. Расстояние \р1-рг\ между двумя точкамир\ ирг в разных системах координат вычисляется следующим образом: П в декартовой СК d = ^{xi-x2f + {yi-y2f + (zl-z2f ; П в цилиндрической СК d = VP? + Р2 - 2PlP2 cos(<Pl ~ Ф2 )+ {у\ - У2 У ". О в сферической СК d = VI2 +¾2 -2r1r2(sin(vi)sin(v2)+cos(vi)cos(v2)cos(9i -<Р2))+(у1 -½)2 • Поверхность имеет две степени свободы. Уравнения поверхности в неявной и параметрической формах имеют следующий вид: НФ: f(x,y,z) = 0 или/(/?) = 0; (1.59, о) ПФ: p(t,r)=[x(t,x) y(t,x) z(/,t)]. (1.59,6)
Геометрические основы компьютерной графики 61 Любая реальная поверхность ограничена в пространстве либо в силу своей замкнутости (например, сфера, эллипсоид или тор), либо благодаря системе неравенств, наложенных на ее координаты или параметры: НФ: V(x, у, z) > 0 или v(p) ^ 0; (160, а) ПФ: v(/,t)>0. (1.60,6) Особенность ограниченной поверхности в том, что при расчете ее пересечения с другим графическим объектом могут быть получены точки или линии, лежащие на поверхности (1.59), но не удовлетворяющие условиям (1.60). Следовательно, результат пересечения должен всегда тестироваться по всем необходимым условиям существования. В регулярной точке поверхности ро=[х0 Jo zo\= р(1о>хо) функция p(t, т) непрерывно дифференцируема по своим аргументам и обладает свойством [13] *0. xt У1 *т Ух 2 + / yt Ух / ч zx 2 + zt zx t X, хх д(х,у)/д(1,х) d(z,x)/d(t,x) Точки поверхности, в которых частные производные д(х,у) d(y,z) d(z,x) Э(/,т) ' Э(/,т) ' Э(г,т) равны нулю или не существуют, называются особыми. Эти точки образуют ребра (линии самопересечения поверхности или пересечения двух поверхностей) и вершины (точки пересечения трех поверхностей), где производные не определены. В регулярной точке поверхности ро существует единственная касательная плоскость (рис. 1.33), описываемая координатными и векторными уравнениями в неявной и параметрической формах: 4ч Nf W Ло X Рис.1.33
62 Глава 1 НФ: ПФ: 'Nx{pc-xQ]+Ny{y-yo)+Ng(z-z0)=0 \№(р-р0)=0 Nx=fl y„,Ny=f'y\ , Nz=fl / V=V/(p)| ; (L61,fl) ,хОьУО'го r>x0,y0,z0 'Хо>УО'г1 I fo ,хО'УО'го x(t,t)= x0 + Vxt + Wxx,Vx = x',\po, Wx = x'x\po y(t>*)=yo+f,ryt+fVyT:,Vy=y;\po,ttx=y'x\po, z(t, x)= z0 + Vzt + Wzx, Vz = z't\ , Wz = .< 'A> ■A) И = Л|Л, ^ = Чо; (1-61'° FxW*03. Вектор нормали N = [л^ N Nz J направлен в ту сторону поверхности, где /(/?) > 0. Направляющие векторы V LN и W± TV должны быть непараллельны. Они составляют с нормалью N = VxW = r v z wy W, vz ух wt wx vx Vy' wx wy (1.62) правую тройку векторов. Это означает, что вращения V—> W, W-* N и N-* V происходят в положительном направлении, т. е. против часовой стрелки с точки зрения наблюдателя, находящегося на конце третьего свободного вектора. 1.2.1. Модели плоскости в пространстве Рассмотрим способы задания плоскости в различных формах. 1.2.1.1. Неявное уравнение плоскости Неявное уравнение плоскости задается четырьмя коэффициентами А, В, С и D, составляющими вектор F = [А В С D\: НФ: Ах: + By + Cz + D = 0 или [р \]oF = poF = 0. О-63) Хотя бы одно из чисел А, В или С должно быть ненулевым. Если все коэффициенты А ф 0, Вф 0 и Сф 0, то плоскость проходит наклонно ко всем осям координат, пересекаясь с ними в точках (рис. 1.34, а) hr = , И., = , Л_ = . х А у В * С Но, например, при А = 0, ВфО и СфО уравнение By + Cz + D - 0 описывает плоскость, параллельную оси х и ортогональную координатной плоскости ух; при А ф0, В = 0 и С = 0 уравнению Ах + D = 0 соответствует плоскость, ортогональная оси а" и параллельная плоскости уг. Плоскость f{p)=poF = 0 проходит через начало координат при/(Оз) = D = 0. Благодаря ее свойству разделять пространство на два подпространства с проти-
Геометрические основы компьютерной графики 63 воположными знаками /(/?), неявное уравнение позволяет с минимальными вычислительными затратами — за три умножения и три сложения — определить по >».ловию/(<7) = 0 принадлежность плоскости произвольной точки q, а также ориентацию двух точек аиЬ относительно плоскости: 3 при/(а) f(b) > О эти точки лежат по одну сторону от плоскости; 73 при/(а) /(b) < О — по разные стороны от плоскости. Для перехода от неявного описания плоскости к следующему нормальному описанию необходимо найти любую ее точку ро и вектор нормали N. Сравнивая (1.63) с (1.61, а), заключаем, что координатами вектора нормали можно принять коэффициенты неявного уравнения А, В и С: n = [a в с]. Приведем два способа получения точки р0 = [х0 уо z0]. 1. Выберем ее в месте пересечения плоскости с осью координат, соответствующей ненулевому коэффициенту в (1.63): ( г ^ п / p0 = \f А: -D А О О if В: О -D J 0 в J 0 0 -П С (1.64, а) Несмотря на легкость понимания, этот способ не самый лучший для программирования из-за наличия альтернативы выбора точки в зависимости от коэффициентов А и В. Вычислим ближайшую к началу координат точку ро путем решения МНК- задачи \р\2 -р °р-> min с ограничением ро N + D = 0. Аналогично (1.10,6) решение имеет вид Ро = -D №N ■N = -D А2+В2+С2 [А В с]. (1.64,6) 1.2.1.2. Нормальное уравнение плоскости Нормальное уравнение плоскости {ро, N}, заданной точкой ро и вектором нормали .V, совпадает с (1.12, я) и выводится из условия ортогональности векторов N и d -ро для всех точекр, принадлежащих плоскости (рис. 1.34, б): НФ: Njx - хо) + Ny(y - уо) + Nz(z - го) = 0 или (р - р0) ° N = 0. (1 -65) Зависимость вектора неявного уравнения от параметров нормального уравнения совпадает с (1.13): F = [N-p0oN\. (1-66) С помощью функции fip) = ip-po)°N (1-67)
64 Глава 1 можно определить ориентацию точки р относительно плоскости: О при /(a) > 0 точка а лежит в том полупространстве, куда направлена нормаль, а угол Z(a-po, N) острый; П при/(Л) < 0 угол Z(b -ро, N) тупой, а точка b и нормаль находятся по разные стороны от плоскости. Рис. 1.34 Таким образом, плоскость является двусторонней границей, разделяющей пространство R3 на положительное и отрицательное полупространства в соответствии со знаком функции/(р). Назовем сторону плоскости, обращенную в положительное полупространство, лицевой, а обратную сторону — нелицевой. 1.2.1.3. Параметрическая функция плоскости Параметрическая функция плоскости {ро, V, W}, заданной точкой ро и направлениями линейно независимых векторов Уч ^(рис. 1.35, о), имеет следующий вид: x(t,z) = xq+ Vxt + Wxx; ПФ: ■ y(t,z) = y0+Vyt + WyT или p(t,i) = p0 + Vt + W%; С-68) z(t,z) = z0+Vzt+WzT. Условие линейной независимости направляющих векторов эквивалентно условию их непараллельности V у. W* Оз. Параметрическая форма удобна для задания как всей бесконечной плоскости, так и ее полубесконечных и конечных частей. Для этого в (1.68) задаются соответствующие интервалы изменения параметров t и т. Например: О бесконечные интервалы -оо < t < оо и -оо<т<оо не ограничивают протяженность бесконечной во всех направлениях плоскости; П задание бесконечного -оо < t < <х> и полубесконечного т > О интервалов определяет полуплоскость, находящуюся от прямой ро + Vt по одну сторону с вектором W;
Геометрические основы компьютерной графики 65 3 бесконечный -оо < t < оо и конечный 0 < т < 1 интервалы задают полосу шириной \Щ, протяженную вдоль вектора V; 3 конечные интервалы 0<f<l и 0<т<1 определяют параллелограмм между четырьмя точками ро,ро+ V,po+ Wapo+ V+ W; TS конечные интервалы 0 < / < 1 иО<т<( дают треугольник с вершинами в точках ро,ро + Уиро+ V+ W. Переход от параметрического описания плоскости {ро, V, W) к нормальному po,N} и неявному {F) описаниям заключается в вычислении по (1.62) вектора нормали N, а по (1.66) — вектора F: N=VxW, F = [N -po°N]. (1.69) Ортогональность векторного произведения Fx W к векторам-сомножителям позволяет использовать его в качестве нормали. Эквивалентная (1.67) функция f(p) = (p-po)°(V* Щ (170) определяет ориентацию точкир относительно плоскости {ро, V, W): 3 при /(а) > 0 точка а лежит в положительном полупространстве, откуда вращение от вектора Р^до вектора W выглядит положительным (против часовой стрелки). При этом угол /.(а -ро, N) острый; ^ при/ф) < 0 угол Z.(Jb -ро, N) тупой, а точка Ь находится в отрицательном полупространстве (с нелицевой стороны плоскости). Более сложной является неоднозначная обратная задача выбора подходящих направляющих векторов на основе единственного вектора нормали (рис. 1.35,6). Выберем произвольный вектор Н, не параллельный N, например, любой из координатных ортов bf#N, где со е {х,у}, и по свойству ортогональности векторов в векторном произведении получим желаемое решение: H = m{n\\x°: у0, х°), F=#x/V*Oj, W=N*V*Oi. (1.71) Рис. 1.35
66 Глава 1 1.2.1.4. Уравнения плоскости, проходящей через три точки Неявная форма уравнения плоскости, проходящей через три точки a, b и с (рис. 1.36, а), выводится из условия принадлежности плоскости этих точек и точки р = [х у): НФ: р ь с = 0=> °У Ьу Су а. I bz I с, I х + az bz с. ах l bx l cx l У + ux bx Cx ay l by l cy l z + az bz Cz «X bx cx ay by СУ = 0. (l.72,c) Nr N.. N. Выбрав направляющие векторы плоскости V-b-av\ W-c-b, получим параметрическую модель плоскости, проходящей через три точки: ПФ: p(t) = a + (b-a)t+(c-b)x. (1.72,6) Условие существования плоскости следующее: \N\ * 0 или (Ь - а) х (с - Ь) * Оз. Это означает, что три точки не должны лежать на одной прямой. Эквивалентная (1.70) функция f{p) = {p-a)o((b-a)x(c-b)) (1-73) позволяет вычислить ориентацию точки р относительно плоскости {а, Ь, с}. При f{p) > 0 точка р лежит в положительном полупространстве, откуда обход треугольника {abca} выполняется против часовой стрелки. Ниже рассматриваются свойства многогранников (полиэдров), обусловленные ориентацией векторов нормалей к их граням. С учетом принятого соглашения (1.8), внешняя ориентация нормалей к граням полиэдра обеспечивается при обходе его граней против часовой стрелки, если смотреть на каждую грань из внешнего полупространства. 1.2.1.5. Уравнения плоскости в отрезках Неявное уравнение плоскости в отрезках ЛЛ, Иу и /г., одновременно не равных нулю и отсекаемых плоскостью на осях х, у \м (рис. 1.36, б), получим аналогично (1.16): НФ: К hy hz F = [hyhz hxhz hxhy -hxhyhz\. Выбрав на плоскости точки a = [hx 0 0],£> = [о hy о], с = [0 0 hz], получим ее направляющие векторы V=b-a = [-hx hy о], W=c-b = \i -hy Л,], (l.74,«)
'еометрические основы компьютерной графики 67 1 по (1.72, 6) — координатные и векторную функции: \x(t.i) = fix(l-t); ПФ: Жт) = hy(t-x) или />(/)= \hx{\ -t) hy{t -т) hzx] Рис. 1.36 1.2.1.6. Модели линии в пространстве Линия в пространстве имеет одну степень свободы и является либо пересечением zbvx поверхностей, либо кинематическим следом движения некоторой точки в тространстве. Соответственно, имеем две формы модели пространственных линий: НФ: {/i(p)=0}n{/2(p)=0}; ПФ: р(?)=Ш у(<) -(')!■ Неявная форма требует решения системы нелинейных уравнений относительно «гоординат х, у, z точки р и для практического применения неудобна. Парамет- -ические функции прямой линии в пространстве в векторном виде полностью совпадают с (1.14, а) и (1.15,5): p{t) =ро+ Vt и p(t) = ро + (b - a)t. В координатном виде они дополняются аппликатами z(0 - zo+ Vjt и z(t) = zo + (b, - a.)t. Получим уравнения прямой как линии пересечения двух плоскостей (рис. 1.37). Рис. 1.37
68 Глава 1 П В неявной форме плоскости заданы векторами Fl =[n^ П\\ и F2 = [N2 D2\. Прямая их пересечения p(t) =ро+ Vt имеет неизвестные элементы ро и V. Для их нахождения запишем систему двух уравнений плоскостей (1.63): \р 1] N? NJ D, D2 = [o o]=> p[nj NlU~ Dx -D2]. (1.75) Полученное векторное уравнение эквивалентно недоопределеннои системе двух скалярных уравнений с тремя неизвестными, не имеющей единственного решения. Прямоугольная матрица [Nf N2 Je R не обращаема. Получим ближайшее к началу координат МНК-решение, минимизируя функцию Лагранжа 5(р,1) = 0.5{р°р) + 1о<р(р), в которой к е R2 — вектор множителей Лагранжа, а 4р)=р[к? N^+iDt D2] есть соответствующая (1.75) векторная функция связи координат точки р. Дифференцируя 3(р, Я) по векторным аргументам, получим систему уравнений <ЭЗ(/?,Л)/ф = /? + Л 9,Л)/дА = p\t N, LN2 = 03; дЗ(р,Л)/дЛ = Р№ Ni\+[DX D2]=02. Подставляя решение первого уравнения (1.76) р = -Х N-, во второе, получим вектор множителей Лагранжа A = [Z), D2] v1- N2. N? Подстановка его в первое уравнение (1.76) дает МНК-решение уравнения (1.75): = -[/), D2] TV, *2. к *?] i /V, N2 (1.77) /V, o/V, NxoN2 ' N, N\ oN2 N2° N2 N2 Если обе плоскости заданы в НФ элементами {рю, N\) и [рю, N2}, то в (1.77) следует подставить D\ = —рю ° N\ и Di - -pw ° Nl Направляющий вектор прямой ортогонален обеим плоскостям: V=N\ *Ni.
'еометрические основы компьютерной графики 69 (1.78) Условие существования решения Г*Оз есть также и условие невырожденности обращаемой в (1.77) матрицы: |7V,|>2|2 -(/V, oN2f =h|2|/V2|2(l-cos2(Z^,7V2))= = |/V,|2|/V2|2 sin2(ZjV,W2)* 0. Это означает, что плоскости не должны быть параллельными. ^ В параметрической форме плоскости заданы точками р\о, рю и направляющими векторами Vi, W\, Vi и Wi (рис. 1.37). Параметры рю и V искомой прямой определяются путем перехода (1.66) к неявным формам плоскостей и решения задачи (1.77). 1.2.2. Взаимное положение графических элементов в пространстве Рассмотрим некоторые полезные формулы, тесты и алгоритмы, описывающие свойства и взаимное расположение точек, прямых, плоскостей и многогранников полиэдров) в пространстве. 1.2.2.1. Коллинеарность точек Три точкирь рг ирг коллинеарны, если (рг-р\) х (ръ-р\) = Оз или |0?2—/?l) о (рз—/?l)| = |/?2—/?i| -1/73—/?l|. Обобщение на произвольное число точекр\ +р„: rang Р\ Рг Рп = 2 или rang Pl- Рг- рп- ~Р\ -Р\ -Pi. 1. (1.79, а) (1.79,6) Проверка принадлежности точки/? отрезку аЬ выполняется по тесту (1.18), а значение параметра t, соответствующее положению точкиp-a + {b-d)t на прямой относительно отрезка аЬ, вычисляется по (1.19). 1.2.2.2. Компланарность точек Четыре точки р\,рг,ръ ири компланарны, т. е. лежат в одной плоскости, если Р\ Р} = 0 или {{рг-pi)x (/>з -/>i))°(/>4-/>0 = 0. (1.80) Pi Pa
70 Глава 1 Размерность пространства R'", натянутого на п точек р\ + рп, вычисляется на основе определения ранга матрицы как числа ее линейно-независимых строк или столбцов: т = rang Р\ Р1 Рп_ -1 = rang Рг~Р\ Ръ~Р\ Рп~Р\. <min{3, л-l}. (1.81) 1.2.2.3. Точка и прямая Рассмотрим расположение точки q и прямой p(t) = ро+ Vt (рис. 1.38, а). Точка принадлежит прямой, если Я = Оз, где Я =(</-/><)) х V. Уравнение перпендикуляра, опущенного из точки q на прямую, имеет вид: Р±0) = q+ Vj, где VL = Ях V. Расстояние от точки q до прямой выражается следующей формулой: |я| d = \q-p<\sm{a)=\{q-pQp<v\ = ^. Уравнения тоскости, проходящей через точку q ортогоначьно прямой, имеют вид: НФ: goFL=0,FL=[K -qoV]; ПФ: Pi(t,i) = q + Vxt + Ят. (1.85) (1.82) (1.83) (1.84) (1.86) 1.2.2.4. Точка и плоскость Рассмотрим расположение точки q и плоскости (рис. 1.38, б). Точка принадлежит плоскости, если НФ: qoF = 0; ПФ: (tf-/>o) о (Vx W) = 0. Параметрические уравнения перпендикуляра, опущенного из точки q на плоскость. имеют вид: НФ: pdt) = q + Nt; ПФ: Px(t) = q + Nt,N=V*W. (1.87) Расстояние от точки до плоскости находится так: (1.88) d = |prW (q - Ро )| =\(q - ро )° Щ= \(q ~ Ро )» У X W\ Зеркальное отражение точки q от плоскости расположено на перпендикуляре к плоскости на расстоянии 2d от q в сторону, противоположную проекции вектора q -ро на нормаль N, и вычисляется по формуле (1.26, а).
геометрические основы компьютерной графики 71 Уравнения плоскости, проходящей через точку q параллельно заданной плоскости, следующие: НФ: q°F\\=0, F^=[N -q°N]; ПФ: pn(t,i)=q + Vt + Wx. (1.89) Рис. 1.38 1.2.2.5. Построение плоскости, наименее удаленной от совокупности точек Рассмотрим задачу, связанную с понятием расстояния от точки до плоскости. Допустим, в R3 задано т > 3 произвольных точек pi +р,„. Так как в общем случае точки не компланарны, то не существует ни одной плоскости/^) = 0, для которой все числа dt =f(pi) обращаются в ноль. Другими словами, расстояния \d,\ I \N\ от точек р{г до этой плоскости, вычисленные по (1.88) и пропорциональные dh не могут быть одновременно все нулевыми (рис. 1.39). Рис. 1.39
72 Глава 1 Алгоритм построения аппроксимирующей плоскости {ро, N}, наименее удаленной от совокупности точек р„ аналогичен двумерному алгоритму, полученному в (1.29). Применительно к размерности пространства п = 3 он имеет следующий вид. & Шаг 1. Сформируем из точек /?, т х 3-матрицу Р и найдем их геометрический центр с: Р = Р\ 1 т (1.90, a) Шаг 2. Вычислим собственные значения Х\, \г, Хз и соответствующие им нормированные собственные векторы Ni,Ni, Ns симметричной 3 х 3-матрицы М = тсТс-РТР. (1.90,6) ШагЗ. Определив собственную пару {Хк,Nk) с максимальным значением Xk = m&\{ki}, получим элементы вектора F = [n D] неявного уравнения искомой плоскости (1.63): N=Nk,D = -NoC. (1.90, в) Вместо неявной формы плоскости можно использовать ее нормальное уравнение (р - с) о N - 0. Для построения более удобна параметрическая форма p(t, т) = с + Vt+ W\, направляющие векторы которой Ки ^находятся по (1.70). Оставшиеся две собственные пары матрицы М дают плоскости, ортогональные оптимальной (при различных собственных числах) и пересекающиеся с ней в геометрическом центре точек с. & Пример 1.4. Построить плоскость, наименее отклоненную от точек (см. рис. 1.39) Л=[1 0 2], р2 = [А 3 4], р3 = [б 3 1], Р4 = [5 5 О], р5 = [4 1 l]. Решение. Следуем шагам алгоритма (1.90). Шаг 1. Р = 1 4 6 5 4 0 3 3 5 1 2 4 1 0 1 с = т5>/=[4 2-4 »-б]. 5^ Шаг2. М = 5стс-РтР = i=l -14 -11 4 -11 -15.2 3.2 4 3.2 -9.2
еометрические основы компьютерной графики 73 Xi = -3.475, /V, = [- 0.74 0.65 - 0.15]; Я.2 = -4.865, N2 = [0.073 0.304 0.95]; Хз = -27.06, N3=[-0.67 -0.69 0.27]. ШагЗ.А:= 1, /V = [-0.74 0.65 -0.15], D = 1.64. Таким образом, аппроксимирующая плоскость описывается неявным уравнением -0.74л- + 0.65>> -0.152 + 1.64 = 0. Для получения направляющих векторов выберем вектор Н = [l 0 о], не параллельный вектору N. Тогда по (1.70) получим направляющие векторы У = [0 0.15 0.65], W = [0.45 0.49 -0.11] и параметрические функции плоскости x(t, т) = 4 + 0.45т, y(t, т) = 2.4 + 0.15г + 0.49т, z(t, т) = 1.6 + 0.65/ - 0.11т. .Алгебраические расстояния от заданных точек до этой плоскости равны - =0.594, di = 0.026 (точка рг почти лежит в плоскости), Л = -1, Л = -0.632 и J5 = -0.82, а минимум функции Лагранжа составляет 3min = 3.475. О 1.2.2.6. Взаимное расположение двух прямых Исследуем расположение в пространстве двух прямых pi(h) = pw + V\i\ и pz(ii) = />2о + Vi ti (рис. 1.40). Прямые совпадают, если {Vx =03}ПЦ, =03},где Vx= V, х Vi, Nn=(p20-pw)xVf. (l.9l) Прямые параллельны, если V± - Оз. Расстояние между параллельными прямыми равно d = \{p20-p\o)*v\. (L92) Уравнения плоскости, проходящей через две параллельные прямые, имеют вид: НФ: P»/l|=0,F|| = tV|| -/>io°WM]; (l.93,«) ПФ: p(t, т) = рю + (рго -pio)t + V,t. (I -93, 6) Прямые лежат в одной плоскости при (ртв -/>ю) ° Vx = 0. Угол их пересечения равен у = arccos §\oV2) (I-94) и представляет собой неотрицательный угол кратчайшего вращения от вектора У\ к вектору Уг, видимого со стороны ортогонального им вектора V±= V\ х Vi. Уравнения пчоскости, проходящей через две пересекающиеся прямые, имеют вид: НФ: P°FX=0, Fx = [v± /7,0°^]; (1.95,а)
74 Глава 1 ПФ: p(t, т) = рю + V\t + Vn. Точка пересечения прямых находится аналогично формуле (1.30, б): q -рю + V\t\ =р2о + Viti, (1-95,6) (1.96) где ['1 '2]=(P20-Plo)hT ~Vl\ VxoVx -VX°V2 -vrv2 V2°V2 Прямые ортогональны, если V\ о Vi — 0. Прямая, соединяющая скрещивающиеся прямые по кратчайшему пути, имеет направляющий вектор Vx = V\ х Vi и проходит ортогонально им обеим через точки q\ =р\о + V\t\, qi =/>2о + Viti. Параметры t\ и ti находятся по формуле (1.96). Уравнение кратчайшей прямой есть p±(t) = q\ + Vj . Кратчайшее расстояние между скрещивающимися прямыми равно ^ = |«1 -921 =|0»2О -Plo)° ^J-| ■ (1.97) Рис.1.40 1.2.2.7. Взаимное расположение прямой и плоскости Рассмотрим расположение прямой p\(t) - p\t> + V\t и плоскости (рис. 1.41). Прямая принадлежит плоскости, если НФ: {к, о N =0}П{Э10о^ = 0}; (1.98, о) ПФ: {^1°(^хИ/)=0)П{0'|о-/'о)0(^х^) = 0}. (1.98,6) Прямая параллельна плоскости, если НФ: Г,оЛг=0; ПФ: K,o(FxW0 = 0. (1-99) Расстояние от прямой до параллельной ей плоскости равно d = \(pio-Po)°^=\{pi0-Po)°Vxw\- (1.Ю0)
'еометрические основы компьютерной графики 75 Прямая ортогональна плоскости, если НФ: VixN = Or, ПФ: Fix(FxW0 = O3. (1.101) Одной из основных задач компьютерной графики является расчет точки пересечения произвольной прямой с плоскостью, аналогичный расчету (1.30) пересечения лзух прямых на плоскости: НФ: ПФ: q = pi0 + V\t ^oW н ИЮ VX°N ' W-iu^aj #=/>ю + Vit=po+ Vx+ WQ, где [/ т б]=(р0-р,0) -V -w (1.102,6) Условие существования решения: V\ ° N&0 — прямая не параллельна плоскости. Угол между прямой и нормалью к плоскости находится аналогично (1.94): A. = arccos(^° #)= arccos^o Vxw). (1.103) Уравнения плоскости, проходящей через прямую ортогонапьно заданной плоско- ^пи, имеют вид: НФ: ро Г±=о, где F±=[N±-pl0oN±],NJ_ = Fix N; (1.104,я) ПФ: p(t,i)=pw+ Vut + (Vx УУ)х. (1.104,6) Ъ сювие единствениости решения: V\ х N ф Оз — прямая не ортогональна плоскости. 1.2.2.8. Две плоскости Исследуем расположение в пространстве двух плоскостей (см. рис. 1.37). Плоскости совпадают, если НФ: {^1Х^2=Рз}П{0»2о-Ло)0^2=0}; (1.105,0) ПФ: {(Vi*lVl)x(V2xW2) = 03}n{(P20-P\oHv2xW2) = 0}. (1.105,6)
76 Глава 1 Плоскости параллельны, если НФ: Мхй = Оз; ПФ: (V, х W\) х (V2х Wi) = Оз. (1.106) Расстояние между параплельными плоскостями равно </ = |0'20-/'lo)0^i| = |0'20-Pio)ot/lx^l|- (1.107) Плоскости ортогональны, если НФ: Nt°N2 = 0; ПФ: (V, х Wi)°(V2 х W2) = 0. (1.108) Одной из основных задач компьютерной графики является расчет прямой пересечения двух плоскостей, выполненный в (1.75)-(1.78). Здесь дополнительно приведем формулу для вычисления угла пересечения плоскостей, аналогичную (1.94): у = arccos(A^ ° Л^ )= arccos ^\хЩоУ2х(Г2). (1Ю9) Уравнения плоскости, проходящей через точку ро ортогонально двум плоскостям. имеют следующий вид: НФ: poFL=Q,TAe FL=[NL-PQ°NL],NL = N\xNr, (1.110.or) ПФ: p(t,x)=po + (Vi х W\)t + (V2* Wi)\. (1.110,6) 1.2.2.9. Пучок плоскостей и биссекторная плоскость Уравнения пучка плоскостей, заключенных между двумя плоскостями (рис. 1.42, а). имеют вид: НФ: p°Fx+l=0,rjxeFx+l=(l-K)Fi + XF2; (1.Ш,я) ПФ: Px+At,x) = (\-X){pw+Vxt+Wxi) + -k{p20+V2t+W2x). (1.111,6) Изменение параметра пучка в интервале 0 < X < 1 дает такие промежуточные положения плоскостей, что вращение нормалей Nx+\ происходит по кратчайшему углу от начального положения N\ до конечного положения Л^г. Модели (1.111) представляют собой линейные комбинации точек исходных плоскостей, соответствующих равным значениям параметров гит. Параметры биссекпюрной плоскости получаются из (1.111) при X = 0.5 и уравнивании длин векторов, определяющих исходные плоскости: Fe„c = \Ni\Fi + \Ni \F2, Vem = | V2\ V\ + \ Vi \ V2, We*c = | W2\ W\ + \ W\ \ Wi. (1.112) Расчет биссекторных плоскостей бывает необходим, например, при построении сферы, вписанной в четырехгранник. Ее центр о лежит в точке пересечения трех биссекторных плоскостей внутренних телесных углов, примыкающих к одной из треугольных граней, а радиус г есть расстояние от точки о до плоскости любой грани, вычисляемое по (1.88).
'^^метрические основы компьютерной графики 77 1.2.2.10. Пересечение плоскостей Т-чка пересечения трех плоскостей (рис. 1.42, б) определяется из условия ее при- -_пежности этим плоскостям: ЧФ:к l]foT Fl F3t]=03=>a<=-[A D2 Z33]kT N1 *зт]-';(1.ПЗ,я) 1Ф: Л=[/»ю»^1 />20°^2 Р30°^з]кТ Nl N^^^VixW, (1.113,6) >словие существования единственного решения \Nf Nj Nj ^0 — линейная «зависимость нормалей плоскостей, что равносильно существованию и попарен непараллельности линий пересечения плоскостей. Рис. 1.42 "]■> формулам (1.113) рассчитываются вершины полиэдра как точки пересечения оскостей трех смежных граней. ".ресечение п плоскостей в одной точке рх, вычисляемой по (1.113) на основе па- заыетров первых трех плоскостей, возможно при условии гапЕ[г,т F{ ... Fj]=3, d-113'*) лскумулирующем требования совместности системы линейных уравнений в 1 113. а), предъявляемое теоремой Кронекера—Капслли [8—10] о равенстве ран- ""а матриц [^т F2t ... F*\vi [Nf N% ... A^J, и единственности ее решения, . релеляемой полнотой ранга матрицы [Nf 7VJ "».ть равен трем. N„\, который должен 1 2.2.11. Модель полиэдра ~ереходим к изучению полиэдров — замкнутых пространственных объектов, ог- - чиченных плоскостями. Среди объемных тел полиэдры занимают такое же > *ное место, как и полигоны среди плоских фигур. Благодаря планарности всех
78 Глава ' граничных поверхностей полиэдра существенно упрощается расчет его пересечений с различными геометрическими примитивами и другими полиэдрами. Помимо того, что в природе существует множество собственно полиэдральных объектов (пять правильных многогранников, призмы, пирамиды и т. п.), чаете криволинейные граничные поверхности аппроксимируют системой полигональных граней, что превращает гладкие объекты в полиэдры. Подробное изучение свойств полиэдров отложим до гл. 3, а здесь приведем наиболее оптимальную модель полиэдра Н - {Р, G}, состоящую из двух массивов: П координатного списка т вершин Р = \р\, — ,р„ ), пронумерованных в произвольном порядке. Благодаря однородности элементов списка может быть удобнее организовать и использовать вершины полиэдра в виде матрицы вершин в нормальной или расширенной формах (применяется в преобразованиях, изучаемых в гл. 2): Pi Рп X, у\ Z] Уп eR"*3, Р Pi Рп х\ У] г, 1 Уп еЯ"*4- (1.114) П топологического массива списков лг граней G = \}\,...,Gn \. Элемент массива Gj =jg,i, ...,gj„ ,gi\\ представляет собой список номеров (целочисленных индексов) П/ вершин полигона У-ой грани, перечисленных в порядке их обхода по замкнутому контуру. В рамках такого метода организации структуры данных полиэдра доступ к егс конкретной вершине с номером g:j осуществляется в два этапа. 1. Из списка G, считываетсяу-ый элемент v = g^. 2. Из списка Р считывается элемент/?v. Массив G содержит сведения о порядке соединения ребрами вершин полиэдра, описанных в списке (матрице) Р. При этом описание каждого ребра, соединяющего вершины р, и рр дважды встречается в списках граней либо в виде последовательности {..., i,j,...}, либо как {...,j, i,...}. Для примера построим модель полиэдра, состоящего из пк= 11 вершин и пГ = 7 граней (рис. 1.43): 00334044440 522250001 10 06600660060 ,G={Gi, &,...,&}, (1.115) где G, = {1, 2, 3, 5,1}, G2 = {2, 3,10, 7, 6, l}, G3 = {З, 4, 5, з}, G4 = {3, 4, 9,10,3}, G5 = {7,8,9,10, 7}, G6 = {5, 4,9, 8,11,1,5}, G7 = {l, 2, 6,11,1}
еометрические основы компьютерной графики 79 Рис. 1.43 Для работы с полиэдрами нам будут необходимы две функции, возвращающие: 3 полигон вершин z'-ой грани полиэдра {Р, G}: Side{P,G,i)=\pgn... pginipj; (1.H6) 3 вектор нормали к плоскости полигона Р = {р\ ...р„р\} е R3: погт(Р)-(р2-р\)х(ръ-р2). (II17) Пространственная ориентация плоскости полигона задается направляющими ■екторами У = рг-р\, W'-ръ-рг и нормалью N- Vх W по первым трем некол- кшеарным вершинам р\,рг мрз. Со стороны внешнего полупространства, в кото- -чэе направлена нормаль, обход вершин полигона выглядит положительным, происходящим против часовой стрелки (см. рис. 1.36, а). Для обеспечения внешней ориентации нормали i-ой грани полиэдра Nt = Vt х Wi = norm(side(P, G, i)) (111 8) ауА'но руководствоваться следующими правилами: 3 вершины в списке G, должны перечисляться в положительном направлении с точки зрения внешнего наблюдателя; 3 если полигон грани не выпуклый, то первые три вершины должны составлять выпуклый угол; 3 если направление нумерации вершин в списке G, оказалось отрицательным, то следует перенумеровать их в обратном порядке: Gi=\8ib ginj, ■•■> S/2> £,-ij; ГЗ если нормаль к какой-либо грани не вычисляется по (1.118), а задается внешне ориентированной вручную, то направление обхода вершин в списке этой грани безразлично.
80 Глава ' С учетом сказанного скорректируем некоторые списки в (1.115) так, чтобы вычисляемые по (1.118) нормали ко всем граням полиэдра стали внешними: Gi = {2, 6, 7, 10, 3, 2}, G4 = {3, 10, 9,4, 3}, G6={1,5,4,9,8,I1,1},G7={1,11,6,2,1}. 1.2.2.12. Тесты свойств графических элементов в пространстве Рассмотрим тесты, основанные на свойстве сепарабельности плоскости f(p) = С разделять пространство на два подпространства с противоположными знакам] П Тест ориентации точки р относительно плоскости заключается в проверке знака числа f(p), для вычисления которого в зависимости от способа задания плоскости вразд. 1.2.1 используется соответствующая неявная функция nf*\ nfF(F,p)=p°F; (1.119,0) (\.\\9,6) nfN(po, N,p) = (р -ро) о /V; njvw{pQ,v,w,p)={p-Poy{vxw)= Р-Ро V W nf3(a, Ь,с,р)={р-а)о((Ь- а)х (с - b)) = р-а Ь-а с-Ь (1.119, в) (1.119,2) Дополнительно определим еще одну функцию ориентации точки р относительно плоскости полигона Р-{р\ ргръ ...р„р\} е R3: ф{Р,р)={р-Р\)° normfa р2р3 }) = Р~Р\ Рг~Р\ Р7,-Р2 (1.119, д) Внешнее полупространство, в которое направлена нормаль плоскости, называют положительным согласно знаку всех определенных выше функций nf* > 0. Для доказательства построим к плоскости {ро, V, W} нормаль N= V у. W, выберем точку q- po+Vt + Wx + XN, которая при X > 0 лежит во внешнем полупространстве, и вычислим, например, значение (1.119, б): n/N(po, N,q) = (Vt + Wt + \N) о N = (Fo N)t + (W<>N)t + \(NoN) = \\N\2 > 0. To, что величина f{q) не зависит от координат t и т, отсчитываемых вдоль направляющих векторов V и W, означает, что поверхности постоянных уров-
'^метрические основы компьютерной графики 81 Heitfip) проходят параллельно плоскости f(p) = 0 и также являются плоскостями. Как следствие, получим расстояние от точки q до плоскости, равное и обобщающее (1.88). Ввиду простоты вычисления функция/(р), реализуемая на практике одной из функций nf* в (1.119), идеально подходит для сортировки точек относительно плоскости на внешние, внутренние и лежащие на ней. Тест ориентации применяется в алгоритмах, связанных с обработкой точек, вершин полигонов, а также во многих других трехмерных задачах вычислительной геометрии. 3 Гест пересечения плоскости/(р) = 0 с полиэдром Н — {Р, G), имеющим список вершин Р= {/л, ...,/>„}, идентичен двумерному аналогу (1.36) с блок-схемой, изображенной на рис. 1.9, в и применимой с точностью до имени функции: crossXf, Р) = {3 1 <;<i<n :f(p,) f{p) < 0}. (1.120) Плоскость пересекает полиэдр, если существует хотя бы одна пара вершин '.Pi,Pj), лежащих от нее по разные стороны. Свойство сепарабельности плоскости позволяет по разным знакам значений НФ f(p,) и fifj) обнаружить вершины полиэдра />, и рр лежащие по разные стороны от пересекающей его плоскости. Если же не найдется ни одной пары разносторонних вершин, то пересечение отсутствует. Функция (1.120) возвращает 1 как признак пересечения. В отсутствие оного тест возвращает -1, а при касании полиэдра с плоскостью вершиной, ребром или гранью — значение 0. ГЗ Тест выпуклости полиэдра H-{P,G), заданного списками вершин Р = {pi, ...,/>„} и граней G = {G G,,,}: conv3(P, G) = {sgn(nfG(side(P, G, /),/7,)) = const} Vi = \~m, j =Гй: yg G,. (1121) У выпуклого полиэдра нет нн одной пары вершин, лежащих по разные стороны от любой грани (рис. 1.44, а). Напротив, в невыпуклом полигоне всегда найдутся грань G, и пара вершин {Pj,pk), находящиеся по разные стороны от плоскости этой грани (рис. 1.44, б). Свойство сепарабельности плоскости позволяет обнаружить у полиэдра невыпуклую грань /7, = side(P, G, i) по противоположным знакам чисел nfG(nj,Pj) и nfG{nhpi) в вершинах pj е. /7, и рк е. /7„ не входящих в состав грани /7,. Наилучший, по мнению автора, алгоритм тестирования выпуклости полиэдра представлен блок-схемой на рис. 1.44, в и в цикле i = \,m использует два флажка, сигнализирующих о наличии вершин слева (флажок I) и справа (флажок г) от плоскости i-й грани П = side(P, G, i). В начале внешнего цикла обхода граней оба флажка сбрасываем в ноль. Во внутреннем цикле обхода вершин pj вычисляем значение s-nfG{TJ,p^. Вершину с s = 0, лежащую в
82 Глава 1 плоскости грани, пропускаем, а при 5^0 инкрементируем один из флажков:. при s < 0 или г при s > 0. Тут же по условию / ■ г ф 0 проверяем наличие любой пары вершин, лежащих по разные стороны от плоскости грани. Если это условие выполняется, то тест немедленно завершается, возвращая 0 как признак невыпуклости полиэдра. После нормального окончания внешнего цикла перебора вершин алгоритм сотЪ возвращает значение 1 — признак выпуклости полиэдра Н. ( Возврат 0 j Рис.1.44
еометрические основы компьютерной графики 83 1.2.2.13. Тесты ориентации точки относительно полиэдра Рассмотрим тесты ориентации точки q относительно полиэдра Н = {Р, G), задан- -ого списками вершин Р - {р\, ...,/>„} и граней G - {G\,..., G,„}. 3 Выпуклый тест conv3 _ test(q, P,G) = -1, если fj < О V/ = 1, m; 1, если 3/ e [1, m]: ft > 0; 0, если не ±1 (1.122) аналогичен плоскому тесту (1.38) и определяет положение точки относительно выпуклого полиэдра с одинаково ориентированными нормалями (например, всеми внешними) по знакам неявной функции (1.119, д) fi = n/G(nh q), где /7, = side{P, G. i). Все внутренние точки <7вну лежат с одинаковых сторон от всех граней /7,. Для любой внешней точки дВие всегда найдется пара граней /7, и 77^, относительно которых она расположена с разных сторон. Наконец, все точки, не идентифицированные как внутренние или внешние, считаются граничными точками <?Гр, расположенными на гранях, ребрах или вершинах выпуклого полиэдра. Алгоритм выпуклого теста conv3_test функционирует согласно блок-схеме, показана на рис. 1.45. (conv3_iesi(g,P,G)J m=size(G) r=l=e=0 ■С М...я» у-end — f=nJG{side{P,G,i),4) -<0 >0- Рис. 1.45
84 Глава 1 В соответствии со знаком числа 1, возвращаемого тестом для внешних точек, назовем внешнее пространство полиэдра положительным. Внутреннее пространство будем считать отрицательным по знаку числа -1, возвращаемого алгоритмом для всех точек из этого пространства. Все точки на границе полиэдра (в вершинах, на ребрах или гранях) дают нулевой результат тестирования. П Габаритный тест gab3 _ test(q, Р)={х£ [хтт, xmax ]}ll{y g [ymin, ymax ]}U{z g lzmin, zmax ] ] (1.123, a) определяет по возвращаемому значению gab?>__test = 1 гарантированную непринадлежность точки q произвольному полиэдру Н= {Р, G) путем сравнения ее координат с габаритными параметрами полиэдра. Тест (1.123, о) легко обобщается на случай полиэдра со списком вершин Q — {qi,..., q,„), имеющего габаритные параметры <7Ymin = m\r\{q^), qy,mn - mm{qi}), q.mm = m'm{qi,}, qxma* = rmx{qix},qymax = max (¾.}, q,mm = max{<7,.}: (1.123,6) gab3_pofy(Q,P)= LKfocomax < «minlUfccomin > wmax))- UE{x,y,z) П Лучевой 3(1-тест аналогичен плоскому варианту (см. рис. 1.17, г) со следующими изменениями: • генерируется вектор V е R3 со случайными углами места <р = rnd(2n) и азимута у = rnd(n) (см. рис. 1.1,6); • по (1.102, б) рассчитываются параметры \ft т, ej и точка f, = ^+Кг, пересечения луча/?(/) = q + Vt Vt > 0 с плоскостью /'-ой грани П, - side(P, G, i): • блок проверки условий 0 < т, < 1 заменяется тестом ориентации точки с, относительно полигона z'-й грани. Для /7, в виде параллелограмма это {О < Tj < 1}П{О < 6j < l}, для треугольника — {0 < G, < т, < 1}. В результате получается алгоритм ray3_test(q, Р, G) лучевого теста ориентации точки q относительно полиэдра Я = {Р, G}, блок-схема которого приведена на рис. 1.46. В общем случае для проверки принадлежности точки произвольному плоскому полигону применяются 2с1-тесты ориентации (1.38)—(1.45). Предварительно выполняется преобразование системы координат так, чтобы фронтальная плоскость ху совпала с плоскостью полигона. В гл. 2 рассматривается алгоритм MAPI расчета матрицы такого преобразования Ск. В измененной системе координат x'y'z' становится возможным применять плоские тесты ориентации. Обозначим результат такого теста г, е {-1, 0, 1}. Решение о принадлежности точки полиэдру выносится на основе следующих правил. Точка не принадлежит полиэдру, если число пар {/, > 0,/-, = -1} равно нулю или четно. Точка лежит внутри полиэдра, если число этих пар нечетно. Точка принадлежит границе полиэдра, если имеется хотя бы одна пара {/, = 0, л, < 0}.
еометрические основы компьютерной графики 85 f rayl_test(q,P,G) J i /=1, (p=rnd(2n\ \p=rnd(n) l' = fsin((p)sin(v) cos(v) cos((p)sin(i|()] «Q i=\...size(G) \— end U Возврат/ j n=side(P,G,i) ' V /7,-/Z2 ./7j-/7, M = [t x 61=(/7,-9)^4 c=q+Vt {c,//}-»{c',//'} r=rayl_lesl(c, //') 4 0 —<^M^>-*0-l 1—<0 ~<СГ'7^~ >0 ^ l—:^—Ь-eS Г Возврат 0 J Рис. 1.46 .Алгоритм rayb_test, использующий 2d-TecT rayl_test, так же возвращает числа -1,0 или 1 в соответствии с принятым решением о расположении точки. Все недостатки плоского лучевого теста присущи и его пространственному аналогу. Особенно это касается случаев пересечения лучом ребра или вершины полиэдра, когда требуется повторить тест с новым случайным направлением луча V. Пространственный вариант углового теста отсутствует из-за неопределенности геометрического понятия знака телесного угла. .2.2.14. Алгоритмы пересечения в пространстве ~ Пересечение отрезка ab с плоским ЗФполигоном Р. Когда ищется пересечение не просто прямой с плоскостью, а их частей — отрезка с полигоном, то параметрическая форма решения (1.102,6) предпочтительнее неявной (1.102, я) благодаря возможности проверки принадлежности точки q отрезку ab по условию 0 < / < 1, а полигону Р по плоскому тесту ориентации. Последнее тестирование выполняется в измененной системе координат, в которой плоскость полигона Р является фронтальной. Составим алгоритм расчета точки q и параметра / пересечения отрезка ab с плоским полигоном Р - {р\ ...р„р\). Алгоритм возвращает через свое имя cross_side признак пересечения: • -1 — отрезок и полигон параллельны (не пересекаются) или их плоскости совпадают (точка пересечения не определена);
86 Глава 1 • 0 — непараллельный отрезок не пересекается с полигоном; • 1 — непараллельные отрезок и полигон касаются или пересекаются. В двух последних случаях через аргументы функции возвращаются параметр i и точка пересечения д. & cross_side(ab, Р, t, q) {H-b-a, V = p2-pi, W-pi-pr, N=VxW; если № // = 0, то возврат-1; [t x e]=fo-e) н -v -w II направляющие векторы II нормаль к плоскости полигона // тест параллельности (1.99) // расчет параметров пересечения // точка пересечения прямой с плоскостью // тест пересечения отрезка с полигоном q = a + Ht; возврат {О < t < 1}П{qtP}; }П П Пересечение отрезка ab с полиэдром Н- {Р, G}, заданным списками вершин Р= {р\,...,р„} и граней G = {Gi,..., G,„}. Требуется отсечь от отрезка те его части, которые находятся вне полиэдра Здесь мы рассматриваем задачу внешнего отсечения отрезка выпуклым полиэдром. Другие виды отсечения обсуждаются в гл. 4. На рнс. 1.47 приведен алгоритм clip3_cross(ab, Р, G) внешнего отсечения отрезка ab выпуклым полиэдром {Р, G}, основанный на расчете пересечений прямой {a, b), несущей отрезок, с плоскостями граней полиэдра. Он возвращает через имя clip3_cross признак ориентации отрезка относительно полиэдра: • 0 — отрезок целиком отсечен полиэдром и находится вне его; • 1 — отрезок весь или частично расположен внутри полиэдра. Через аргумент ab возвращаются концевые точки не отсеченного полиэдром фрагмента отрезка [а, Ь]. Эти точки рассчитываются с помощью табл. 1.1 в зависимости от значений m = ?, и CJ2 = tj параметра t, при которых прямая пересекла грани G, и Gj. Две ячейки {ел < О, CJ2 > 1} и {ел > 1,стг<0} соответствуют внутреннему положению отрезка, при котором он не отсекается. В ячейках {ел < 0, ш < 0} и {ел > 1,CJ2> 1} формируются отрезки [а, а] и [b,b] нулевой длины, которые интерпретируются алгоритмом как полностью отсеченные с возвращением нуля. Остальные ячейки таблицы соответствуют частичному отсечению отрезка ab и стягиванию его внешних концевых точек на границу полиэдра. Естественное завершение цикла обхода граней означает, что прямая отрезка ab либо касается полиэдра, либо не пересекает его вовсе. В обоих случаях алгоритм завершается возвращением нуля.
юметрические основы компьютерной графики 87 (clip3_cross(ab,P,G)J k=0, V=b-a Si=]...size(G) V >< ;=1 ...size(G) Vend -i I n=side(P,G,i) c=crossside(ab,n,t,q) k=k+\,a,=t -<2 ^^ Расчет [a,i] по табл. 1.1 0 ► ( Возврат 1 J ( Возврат 0 J Рис. 1.47 Возможно и второе решение задачи отсечения отрезка полиэдром с использованием выпуклого Зс!-теста ориентации (1.122). Оно представлено на рис. 1.48 блок-схемой алгоритма clip3_test(ab, Р, G) отсечения отрезка ab выпуклым полиэдром Н= {P,G}. Алгоритм возвращает такие же результаты, что и рассмотренный выше алгоритм clip3_cross. Его идейная основа и словесное описание аналогичны 2с1-варианту clipl_test отсечения отрезка полигоном гсм. рис. 1.19), в связи с чем они здесь подробно не излагаются. Отметим лишь упиичия Зс1-алгоритма: • в цикле с переменной i перебираются грани полиэдра, а не ребра полигона; • пересечение отрезка ab с /-ой гранью П = side(P, G, /) рассчитывается функцией cross_side{ab, П, t, q), возвращающей в случае пересечения признак cross_side = 1 и соответствующий параметр t е [0, 1]; • используется определенный в (1.122) Зс1-тест conv3_test ориентации точки относительно выпуклого отсекателя. Несмотря на то, что алгоритм clip3_test имеет большую трудоемкость в сравнении с алгоритмом clip3_cross (дополнительно выполняется от одного до
88 Глава i трех тестов conv3_test), его идейная основа лучше подходит для решения др\- гих задач отсечения: • при внутреннем отсечении отрезка выпуклым полиэдром (рис. 1.49, а) отбор неотсеченных фрагментов выполняется по условию их внешней ориентации conv3_test(mk, P,G)= 1. Число таких фрагментов может быть от н\- ля (весь отрезок лежит внутри полиэдра) до двух (средняя часть отрезк? экранируется полиэдром); • при отсечении отрезка невыпуклым полиэдром нужно вместо выпуклого теста conv3_test использовать лучевой тест rayi_test для определения ориентации средних точек фрагментов относительно произвольного полиэдра При внешнем отсечении отбираются фрагменты, средние точки которых лежат внутри полиэдра, а при внутреннем — фрагменты со средними точками вне полиэдра (рис. 1.49, б). С clipi test(ab,P,G) J k=0, V=b-a,L={0,\} ^/=i...5/ze(C)^-end L=sorl(L) T < k=l...size(L)-l >end И m=a+0.5(Lt+Lt+iy- c = convi_tesi(m, P,G) С Возврат (c=-l} J Рис.1.48 Рис.1.49
Геометрические основы компьютерной графики 89 1.2.3. Квадратичные и параметрические поверхности Поверхности второго порядка (квадратичные поверхности) описываются уравнением в неявной форме с векторным аргументом: f(p)=pFpT=0, "де F = А Е Q н Е В G J Q\H G | J с i к k\d\ Fu F\ "21 12 D (1-124) ^11 -^11 ' ^12 -^21- Нормаль и матрица касательной плоскости в точке ро &f(p) в соответствии с 1 61, о) и (1.66) равны N = 2[p0l] F2I = 2(p0Fu+F2i), FKac = [N -PooN\. (1.125) Для любой квадратичной поверхности четыре величины h = А + В, А Е Е В + В G G С + A Q Q с (1.126, я) /3 = |fll|,/4 = |fl иляются инвариантами относительно преобразований переноса и вращения, а «ела /; А Н Н D + В J J D + С К К D В G J G С К J К D + A Q Q с н к н к D + А Е Н Е В J Н J D (1.126,6) агть полуинварианты относительно преобразования вращения. Они позволяют -bjcrpo определить тип и каноническое уравнение поверхности по уравнению 124) с помощью табл. 1.3, 1.4.
Таблица 1.3 § "^^^ /< Центральные поверхности, /з*0 I\h > 0 и /2> 0 /i/з < 0 или /2<0 Нецентральные поверхности, /з = 0 Невырожденные поверхности, /<*0 h >0 Мнимый эллипсоид (,/^+^+(.-/^ + 1=0 Однополостный гиперболоид (x/af-iy/bf^/cf-1=0 Гиперболический параболоид (x/af-^)-(1/^=0 /<<0 Действительный эллипсоид (x/af+{y/bf+(=/c?-1=0 Двуполостный гиперболоид (х/а)2 -(у/А)2 + (г/с)2 +1=0 Эллиптический параболоид (x/af-{y/b)+(z/cf=0 Вырожденные поверхности, 14 = 0 Точка вырожденного эллипсоида {x/af +(у/Ь?+(Ф?=0 Конус вырожденного гиперболоида (x/af-(y/bf+(=/cf=0 Цилиндры и пары плоскостей (табл. 1.4) /з' ^ Цилиндры, /;*0и rang(F) = 3 Пары плоскостей, /5-о rang(F) = 2 rang(F) = 1 /2>0 Эллиптический (x/af+(z/cf-\=0 Прямая пересечения плоскостей (x/af+(z/cf=0 /2<0 Гиперболический (x/af-(z/cf-1=0 Пересекающихся (x/af-(z/cf=0 Таблица 1.4 /2 = 0 Параболический (x/af+(z/cf =0 Параллельных (x/af-1=0 Совпадающих (x/af=0
Геометрические основы компьютерной графики 91 Неявная форма неудобна для построения поверхностей и используется при анализа их свойств по инвариантам и решении задач пересечения методом трассировки лучей. Исследуем взаимное расположение квадратичной поверхности {F} с прямой линией q. V) и с плоскостью {q, V, W). 3 Первая задача фактически решена в (154)—(1.56). Анализируя варианты решения квадратного уравнения at1 + 2bt + с - О из (1.55) с коэффициентами a = VFyXV\ b = (qFti+F2iy\c = qFxi4T + 2qF^ + D и дискриминантом d—b2- ас, заключаем: • при {a*0}n{<rf>0} прямая пересекает поверхность в двух различных точках/?i - q + Vt\ и pi - q + Vti с параметрами -b-yfd -b + yfd 'i= <'2= ; a a • при прямая касается поверхности в единственной точке pi = q + Vt\ с параметром -Ъ а • при {а = 0}П{<Ь*0} прямая пересекает поверхность в единственной точке р\ - q + Vt\ с параметром -с 1 2b • при {а = 0}П{б = 0}П{с=0} прямая касается нецентральной поверхности в бесконечном множестве точек; • в остальных случаях прямая не имеет с поверхностью ни одной общей точки. 3 Подставим параметрическое уравнение плоскости p(t, т) = q + Vt + Wx в неявное векторное уравнение квадратичной поверхности с матрицей F из (1.124): (q + Vt + WT)Fu(q + Vt + lVT)T +2(q + Vt + W-t)F2\+D = 0. (1.127) После упрощения получим квадратичное уравнение связи параметров / и т в скалярном или матричном видах at2 + bx2 + 2е/т + 2gt + 2jz + d=0 и б(?,т)= [г т]0 = 0 (1.128,о)
92 Глава a е g е b J g J d B= e b i , _ „r. „/T _ ,_„ . r- ,.,t , ,_„ . „ л„,т (1-128,6) со следующей симметричной матрицей © и коэффициентами a, b, d, e, g nj: a = VFnVT, b = fVFuWT, d = qFuqT +2qF2\+D e = VFuW\ g=(qFli+F2l)V\ J=(qFu+F2l)W Налицо полная аналогия (1.128) с уравнениями (1.51) квадратичных кривых на плоскости. Вычислив по (1.126) инварианты /i-^/з и полуинвариант /; матрицы ©, по табл. 1.2 определим тип кривой пересечения квадратичной поверхности с плоскостью: • действительный эллипс, гипербола и парабола образуются в большинстве случаев сечения плоскостью криволинейной квадратичной поверхности (эллипсоида, параболоидов, гиперболоидов, цилиндров и конуса); • мнимый эллипс и мнимая прямая означают отсутствие пересечений и касаний поверхности и плоскости; • точка вырожденного эллипса означает касание поверхности плоскостью е точке; • две асимптоты вырожденной гиперболы образуются при сечении конуса плоскостью, проходящей через его вершину; • две параллельные прямые образуются при сечении цилиндра плоскостью параллельной его оси; • одна двойная прямая образуется при касании плоскостью нецентральной поверхности. В тех случаях, когда неявное уравнение в (1.128, о) может быть приведено к явному виду / = ф(т) или т = i|/(/), возможно получение явных ПФ р{х) -ро+ Кф(т) + W\ или p(t) =ро+ Vt+ W\y(i) пространственных кривых пересечения плоскости с квадратичной поверхностью. Иначе необходимо найти параметрические зависимости / = ф(а) и т = у(а). Тогда кривая сечения будет описываться ПФ p(i) =ро+ Ир(а) + Wty(cj). Параметрическая форма p(t,i) поверхности второго порядка может быть пол\- чена следующими способами. П Заменой аргументов х, у, z канонического уравнения функциями двух параметров (допустим, / и т) на основе известных тригонометрических тождеств cos2(/) + sin2(/) = 1, ch2(/) -sh2(/) = 1. Простейший пример — сфера единичного радиуса. Ее каноническое уравнение х2 + у2 + z2 - 1 = 0 допускает, например, подстановки x(t, т) = sin(/),^(/, т) = cos(/)sin(T), z{t, т) = cos(/)cos(t).
Геометрические основы компьютерной графики 93 Гораздо более сложен поиск подстановок для произвольного уравнения второго порядка. Данная задача решается методом геометрических преобразований канонической поверхности в заданную, с которым можно ознакомиться, например, в [10, 26, 32]. 3 Суперпозицией одновременных движений точки вдоль координатных осей из определенного начального положения. Например, сложение гармонических колебаний x(t, т) = sin(/) и z{t, т) = cos(/) вдоль осей х и z с независимым от них равномерным движением y{t, т) = т вдоль оси у дают боковую поверхность кругового цилиндра. Если движение вдоль оси у сделать зависимым, например, y(t, т) = hi, то получим цилиндрическую винтовую линию с шагом 2nh. Детальное изучение кинематического метода построения параметрических кривых и поверхностей продолжим в следующих главах. Обязательными элементами параметрической формы являются интервалы изменения параметров гит, необходимые и достаточные для описания точек всей по- згрхности или любого ее желаемого фрагмента. Реалистичное изображение гладкой поверхности на экране дисплея — сложная задача, состоящая в передаче ее формы за счет правильного расчета освещенно- гги видимых точек. Упрощенное построение поверхности заключается в изображении ее каркаса— совокупности линий, передающих форму поверхности. .1ля этого выполняется дискретизация непрерывных параметров ' — 'о> '|j •••> 'л> т = ^0) t|> •••» %» * организуются вложенные циклы вывода на экран каркасных линий />(/,, т) и If, Ту). Пересечение линий дает ячейки треугольной или четырехугольной формы. Наиболее простое изображение непрозрачной поверхности заключается в закрашивании всех точек видимой ячейки постоянным цветом, соответствующим освещенности усредненной точки ячейки, например, ее центра. Существуют и более сложные методы закраски поверхностей, некоторые из которых будут рассмотрены в гл. 3. Основные трудности некинематического подхода к составлению уравнений квадратичных поверхностей: 3 невозможность описания единственным векторным уравнением гиперболических и двуполостных поверхностей из-за постоянства знака функций ch(/) > 0 и /2 > 0; 3 назначение интервалов изменения параметров, обеспечивающих существование и единственность поверхности в желаемой области пространства; 3 выбор из множества вариантов функций подстановки, обеспечивающих вычисление нормали N(t,T) = p't х р'х к поверхности во всех ее регулярных точках; 3 неизвестный заранее вид каркасной сетки [p{th i),p(t, ij)}, выясняемый только после практического построения поверхности.
94 Глава ' На рис. 1.50 с помощью программы MathCAD построены некоторые квадратичные поверхности из табл. 1.3, 1.4 по их каноническим уравнениям с численными значениями масштабных коэффициентов a — \,Ь — 2у\с = Ъ: Рис. 1.50 П действительный эллипсоид (рис. 1.50, а): p(t,x)=[as'm(t)s'm(T) bcos(t) csin(/)cos(x)] te [о, л], те [о, 2л]. (1.129,с
еометрические основы компьютерной графики 95 Как пример неудачной подстановки приведем другую модель эллипсоида «Vw2 , те [0,2л], /е [-1,1 у которой частная производная cos(t) bt c\\-t 2 sin(x) (1.129,6) -a/cos(x) -c7sin(x) не вычислима в точках [о ± Ъ о] при t = ±1, хотя нормаль ЛГ(/,т) = - fcc л/w2 cos(t) act ab yl^? sin(x) существует во всех точках поверхности эллипсоида, а при t = ±1 вычисляется вручную разрешением неопределенности типа 0/0; 3 однополостный гиперболоид (рис. 1.50, б): p(t,i)= [ach(/)sin(T) bs\\(t) cch(/)cos(x)] ,6(-00,00), те [0,2л]; 3 двуполостный гиперболоид (рис. 1.50, в) с матрицей (1.130) F = diag J_ zl _L 2 j,2 2 a b с описывается двумя параметрическими функциями верхней (+) и нижней (-) полостей: p{t,x)= [ash(/)sin(x) ±hch(t) csh(Ocos(x)] te [0,со), те [0,2л]; D эллиптический конус (рис. 1.50, г): p(f,x)=[a/sin(x) A/ c/cos(x)] 1/е (-00,00), те [0,2л]; (1.131) (1.132) 3 седловая поверхность гиперболического параболоида (рис. 1.50,()) наиболее удачно описывается в параметрической форме как Ыг,т)=к [re [0,со), те [0,2л]. sin(x) -bt cos(2x) c/cos(x)J (1.133,0)
96 Глава В учебниках и справочниках [13,26] ошибочно приводятся параметрически модели гиперболического параболоида типа p(t,x)=[atch(x) bt2 c/sh(x)J t e (-0°, 00), те (-oo, oo), описывающие его поверхность только в половине пространства. Правильне было бы составить отдельные выражения для верхних и нижних полосте (рис. 1.50, е): >Ы = atch(x) bt c/sh(x)J — верхние правая илевая, a/sh(x) -bt c/ch(x)J — нижние передняя и задняя. (1.133, f Эти полости соединяются друг с другом на вычислительно недоступных (t —> +х асимптотических прямых \xl a\ = \z/c\, что не позволяет изобразить всю поверх ность как единое целое. Следовательно, модель гиперболического параболоид. (1.133, б) во всем проигрывает модели (1.133, я) и является неверной; П эллиптический параболоид (рис. 1.50, ж)'. />Ы=[< |a/sin(x) bt c/cos(x) te [О,-), хе[о,2я]; П эллиптический цилиндр (рис. 1.50, з): />(/,x)=[asin(x) bt ccos(x)] ,6(-00,00), те[0,2я]; П параболический цилиндр (рис. 1.50, и): />(/,х)=[ах bt сх2\ t 6 (-°о, оо), X 6 (-°о, оо) . (1.13- (1.135 (1.136 & Пример 1.5. Классифицировать поверхность, описываемую неявным уравнением f(x, у, z) = 2х2 + у2 - lz2 + xz - 2у + z - 1 =0, и линию пересечения этой поверхности с плоскостью, заданной отрезками hx = ? hy = 2nh,— 1, отсекаемыми ею на осях координат. Решение. Составим по (1.124) матрицу поверхности и вычислим ее инварианты: F = 4 0 1 0 0 2 0 -2 1 0 -6 1 0 -2 1 -2 /i = 0, /3=2 '- 4 1 1 -6 4 0 0 2 + 50 2 0 0 -6 А = |; + Л = 4 1 1 -6 = 192. = -29, По классификации, приведенной в табл. 1.3, это соответствует поверхности оо- нополостного гиперболоида, плоскими сечениями которого могут быть эллипс парабола или гипербола.
еометрические основы компьютерной графики 97 Сформируем по (1.74, 6) параметры описания плоскости р0 = [3 0 0], F = [-3 2 01,^ = 1-3 0 !] л вычислим коэффициенты квадратного уравнения (1.128): a = 44, Ъ = 24, е = 33,g = 40,у = 32, d = 34. По его инвариантам /i = 68 > 0, h = -33 < 0, /з = -98 < О : помощью табл. 1.2 определяем, что линия пересечения является гиперболой, описываемой неявным уравнением 22/2 + 12т2 + ЗЗгт - 40t - 32т +17 = 0. Задав величину ЛЛ = 4, мы получим в сечении гиперболоида плоскостью параболу : уравнением 36г2 + 25т2 + 60гт - 68г - 59т + 31 = 0 а инвариантами /i = 122 > 0, h = 0, /з = -392 < 0. При hx = 5 сечение дает эллипс 54t2 + 42т2 + 95гт - 104/ - 94т + 49 = 0 с инвариантами /i = 192 > 0, h = 47 > 0, /з = -768 < 0. □ ^7 Пример 1.6. Построить тень каркаса пирамиды с вершинами Л=[3 4 -1], р2=[2 4 2], р3=[5 3 2],р4 = [2 2 о] ча поверхности эллипсоида с полуосями /\ = 2, гу - 1, г. = 3 и центром в точке -=[—2 1 —2\. Источник света удален в бесконечность в направлении :=[4 2 1] (рис. 1.51). ешение. По каноническому уравнению эллипсоида из табл. 1.3 и заданным параметрам получим неявное уравнение \2 Г.. _ \2 х-сг У-Су fz-c. ^ -1 = 0 => 9х2 + 36^2 + 4z2 + 9х - 18у + 4z + 52 =0, 2 по (1.124) следующую матрицу Fn ее блоки: 9 0 0 18 О 36 0 -36 0 0 4 8 18 -36 8 52 , 1г 9 0 0" 0 36 0 0 0 4 ,Г\2 = ' 18 " -36 8 , F2, =[18 -36 8],£» = 52.
98 Глава 1 Рис. 1.51 Так как в квадратном уравнении (1.55) коэффициент a(p) = LFnLT =292*0 не зависит от расположения точки р, то пересечение луча р- Lt с квадратичной поверхностью определяется знаком дискриминанта d(p) - b2(p)-a(p) ■ с(р) с коэффициентами b(p) = -{pFn+F2{)C =-%-34x-12y-Az, с(р) = рР\\РТ + 2pFx\ +D=9x2 + 36у2 + 4z2 + 36*-72у +16z + 52 . Вычислим дискриминанты и действительные точки тени для четырех вершин пирамиды , .KPl) + Jd(p~j г — Pi = Pi+ 7—; L Vi = l,4. b{p\) = -400, c(pi) = 517, rf(pi) = 9036 > 0 => p[= [-1.177 1.911 -2.044]; b{pi) = -376, c{pi) = 496, d{pi) = -3456 < 0; Ъ(ръ) = -412, c(ps) = 613, d{pi) = -9256 < 0; b(p*) = -224, f(p4) = 160, </(рл) = 3456 > 0 => /¾ = [-0.263 0.868 -0.56б]. Отрицательные значения г/(рг) и */(рз) означают, что лучи, проходящие через вершины рг и ръ, не пересекаются с поверхностью эллипсоида. Следовательно, ребра пирамиды р\рг, р\ръ, ргръ, ргр* и рзр*, инцидентные этим вершинам, не могут полностью проецироваться на поверхность. □ В общем случае тень прямолинейного отрезка pfpj на криволинейной поверхности может быть одной линией, разрываться на несколько линий или вообще отсутствовать. Концы отрезка могут не иметь тени, а внутренние его точки могут,
Геометрические основы компьютерной графики 99 например, ребро ргръ. Предлагается следующий численный метод расчета криво- мшейной тени каркасного объекта, ребра которого в общем случае — криволинейные отрезки. Метод гарантирует достоверное построение тени каркасного объекта на произвольной квадратичной поверхности, а при достаточно частой дискретизации ребер — гладкость изображений криволинейных теней. 2г7 Шаг 1. Ребра каркаса разбиваются на достаточно малые прямые отрезки. Шаг 2. Для каждого отрезка p/Pj вычисляются дискриминанты его концов d, и d}. Шаг 3. Если {dt > 0}C]{d,> О}, то по (1.56, а) рассчитываются ближайшие к источнику света точки Pi = Pi+ *—L, pj = pj + L "i aj пересечения лучей pt-Lt и Pj-Lt с квадратичной поверхностью. В противном :лучае тень отрезка отсутствует. Шаг 4. Рассчитывается изображение отрезка прямой p\p'j на экране дисплея. □ 1.3. Основные задачи геометрической оптики Построение компьютерного изображение трехмерных объектов и сцен основано -:а методе трассировки лучей, моделирующем процесс распространения световых .тучей от момента их испускания источниками до взаимодействия с объектами :цены и попадания в приемник. Основная идея метода сводится к повторению на ЭВМ всех геометрических преобразований, которые бы совершил световой луч .-■.а пути источник — объект — приемник (глаз наблюдателя). Хотя действительных лучей бесконечно много, обычно ограничиваются трассировкой выбороч- -ых лучей, достаточных для достижения желаемой реалистичности изображения .иены—- совокупности объектов и окружающего их интеръера. Например, для изображения полностью видимого отрезка прямой линии достаточно проведения всего двух лучей через его концевые точки. Расчет тени отрезка на криволинейной поверхности требует проведения большого числа лучей через внутренние "очки отрезка. Эти точки должны быть выбраны с такой дискретностью, чтобы томаная линия (изображение тени отрезка) выглядела гладкой дугой. Ключевая задача метода трассировки лучей — определение освещенности произ- =ольной точки поверхности и части световой энергии, содержащейся в отражен- -ом и преломленном лучах. Освещенность создается первичной энергией источ- -иков света и вторичной энергией лучей, отраженных от других объектов сцены. Этсутствие освещенности означает затененность точки. Существование и интен- :ивность вторичной энергии определяются оптико-механическими свойствами материалов— прозрачностью, цветом, шероховатостью и отражательной спо- ;обностью поверхности.
100 Глава 1 Для каждого луча решается задача пересечения с объектами сцены. Распространяясь прямолинейно, луч либо проходит мимо всех объектов и покидает пространство сцены, либо пересекает первый встретившийся на его пути объект. В точке пересечения часть световой энергии поглощается материалом поверхности, а оставшаяся часть энергии первичного падающего луча претерпевает расщепление на вторичные лучи — отраженный и преломленный. Соотношение поглощенной, отраженной и преломленной энергий луча определяется большим числом факторов. Это и физико-механические, и оптические свойства материала поверхности, и ее ориентация в пространстве, и спектральный состав луча, и т. д., и т. п. Каждый из вторичных лучей распространяется до пересечения со следующей поверхностью, порождая третичные лучи, и т. д. Любое взаимодействие с поверхностью уменьшает суммарную энергию отраженных и преломленных лучей. Поглощение энергии происходит также при распространении луча в не абсолютно прозрачной среде. Таким образом, через определенное число столкновений с поверхностями объектов интенсивность луча становится меньшей некоторого порогового значения и отслеживание процесса его распространения прекращается. Абстрагируясь от волновой природы оптического излучения, будем руководствоваться законами геометрической оптики [16]: прямолинейности распространения луча в однородной среде (принцип Ферма), отражения, преломления и обратимости хода светового луча. Наибольшую сложность расчета взаимного положения луча с произвольной поверхностью имеют задачи пересечения, отражения и преломления. Рассмотрим в общих чертах содержание и алгоритмы решения задач геометрической оптики. 1.3.1. Пересечение луча с поверхностью Принцип прямолинейности распространения света в однородной среде позволяет построить алгоритм расчета пересечения луча с ограниченной поверхностью, изображенной на рис. 1.52. Рис. 1.52
'еометрические основы компьютерной графики 101 23 Шаг 1. Рассчитываются все точки q\ пересечения луча pit) = q+Vt,t>0 : неограниченной поверхностью. Для этого решается скалярное уравнение fiq + Vt) = 0 относительно параметра t, если поверхность задана в НФ уравнением f{p) = 0. Если она определена параметрической функцией р(т, 6), то решается векторное ■равнение q+ Vt=p(z,Q) относительно трех параметров t, т и 6. Отсутствие действительных решений t означает, что несущая луч (/) прямая не пересекает поверхность. Шаг 2. Список полученных точек q\ сортируется по возрастанию значений t„ и -о него исключаются элементы с f, < 0, не принадлежащие лучу. Если оставшийся список пуст, то луч (2) не пересекает поверхность. Шаг 3. Ищется ближайший к началу списка элемент, для которого выполняются • словия \|/(<7,')^0 или \у{т„ 6,} > 0 принадлежности точки q\ ограниченной по- зерхности. Невыполнение любого из этих условий означает, что луч (3) не пересекает поверхность внутри ее границ. Найденный элемент является искомой точ- «ой q' на луче (4). СЗ Рассмотрим вычислительные аспекты расчета пересечения прямой с поверхностью. Точное аналитическое решение уравнений/^ + Vt) = 0 или q+ Vt =/>(т, G) юзможно лишь для некоторых простейших поверхностей первого (плоскость в НФ или ПФ) и второго (в НФ) порядков. Эти решения получены в (1.102) и 3d- варианте (1.54)—(1.56). Пересечение луча q + Vt с более сложными поверхностями находится численными методами. Рассмотрим некоторые из них. Корни скалярного уравнения f(q + Vt) - 0 можно найти любым известным численным методом решения нелинейных уравнений [13, 19]: проб, касательных, секущих, итераций и т. п. Простейший для программирования и не требующий зычисления производной df/dt метод проб заключается в трассировке луча от -очки q в направлении вектора Vc шагом At. В точках траектории Pi = q+ Vt, = q + iVAt,1 = 0,1,2,- -еявная функция поверхности имеет значения / =/(р,). Первый же найденный нтервал [th ti+l], на котором выполняется условие //+| < 0, пропорционально дробится точкой -а два интервала \t„ т№)] и [т№>, tl+l]. Из них выбирается интервал [f,',/,'+i] с разно- дачными концевыми значениями НФ, для которых f(t'j)f(t'i+\)<0. Дихотомиче-
102 Глава ский процесс дает последовательность значений {т(Л)} и заканчивается при дос тижении желаемой точности е по аргументу |т(Л+|> - т<*>| < е или (и) функцш |/(т<Л+|>)-Л^)|<е. Основные проблемы метода: П компромиссный выбор шага At: достаточно малого, на котором не будет че^ ного числа пересечений лучом поверхности, ограничивающей малый объем, i в то же время достаточно большого для получения приемлемого машинногс времени расчета; П необходимость ограничения пространства распространения луча габаритам сцены на случай, если пересечения не существует. Параметрическая форма поверхности /?(т, 6) не имеет такого индикатора пересечения ее лучом, каким в НФ является инверсия знака функции/(р). Будем искатг в пространстве параметров I, т и G корни уравнения q + Vt = р(т, G), доставляющие нулевое значение целевой функции J(t,T,Q) = \q+Vt-p(t,eW>0, т. е. квадрату расстояния между лежащими на одной вертикали точками луча к поверхности. Алгоритм МНК-решения задачи минимизации J(t, т, 6), стартуя с начальны* приближений to = 0, то и 6о, обновляет параметры по итерационной формуле ['/+1 */+l 6f+i]=&/ т,- е,] + [Д/,. Ах,- AG,], / = 0,1,2,... 0-1371 Различные методы оптимизации отличаются способами расчета вектора обновлений [А/, Дт, Д6, ]. Метод градиентного спуска полагает [A;,- At, AG,]=-Y,Vy(/,,T,,G,) (1.138,0 и имеет скорость сходимости, зависящую от выбора шага настройки у,, что само пс себе представляет нетривиальную задачу. Квадратичной скоростью сходи мост» обладает метод линеаризации, заключающийся в замене по (1.61,6) поверхности i текущей точке р(т„ G,) касательной плоскостью р(т„ G,) + Р)Дт, + И^А6„ расчете пс (1.102, б) вектора обновлений и нового приближения точки пересечения -1 =>A+i=A+ VA[i (1.138,6 до сходимости по аргументу \[Att Дт, Д6, ]| < е или (и) функции/(f„ т„ G,) < е Большое число поверхностей являются периодическими по одному или обои1 параметрам т и G. Например, если период т функции р(т, G) по параметру т раве- 2л, то р(х, G) = р(т + mk, G) VA: = 1, 2,... [Дг, At, Д6,] = (рМ,)-<7 -Vtt) -Vt -W.
Геометрические основы компьютерной графики 103 Формула обновления (1.137) может вывести параметр за допустимый интервал О < tmin < т < Ттах < ;л. Во избежание потери решения на третьем этапе алгоритма пересечения, где проверяются условия допустимости параметров \у(тп„ 6п,) > О, необходимо после каждого обновления сдвигать значение тж на целое число периодов по формуле т,+, = mod(mod(T,+,, m) + m, m) e [0, tn). (1.139) Итерационные методы оптимизации являются локальными (сходятся к локальному минимуму J{t, т, 6), причем необязательно нулевому), в связи с чем требуется выполнить несколько расчетов с различных начальных значений то и 6о, например, равномерно распределенных в областях их допустимых значений. Полученные решения группируются на прямой q + Vt в окрестностях точек ее пересечения с поверхностью. Далее выполняется сортировка, описанная во втором и третьем шагах алгоритма пересечения. 27 Пример 1.7. Из точки q = [lO 1 о] выпущен луч p(t) = q- Vt в направлении, задаваемом вектором V = [-2 -0.1 -0.2]. Рассчитать пересечение луча с поверхностью, описываемой явным уравнением у = f(x,z) = e_D(xr +z ^ cos(avc)cos(cozz) с параметрами а = 0.02, юЛ = 1 и ы. - 0.5 (рис. 1.53, а). Решение. Так как уравнение поверхности задано в явной форме, будем решать задачу пересечения как задачу поиска корней функции Л(0 = y{t) -f(xU), zU)) = 1 - 0.1/-/СЮ - 2/, -0.20 зависимости вертикального расстояния от точки p(t) = [x(t) y(t) z(t)\ до поверхности. Из ее графика, приведенного на рис. 1.53, б, видно, что луч пересекает поверхность в пяти точках. Ввиду некоторой сложности расчета производной d/i / d/ зададим шаг трассировки луча Д/ = 0.1, допустимую погрешность е = 10-* и выполним поиск первой точки пересечения методом проб. Реализация метода в среде MathCAD показала, что необходимо выполнить 45 шагов трассировки для достижения интервала / е [4.5,4.6] с разнозначными значениями Л(4.5) = 0.0808 и Л(4.6) = -0.066. Пропорциональное дробление этого интервала еще за 4 итерации дало параметр пересечения t\ - 4.553155 с абсолютной погрешностью |A(fi)| = 5.208 • 10-' < 10~6 и точку <?'= [0.8936 0.5447 -0.91 Об]. Заметим, что половинное дробление интервала [4.5, 4.6] с той же погрешностью потребовало бы 14 итераций. Задание слишком большого шага трассировки М> 1.1 приводит к пропуску первых двух ближайших точек пересечения луча с поверхностью и получению сразу третьей точки (¾ = [-0.9861 0.4507 -1.0986] с параметром /з = 7.678274. □
104 Глава ■ Рис. 1.53 £D Пример 1.8. Рассчитать пересечение луча, выпущенного из точк! q = [-8 0 8] в направлении V = [4 0.5 -4], с параметрической поверхностьк (рис. 1.54, а) >(т,б)= [(1 + т-sin(T))cos(6) 1 -cos(t) -(т -sin(T))sin(6)] V0.l7i<i< 1.471. 0<e<1.57t. Решение. Луч ;?(/) = [-8+ 4/ 0.5/ 8-4/], />0, пересекает поверхность р(х, 0) в трех точках. Найдем их методом линеаризации (1.137) и (1.138,6), минимизируя целевую функцию J{t,x,Q) = \p{t)-P^M2 с начального приближения /о = 0 и девяти сочетаний начальных приближений то е {0.1л, 0.75л, 1.4л},0о е {0,0.75л, 1.5л}. На рис. 1.54,6 изображены пространство параметров т и 0, допустимая область их изменения, начальные приближения {то, 6о} и результаты сходимости алгоритма линеаризации с погрешностью б = Ю-6: П приближения {0.1л, 0} и {1.4л, 0} дают сходимость к точке q\ с параметрами /1 = 3.061, Ti = 1.322л, 6i = 0.25л; П приближение {0.75л, 0} дает сходимость к точке q\ с параметрами /г = 2.307. Т2 = 0.549л, 62 = 0.25л; П приближение {0.1л, 0.75л} дает лишь относительную сходимость к параметрам / = 5.911, т = 7.128л, 0 = 0.25л и ненулевому установившемуся значению J - 3.827 *■ 0, в связи с чем этот вариант в список анализа не включается;
Геометрические основы компьютерной графики 105 3 приближения {0.7571,0.75л} и {0.75тс, 1.5л} дают сходимость к точке ц'т, с параметрами Гз = 1.744, тз = 0.459л, 6з = 1.25л; 3 приближение {1.4л, 0.75л} дает сходимость к точке q\ с параметрами U = 2.07, Т4 = -0.511л, 64 = 0.25л; 3 приближение {0.1л, 1.5л} дает сходимость к точке q'5 с параметрами /s = 1.917, is = -0.487л, Gs = 1.25л; 3 приближение {1.5л, 1.5л} дает сходимость к точке q'f, с параметрами Гб = 0.732, те = 1.719л, 6б = 1.25л. Рис. 1.54 Таким образом, сортируя точки q\ по возрастанию параметра tt > 0, получим упорядоченный список точек L = {og, q'3, q'$, q\, q\, q'\), расположенных на луче q + Vt в порядке удаления от начала луча — точки q.
106 Глава 1 На третьем этапе исключим из списка L точки, параметры которых не удовлетворяют условиям 0.1л <т< 1.4л и О<0< 1.5л. Это, во-первых, точка q\ пересечения луча с продолжением поверхности при Тб>1.4л, изображенной на рис. 1.55,а для интервалов параметров 0<т<3.4л и О<0<2л. Во-вторых, это точки q'5 и д'4 с отрицательными значениями т. Первая в оставшемся спи- ке точка <7з=(7 + 1.744К = [-1.026 0.872 1.026J и является точкой q' пересечения луча с заданной поверхностью. На рис. 1.55, б изображены графики итерационных процессов поиска параметров th it и 0,. □ 2 3 4 5 6 Рис. 1.55 1.3.2. Отражение луча от поверхности Зеркальное отражение луча от поверхности (рис. 1.56) строится по следующим законам отражения. П Отраженный луч q' + Mt находится с той же стороны поверхности, что и падающий луч q + Vt,a эти два луча лежат в одной плоскости с вектором нормали N, построенным в точке пересечения прямого луча с поверхностью q'. П Равенство скоростей падающего и отраженного лучей: \V\ = \М\. П Равенство углов падения а и отражения р. Найдем нормальную и тангенциальную составляющие падающего луча: Kl = PTN v =\v\cos(ZVN)N =|k|(Fo7V)7V = (Vo~N)N, ^|| =V~V\. =V-(V°N)N .
Геометрические основы компьютерной графики 107 Рис. 1.56 На основе законов отражения вычислим составляющие и сам вектор отраженного луча: , _,_ (1140) М=А/Х+Мц =V-2[V° N)N. Таким образом, алгоритм расчета отражения луча от зеркальной ограниченной поверхности имеет следующий вид. 7iD Шаг 1. Решается задача пересечения луча q + Vt с ограниченной поверхностью. Если точка q' отсутствует, то луч проходит мимо поверхности. Шаг 2. По (1.61),(1.62) вычисляется нормаль TV к поверхности в точке q'. Шаг 3. По (1.140) находится направляющий вектор М отраженного луча q' + Mt. СЗ 1.3.3. Преломление луча на поверхности Идеальное преломление луча на поверхности раздела двух сред с показателями преломления п\ и m (рис. 1.57) строится по следующим законом преломления. П Преломленный луч q' + Rt находится с другой стороны поверхности, чем падающий луч q + Vt, а эти два луча лежат в одной плоскости с вектором нормали N, построенным в точке пересечения прямого луча с поверхностью q'. Рис. 1.57
108 Глава 1 О Скорость распространения луча в каждой среде обратно пропорциональна ег показателю преломления. Отсюда следует соотношение длин векторов \R\ - пп\ V\, где ип = п\ 1т — относительный коэффициент преломления. СИ Углы падения а и преломления у удовлетворяют закону Снеллиуса—Декарта /?isin(a) = n2sin(y). (1.141 Вычислим нормальную и тангенциальную составляющие вектора преломленного луча: ' 177 T7I2 V о N — N = Rx =\R\cos{y)v±=nn\v\Jl-n*sin2{a)v± = nn\v\,jl - nfy хЦ = sgn((/o]v)iny|(/|2 -4\vxN\2N, °w|' откуда следует вектор R = RL + R\\=n„V + nn sgn(voN^\ Т-Л L,i2 ■n^\VxN\ ■nnVoN N (1.142 Существование преломленного луча в среде с меньшим показателем преломления т < п\ (например, при переходе из воды в воздух) возможно при положительности подкоренного выражения в (1.142), что совпадает с известным в оптике неравенством [16]: И2_Лпкх^| >0 => |г|>ип|гх#1 => 1 >nnsin((x). (1.143) При падении луча на оптически менее плотную среду под углом a>arcsin(l I пп) наблюдается оптический эффект полного внутреннего отражения, при котором преломленный луч отсутствует. Таким образом, алгоритм преломления луча на ограниченной поверхности раздела сред имеет следующий вид. & Шаг 1. Решается задача пересечения луча q + Vt с ограниченной поверхностью. Если точка q' отсутствует, то луч проходит мимо поверхности. Шаг 2. По (1.61), (162) вычисляется нормаль TV к поверхности в точке q'. Шаг 3. Если не выполняется условие (1.143), то преломленный луч отсутствует. Шаг 4. По (1.142) находится направляющий вектор R отраженного луча q' + Rt. Cl I& Пример 1.9. Из точки q = [б 0 0] воздушной среды (т « 1) выпущен луч в направлении V = [-4 0 lj. Найти точку его пересечения со стеклянным (т » 1.52) эллипсоидом, имеющим полуоси гу.- 1, гу = 2, г. = 3 и центр в точке с = [о -1 —i]. а также направления отраженного и преломленного лучей (рис. 1.58).
Геометрические основы компьютерной графики 109 Решение. Составим неявное уравнение f(x,y,z) = 0 и матрицу F эллипсоида по его каноническому уравнению из табл. 1.3: ' х-сг \2 ( У-Су \2 (z-cz^ -1 = 0 => 36х2 + 9у2 +4z2 + 18jm + 8z- 23 = О, F = "36 0 0 j 0 " 0 9 0 1 9 0 0 4; 4 0 9 4Г-23 .^11 = 36 О О 0 9 0 0 0 4 , F21=[0 9 4], £» = 23. Вычислим коэффициенты и дискриминант квадратного уравнения (1.55): a = 580, Ъ = -860, с = 1273, d = 1260. Так как {а*6}f]{d>О}, то прямаяp(t) = q+ Vt пересекается с поверхностью эллипсоида в двух различных точках с параметрами -b-4d , ... t -b + 4d . ... tx= = 1.422, t2 = = 1.544. a a Ближайшая к источнику точка пересечения имеет координаты q = p(tih[0.3U 0 1.422]. Для расчета отраженного и преломленного лучей вычислим по (1.61, а) вектор нормали в точке падения: N = [72/ 18/ +18 8z'+8]=[22.59 18 19.37]. На рис. 1.58 этот вектор, имеющий длину \N\ = 34.78, изображен для удобства в четыре раза короче. Рис. 1.58
110 Глава 1 По (1.140) и (1.142) определяем векторы направлений отраженного и преломленного лучей, предварительно вычислив значения п„ =1/1.52=0.658, N = [0.65 0.518 0.557], V<>N = -2.041 <0, Kx7V=[-0.518 2.878 -2.07], \ухЦ =3.582 , \v\2 -п^УхЦ2 =11.445 >0: M = V-2^°n)n = [-\34S 2.113 3.274], R = n*V-n„ I 2 N = [-2.603 -0.695 -0.315]. □ 1.3.4. Прямая и обратная трассировка лучей На основе закона обратимости можно построить путь светового луча как в прямом направлении от источника L к объекту и от него в приемник S, так и в обратном — от приемника к объекту и источнику. Каждый из методов трассировки лучей моделирует соответствующий процесс распространения света и имеет свои отличительные черты. В методе прямой трассировки генерируется пучок лучей L + Vkt, выходящих из источника во всевозможных направлениях V\, Vi,... На рис. 1.59 показаны варианты распространения лучей в сцене, включающей отражающие, преломляющие и поглощающие свет объекты. Рис. 1.59 Большинство лучей, испущенных источником, не попадает в приемник, а значит, и не влияет на формируемое в нем изображение. Лишь очень малая часть лучей
Геометрические основы компьютерной графики 111 после всех отражений и преломлений в конце концов попадет в приемник, создавая изображение сцены в его рецепторах. На шероховатых поверхностях возникает множество диффузно отраженных лучей. Все их нужно программно генерировать и отслеживать, что лавинообразно увеличивает сложность задачи трассировки. Прохождение луча в неидеальной среде сопровождается рассеянием и поглощением световой энергии на ее микрочастицах. Эти физические процессы чрезвычайно сложно адекватно моделировать на ЭВМ с ее конечными вычислительными ресурсами. Практически ограничиваются применением коэффициента затухания энергии луча на единицу пройденного им расстояния. Аналогично вводятся коэффициенты уменьшения энергии луча при его отражении и преломлении на поверхности раздела сред. С учетом этих коэффициентов отслеживается уменьшение энергии всех первичных и вторичных лучей в процессе их блуждания в пространстве сцены. Как только энергия некоторого луча становится меньше заданного абсолютного уровня или уменьшается в заданное число раз, трассировка данного луча прекращается. Таким образом, главным недостатком метода прямой трассировки является его большая трудоемкость и малая эффективность. При реализации данного метода большая часть работы по расчету пересечений лучей с объектами оказывается проделанной впустую. В следующем разделе предпринимаются некоторые попытки сокращения числа рассматриваемых прямых лучей путем решения уравнений, полученных на основе законов оптики и моделей поверхностей. После недолгих размышлений становится ясно, что для отсекания лучей, не попавших в приемник, достаточно рассматривать наблюдателя 5" в качестве источника обратных лучей. В соответствии с методом обратной трассировки проложим трассу луча S + Vt в направлении V от точки 5" к какой-нибудь точке на поверхности некоторого объекта (рис. 1.60, я). По вышерассмотренным методикам рассчитываются вторичные, третичные и т. д. лучи. Рис. 1.60
112 Глава 1 В результате для каждого первичного луча строится дерево трассировки (рис. 1.60,6), ветви которого составляют вторичные лучи. Ветвление трассы заканчивается, когда луч (/) выходит за пределы сцены или (2) встречается с непрозрачным телом, поглощающим свет, или (3) попадает в источник света, или (4) когда его интенсивность падает ниже порога чувствительности, или, наконец. (5) когда число расщеплений первичного луча становится слишком большим для имеющихся машинных ресурсов. В результате прямая световая энергия (цвет и интенсивность), попавшая в приемник из направления V, слагается из энергий терминальных вершин дерева с учетом их потерь при распространении в оптических средах. Метод обратной трассировки фактически аккумулирует все лучи, в действительности приходящие в приемник из определенного направления независимо от их начала. Это позволяет видеть и изображать на экране: О непрозрачные объекты, поглощающие обратные лучи; О прозрачные объекты, через которые благодаря преломлению наблюдателю видны другие объекты; □ отражения объектов на зеркальных поверхностях, в том числе и блики, соответствующие попаданию обратных лучей в источник света; □ тени, образующиеся в точках поверхности, заслоненных от источника другими объектами; О другие разнообразные оптические эффекты. Количество "зондирующих" обратных лучей, подвергаемых трассировке, ограничено числом точек на поверхностях объектов сцены, видимых из точки 5" и перебираемых с конечным шагом пространственного квантования, обусловленным разрешением экрана. Благодаря этому объем вычислительных затрат в методе обратной трассировки существенно уменьшается по сравнению с методом прямой трассировки. Возможно разумное комбинирование двух методов трассировки для оптимизации алгоритмов и снижения их трудоемкости. Очевидно, что трассировка лучей носит характер рекурсивной процедуры, которая будет сама себя вызывать, как только выяснит, что анализируемый луч отражается или преломляется. Большая часть вычислений при реализации методов трассировки приходится на расчет пересечений лучей с поверхностями, в связи с чем они применяются для изображения оптических эффектов в сценах с небольшим числом объектов. 1.3.5. Лучевые методы построения оптических эффектов Применим методы прямой и обратной трассировки лучей для решения задач построения оптических эффектов: тени, отражения и преломления. Сразу отметим
Геометрические основы компьютерной графики 113 некоторые геометрические и вычислительные особенности, порождаемые нелинейностью поверхности, на которой строится оптический эффект: 3 эффект может быть фрагментарным, т. е. созданным не всеми точками объекта, а лишь теми, в которых выполнены все условия существования эффекта на некотором участке поверхности; 3 эффект непрерывного объекта может быть разрывным, когда тень от двух близких точек объекта падает на разные участки поверхности, удаленные друг от друга в силу ее криволинейности и самоэкранирования; 3 эффект одной точки может быть множественным, когда его видно не в одной, а в нескольких точках поверхности, где одновременно выполнены все условия существования эффекта; 3 большинство численных методов решения нелинейных уравнений имеют локальный характер сходимости, а результат их работы зависит от выбора начальных приближений неизвестных. Следовательно, для получения достоверного результата— всех и именно тех точек поверхности, в которых наблюдается эффект, — необходимо выбирать начальные приближения в окрестности сходимости к глобальному (нулевому) минимуму целевой функции. С учетом первых трех геометрических особенностей становится ясно, что глобальных минимумов целевой функции может быть несколько. Таким образом, качественный алгоритм построения оптического эффекта на нелинейной поверхности должен быть способен: 3 выполнять декомпозицию объекта на множество не связанных между собой точек, каждая из которых обрабатывается независимо от других; 3 генерировать вычислительный процесс с множества различных начальных приближений неизвестных параметров. Период пространственной дискретизации (расстояние между элементами этого множества) выбирается на основе Зё-аналога теоремы Шеннона—Котельникова, т. е. так, чтобы узлы дискретизации оказались во всех возможных областях притяжения минимумов целевой функции; 3 накапливать достоверные решения и отбрасывать недостоверные, доставляющие целевой функции локальный, а не глобальный минимум; 3 фильтровать накопленный массив решений, т. е. удалять из него либо сразу туда не записывать решения, совпадающие с уже существующими или близкие к ним; 3 фрагментировать отфильтрованные решения в компактные группы; 3 максимально использовать возможности параллельных вычислений, заложенные в операционной системе и выбранном языке программирования. Вообще говоря, методы трассировки лучей по самой своей природе идеально подходят для организации параллельной обработки данных. В целом следует признать, что лучевые алгоритмы в совокупности с другими алгоритмами Зё-графики требуют для своей работы значительных машинных ресурсов и на современных персональных компьютерах работают пока еще мед-
114 Глава 1 ленно, особенно при моделировании динамических сцен. Собственно говоря, основной прогресс в развитии компьютерной техники есть постоянное совершенствование аппаратных и программных Зс1-ускорителей. Нет сомнений, что в ближайшее время задачи построения самых сложных оптических эффектов будут быстро решаться в реальном времени. Множество сложных геометрических объектов может быть представлено совокупностью простейших графических элементов — точек и отрезков, а поверхности, на которых строятся оптические эффекты, аппроксимированы системой плоских граней. Отсюда ясна актуальность решения задач построения оптических эффектов точек и отрезков на плоскости. В связи с этим подробнее рассмотрим построение оптических эффектов на плоскости для точки и отрезка, заданного двумя концевыми точками. Желательно иметь описание плоскости элементами нормальной формы {ро, N}. Если плоскость задана элементами параметрической формы {ро, V,W), то по (1.69) ее нормаль равна N— V* W. Возможно, на плоскости задан полигон Р = {р\ ...рпр\} с числом сторон п > 3, по которому должно выполняться отсечение оптического эффекта. Тогда принимаем точку ро = pi, а по (1.117) вычисляем нормаль N = погт(Р). Непосредственное использование тестов ориентации и алгоритмов отсечения, описанных в разд. 1.1.2, возможно при совмещении плоскости эффекта с координатной плоскостью ху методом аффинного преобразования системы координат с помощью функций MAPI, МАРЪ или МАРА, определенных в гл. 2. При построении тени должно быть задано положение источника света. В зависимости от его удаленности от объекта возможны два случая, отличающиеся свойством параллельности лучей (рис. 1.61): П источник, например, светильник, расположен в конечно удаленной точке L. Различные точки пространства q связаны с ней непараллельными расходящимися из L прямыми лучами q + V4i либо сходящимися в L обратными лучами q-Vqiz векторами направления V4 = q-L. Непараллельность лучей приводит к искажению формы тени объекта (У), что делает ее перспективное изображение более естественным; Рис. 1.61
Геометрические основы компьютерной графики 115 3 источник, например, Солнце, бесконечно удален от объекта в направлении вектора L. Источник можно считать бесконечно удаленным, если минимальное расстояние между ним и объектом хотя бы на порядок, т. е. в 10 раз, превышает максимальный габарит объекта. При этом условии максимальный угол расхождения лучей не превышает значения arctg(O.l) = 5.7°, что достаточно близко к 0°. Такая идеализация позволяет считать прямые q + V41 и обратные q—Vi лучи параллельными с векторами направления для всех точек q, упрощает построение тени (2), делает возможным применение групповых матричных методов обработки точек, описанных в гл. 2, но не дает перспективного изображения. При построении оптических эффектов необходимо знать положение их наблюдателя. В зависимости от его удаленности от объекта также возможны два случая, отличающиеся свойством параллельности лучей (рис. 1.62): 3 наблюдатель расположен в конечно удаленной точке S. Различные точки пространства q соединены с ней непараллельными сходящимися в S прямыми лучами q + S41 либо расходящимися из S обратными лучами q - Sq t с векторами направления S, = S-q. Непараллельность лучей делает перспективное изображение оптического эффекта (3) реалистичным, но усложняет его расчет; 3 наблюдатель бесконечно удален от объекта в направлении вектора S. Конечно удаленного наблюдателя можно считать бесконечно удаленным, если минимальное расстояние между ним и объектом хотя бы на порядок больше максимального габарита объекта. Такая идеализация позволяет считать прямые q + S41 и обратные q-Sqt лучи параллельными с равными векторами направления S, = S для всех точек q, упрощает построение оптических эффектов, делает возможным применение групповых матричных методов обработки точек, но не дает перспективного изображения (4). Рис.1.62
116 Глава 1 Используя устоявшуюся терминологию [36], будем впредь называть конечно удаленного наблюдателя и источники света "ближними", а их же, удаленных в бесконечность,— "дальними". Каждый из этих режимов, как отмечалось чуть выше, имеет свои преимущества и недостатки, но применять их следует, руководствуясь конкретными геометрическими условиями. Переходим к изучению лучевых методов построения оптических эффектов точек и отрезков на произвольной поверхности и более детально — на плоскости. 1.3.5.1. Тень Тень точки q на произвольной поверхности образуется в точке q' пересечения с ней прямого луча q + Vqi. При дальнем источнике света рекомендуется задавать вектор его направления в виде V4 - -yL с коэффициентом удаленности у, во много раз большим отношения максимального габарита сцены к длине вектора L. Задача построения тени точки на произвольной поверхности решена в разд. 1.3.1. Более сложный, чем точка, графический объект представляется системой точек, для которых тени строятся однотипно. Возможность пересечения прямого луча q + Vj с плоскостью {ро, N} в точке q' (рис. 1.63) определяется числом При vv = О луч (У) проходит параллельно плоскости, нигде ее не пересекая. Если v, * 0, то по (1.102,6) находим параметр и точку пересечения прямой {q, V4) с плоскостью {ро, N}: '* = _(po~<])°n „. {po-q)°N , я =ч+- Vq°N (1.144) Рис.1.63
Геометрические основы компьютерной графики 117 При 1Ч = О точка q лежит в плоскости {ро, N) и согласно (1.144) совпадает со своей тенью: q' = q. При t4 > О луч (2) пересекает плоскость впереди точки q и дает оействительную тень q1. Условие существования тени 1Ч > О геометрически означает, что векторыpo-qn Vq одинаково ориентированы относительно плоскости, т. е. образуют с нормалью N однотипные углы: либо оба острые, либо оба тупые. При условии -1 < tq < О луч (3) пересекает плоскость в точке q' раньше, чем доходит до точки q, а при t4 < -1 луч (4) вообще удаляется от плоскости. Таким образом, при 1Ч < О тень является мнимой. Важным аспектом построения тени является ее видимость наблюдателем. Даже если тень точки существует, она будет невидима, когда наблюдатель и падающий туч находятся по разные стороны от плоскости. Тогда отпадает необходимость самого расчета тени. Таким образом, условия видимости и существования тени точки имеют следующий вид: коа<0 Ы'я ^ I гДе vpo =Vpo oN, o = Spo oN. 0-145) Первое в (1.145) условие видимости тени геометрически означает, что векторы 1' и S. противоположно ориентированы относительно плоскости, т. е. из двух углов ZVp N и ZSp N один острый, а другой — тупой. Построение тени отрезка ab на плоскости {ро, N} (рис. 1.64) требует анализа взаимного расположения концевых точек отрезка а и Ъ относительно плоскости и источника. Каждая концевая точка q - а либо q - b может располагаться в одном из четырех положений: Рис.1.64 3 при v4 = 0 на равном с источником удалении и по одну сторону от плоскости; 3 при {vq ф О/Л \tg < -I/ дальше от плоскости, чем источник;
118 Глава 1 П при \Уа* О/Л {-1 <tg <0\ по разные с источником стороны от плоскости; П при \vg * QjT\\tq > 0/ между источником и плоскостью. В табл. 1.5 приведено 16 возможных вариантов образования тени отрезка ab: Таблица 1.5 a \ v„*0 Ъ „ = о '„<-! -1 < h < о '„>1 vb = 0 d-*2d-a' a'-+c' v„*0 '»<-! </->2</-я' я'-^2я'-^' -l</,<0 d-+2d-V d-*2d-b" [a',d] tb>l b'^>c' b' -> 2b' -a' [d,b'] [a',b'] П в пяти вариантах тень отсутствует (прочерки в таблице): если оба конца ab расположены не ближе к плоскости, чем источник (/), либо оба они лежат по другую сторону от плоскости, чем источник (2); П в трех случаях тень имеет вид отрезка q\ qr. когда один из концов ab находится между источником и плоскостью, а другой там же (3) либо ниже плоскости (4). Точка пересечения отрезка с плоскостью вычисляется как , (po-a)°N /, \ d = a+^aW{b-a); □ в восьми вариантах тенью отрезка является полубесконечная прямая — луч q\ -> qi, начинающийся в точке q\ и уходящий через точку qi в бесконечность в направлении qi-qi. Например, при {vfl =0}n{fi ^0} луч L->a параллелен плоскости, и только один конец отрезка b имеет действительную тень „ г.- (л)-д)оЛЧ/ Vb о N В качестве второй точки луча тени (5) можно принять вычисляемую по (1.144) проекцию qi - с' средней точки отрезка с = 0.5(я + Ь). При {/„ <-l}f]{-l <tb <0\ концы отрезка (6) имеют мнимые тени а' и Ь', но, тем не менее, отрезок отбрасывает тень в виде луча, выходящего из точки d в направлении точки d + (d- b') - 2d- b'.
Геометрические основы компьютерной графики 119 В связи с возможностью существования тени отрезка в виде луча необходимо модифицировать описанные в разд. 1.1.2 алгоритмы отсечения clip2_cross и clip2_test так, чтобы они могли работать не только с отрезком аЬ, но и с лучом .7 —» Ь. Рассмотрим два варианта модификации. 1. Луч а —» А заменяется отрезком [а, а + (Ь - а)у] с коэффициентом у —» оо. 2. В модифицированный вариант функции clip2_cross(ab, Р, mod) введем дополнительный аргумент mod, задаваемый равным 0, если ab — отрезок [а, Ь],н 1, если ab — луч а—>Ь. При mod = 1 изменения алгоритма на рис. 1.18, б минимальны и заключаются в том, что расчет концов неотсеченной части луча а—>Ь вместо табл. 1.1 выполняется по более простой в программировании табл. 1.6. Таблица 1.6 ^\СТ2 CTl ^^\ сп<0 0<сп<1 ai>l <Т2<0 [a, a] [a, a + Vu\] [a, a + Vox] 0 < 02 < l [a, a + V<j2] [a+ Vo\,a+ V02] [a + Vu\, a + V02] <T2> 1 [a, a + Vui] [a+ Voi,a + V02] [a+ Vo\,a + V02] 'JD Пример J. 10. Построить тень пирамиды с вершинами А=[3 4 -1], Р2=[2 4 2], Ръ =[5 3 2],р4=[2 2 0] на плоскость, заданную отрезками Av = 1, hy - 2, h, - 3, от источника света, расположенного в точке L = [4 2 l]. Направление на дальнего наблюдателя задается вектором S = [1 1 v7 J. Проанализировать изменение тени при удалении источника в бесконечность вдоль вектора L (рис. 1.65). Решение. Плоскость тени описывается уравнением в отрезках (1.74, а) х у Z , —+—+-=1 1 2 3 •1ли неявным уравнением 6х + Ъу + 2z - 6 =0 и имеет вектор нормали \=[б 3 2]. Выбрав на плоскости точку ро =^z° = [О 0 з], оценим по (1.145) зидимость точек тени: Vpo=p0-L = [-4 -2 2], vpo=-26, Spo=S, и =14.29 =>vpoo<0.
120 Глава 1 Рис.1.65 Условие видимости выполнено. Приступаем к расчету тени точек по формулам V, = Pl-L,Vl= Vt°N, tl = iP0-Pi>N t р'.=р.щ: Vx=[-\ 2 -2],vi=-4^0,n=5.5>0, A=[-2.5 15 12 V2=[-2 2 \],vi = -4*0,t2 = 5.5>0, p'2 = [-9 15 7.5] F3=[l 1 l], v3 = И *0, Гз = -3.364 <0, ft =[1.636 -0.364 -1.364]; VA = [-2 0 -l], V4 = -14 * 0,/4 = 0.857 > 0, p\ = [0.286 2 -0.857] Удовлетворяющие условию существования тени f;>0 значения и, 1г и in означают, что ребра пирамиды р\рг,ргр* и р\рь имеют на плоскости действительные тени. Отрицательное значение 1ъ сигнализирует, что точка ръ отстоит от плоскости дальше источника и у нее есть только мнимая тень р'у. Следовательно, тени ребер р\ ръ, ргръ и р*ръ представляют собой расходящиеся на плоскости лучи p'j + WjT (/ е {1, 2, 4}, т> 0) с направляющими векторами Wi = р\-р'т, и общей задней точкой схода р'т,. На рис. 1.66, я изображена рассчитанная MathCAD-программой сцена, включающая оси координат, объект, источник света, теневую плоскость и тени ребер объекта на ней. Ракурс, соответствующий направлению на дальнего наблюдателя S = [l 1 v7 J в системе координат сцены, является диметрической проекцией
Геометрические основы компьютерной графики 121 на ортогональную к наблюдателю плоскость и очень наглядно отображает трехмерный мир на плоскости. Рис.1.66 Заменив в исходных данных положение источника света L на yL, рассчитаем тень объекта при у > I — удалении источника в бесконечность вдоль вектора L. На рис. 1.66, б приведены положения тени пирамиды при у = I, у = 1.5 и у = 100. Последнее значение у соответствует практически дальнему источнику света. Анализ изображений тени показывает, что с удалением источника она уменьшается в размерах, достигая в пределе у -> оо размеров объекта. При этом уменьшаются и ее перспективные искажения. СЗ 1.3.5.2. Отражение Отражение точки q от произвольной поверхности p(t, т) наблюдается в такой точке q' ep(t,x) (см. рис. 1.56), где выполняются все перечисленные в разд. 1.3.2 законы отражения. Векторы падающего V„(t,x)=p(t,i)-q, отраженного M(t, т) лучей и нормали, вычисляемой по достаточно сложной формуле (1.61,6) как „(,)Т)=Эф1)хЭф1), at ох :вязаны уравнением отражения прямого луча (1.140): M{t,x)=p(t,x)-q-2((p{t,x)-q)°N{t,x))N{t,x). (1.146,я)
122 Глава Из принципа обратимости лучей следует соотношение -Vq =-M-2{-Mo~n)n, откуда получаем более простое по сравнению с (1.146, я) уравнение отражены* обратного луча p(f,T)-q = M(t,T)-2{p(f,T)oN(t,xfi([,T). (1.146, f, Отраженный луч начинается в точке p(t, т) и с точностью до скалярного множителя X имеет вектор направления на наблюдателя M(t,i) = XS/Al„), (1.14Ъ где £;,о.т) = S при дальнем и S^.xi = S-p(t,T) при ближнем наблюдателе. Знак числа X служит индикатором направления отраженного луча относительно наблюдателя. При X > О отражение действительное, а при X < 0 — мнимое, т. к. отраженный луч удаляется от наблюдателя в противоположном направлении. Решение уравнений (1.146,о) либо (1.146,6) совместно с (1.147) относительнс всех допустимых переменных {/, т, Я.>0} имеет перечисленные в начале разд. 1.3.5 свойства, изучаемые здесь более подробно, и следствия из них: П отражение может быть множественным: решение представляет собой набор разных точек q'k =/?(/*, та)' к> 1, в которых наблюдатель видит отражени» одной и той же точки q на произвольной нелинейной поверхности p(t, т); П отражение может быть разрывным: нельзя соединять точки отражения друг с другом, даже если соответствующие точки объекта были соединены, например, ребром; П отражение может быть фрагментарным: возможно, что решение {t, тД>0 пусто, а отражение отсутствует. & Пример 1.11. Построить отражение пирамиды из примера 1.10 (см. рис. 1.65 от криволинейной поверхности из примера 1.7 (см. рис. 1.53, о), описываемое явным уравнением у = f(x,z) = e~fl^2+z2Jcos(avv)cos(iorz), а = 0.02, сод = 1, со, = 0.5. Направление на дальнего наблюдателя задается вектором S = [l 1 l], соответствующим изометрической проекции.
Геометрические основы компьютерной графики 123 Решение. Составим неявное уравнение поверхности y-f(x, z) = 0 и по (1.61, я) вычислим нормаль к ней в точке p(x,z)= [х f(x,z) z\: Эх Эг N{x,z) = cos(a).z)(2arcos(a)Jl.jc)+a)J(. sin(a)^x)) ~aV +z /cos(io;(jc)(2flzcos(a).z)+a)zsin(a)zz)) Нелинейное векторное уравнение (1.146,6) с вектором M(x,z) = \S принимает следующий вид: p(x,z)-g = X S- v . v " N(x,z)\. у N(x,z)°N(x,z) J Его численное решение относительно х, z иХ>0 дает точки тени q' = р(х,z). При X < О отражение отсутствует и не изображается. На рис. 1.67 изображена рассчитанная MathCAD-программой изометрическая проекция сцены, включающая объект, зеркальную криволинейную поверхность и отражение в ней объекта. Каждое ребро пирамиды заменялось цепочкой из 21 точки. Начальные приближения {x,z} выбирались из всевозможных сочетаний (всего их 24) элементов списков х е {1, 3,4, 5, 7, 10} иге {1, 3, 5, 7}. Анализ отражения убеждает, что оно, действительно, имеет множественные и фрагментарные свойства. □ ,'V^-V ^ ——-■ 4 3 2 1 y 0 Рис.1.67
124 Глава 1 В частном случае плоской параметрической поверхности {ро, V, W) с нормалью N= Vx W- const и ближнего наблюдателя подстановка в (1.146, я) выражения M(t,i) = X(S-p(t,i)) и свойство ортогональности [Vt + Wx)o N -0 дают нелинейное уравнение X(S - р0 - Vt - Wx)= р0 + Vt + Wx-q-2({p0 -q)o n)n . Его точное решение Г v -1 [а Р Xh(q-Po-2((q-po)oN)N) W _Po~S определено при векторе ро- S, не лежащем в отражающей плоскости. При дальнем наблюдателе подстановка M(t, т) = KS в (1.146, б) дает следующее линейное уравнение и его точное решение при S IN: -1 v p0 + Vt + Wx-q = XS-2X(s°N)N => [f х ^=(^-/¾) а Р Х + 1 Х + 1 (1.148, д) (1.148,6) V W 2(s°n)n-S В обоих случаях отражение точки q действительно при X > 0 и наблюдается на поверхности неограниченной плоскости в точке q' =ро+ Vt + W\. Задача построения отражения точки на плоскости имеет простое геометрическое решение (рис. 1.68). Вычислим по (1.26, я) симметричную к плоскости точку q°=q + 2((p0-q)oN)N (1-149) Рис. 1.68
Геометрические основы компьютерной графики 125 и выпустим из нее луч q° +S Dt. Наблюдатель видит отражение точки q в точке я пересечения луча с плоскостью. Тип отражения определяется соотношением знаков чисел v„ = (q -ро) о N и о = Sp ° N . При v4a > 0 точка q и наблюдатель расположены по одну сторону от плоскости, а вычисленное по (1.150) отражение (7) действительно. При v^a < 0 по одну сторону от плоскости находятся наблюдатель и точка <7° (2), а отражение является мнимым. Точки q° и q' лежат на одном прямом луче q° —> S и визуально сливаются в одну точку. Зрительная система человека размещает отражение объекта за зеркалом, а не на его поверхности. Контур зеркала является как бы окном, через которое наблюдатель рассматривает виртуальный (кажущийся) объект. Таким образом, для расчета отражения точки q от зеркальной плоскости достаточно найти по (1.149) симметричную точку q° и при выполнении условия v4a > 0 считать ее действительным отражением. Построение отражения отрезка ab на плоскости {ро, N} (рис. 1.69) начинается с анализа взаимного расположения концевых точек отрезка а и b относительно плоскости и наблюдателя. Четыре варианта этого расположения приведены в табл. 1.7: Таблица 1.7 ^г-^~^ v„a<0 »'„cr > 0 vho < 0 l°,d] v„o > 0 Ы k H !!1 наблюдатель видит полное отражение a°b°, если оба конца отрезка (7) расположены с ним по одну сторону от плоскости; П отражение отсутствует (прочерк в таблице), если оба конца отрезка (2) расположены по другую сторону от плоскости, чем наблюдатель; И в двух случаях наблюдается неполное отражение q d при пересечении отрезком (3) плоскости в точке , (/¾ -a)oN i, \ , d = а+ -^—f (b-a) е ab. (b-a)°N
126 Глава 1 Рис.1.69 & Пример 1.12. Построить отражение пирамиды с вершинами л=[2 2 -2], рг = [\ 3 1], /тз = |4 2 -1], />4=[1 0 -lj от плоского зеркала в форме параллелограмма, три вершины которого отсекают на осях координат отрезки Av = 1, h}. = 3 и h. - 2. Наблюдатель находится в точке Сравнить отражения при удалении наблюдателя в бесконечность вдоль вектора yS при у > 1 (рис. 1.70). Рис. 1.70 Решение. Плоскость зеркала описывается неявным уравнением 6л + 1у + Зг - - 6 = 0 и имеет нормаль N = [б 2 3]. Выбрав на ней точку р0 =h.z° =[0 0 2],
Геометрические основы компьютерной графики 127 вычислим индикаторы v, = (Pj-po) ° N ориентации вершин /?, относительно плоскости, а по (1.149) — вершины симметричной пирамиды ,o=_+2(£oza)i N №N N: vi = 4 > О, vz = 9 > О, v3 = 19 > О, Р° = [\.02 1.673 -2.49] Pi £ = [-1.204 2.265 -0.102] Л [-0.653 0.449 -3.327] V4 = -3 < 0, р4 = & -735 0.245 - 0.633]. Поскольку о - (S -ро)о N = 10.485 > 0, то из всех вершин пирамиды лишь рл находится с наблюдателем по разные стороны от плоскости зеркала и не имеет действительного отражения. Вычислим точки . {ро~ Pi)°N i \ di* = Р' + 7 Г77 ^4 ~~ Pi Iе PiP* {P4-Pi)oN пересечения бесконечной плоскости {ро, N} с ребрами пирамиды, смежными с верш иной/74 (рис. 1.71, я): ¢/,4 =[1.429 0.857 -1.429], </24=[1 °-75 - 0.5], </34 = fr-409 0.273 -l]. Таким образом, отражение пирамиды от бесконечной плоскости зеркала составляют отрезки р?р%, р?р$, р%р$, pfd14, p%d24 и /?3^34- Второй этап расчета отражения состоит в проецировании всех объектов сцены на некоторую картинную плоскость, допустим, координатную плоскость ху. Проецирование является центральным, т. к. как наблюдатель как бы испускает проецирующие лучи из центра— конечно удаленной от сцены точки 5 = рх sy s,\. Не вдаваясь пока (до подробного изучения в гл. 2) в методику центрального проецирования, отметим ее сходство с алгоритмом построения тени, в котором глаз наблюдателя является источником обратных лучей. Заключительный этап состоит в отсечении проекций отрезков отражения полигоном проекции зеркала. На рис. 1.71, а изображена рассчитанная MathCAD- лрограммой центральная проекция сцены. Пунктиром обозначены отсеченные фрагменты отрезков отражения. Заменив в исходных данных положение наблюдателя S на yS, рассчитаем отражения пирамиды при удалении наблюдателя в бесконечность вдоль вектора S. Для ряда значений у= 1, у= 2 (рис. 1.71,6) и у = 5 (рис. 1.71, в) углы горизонтального обзора сцены составляют соответственно 106°, 56° и 23°. Последний случай практически эквивалентен дальнему наблюдателю с коэффициентом
128 Глава 1 у —> оо. Соответствующий ракурс с вектором направления является кабинетной косоугольной проекцией на плоскость ху и широко применяется для отображения трехмерного мира на плоскости. Анализ изменения отражения показывает, что с удалением наблюдателя уменьшаются как его размеры, так и перспективные искажения. О *> б Y=5 Рис. 1.71 1.3.5.3. Преломление Преломление точки q на произвольной поверхности p(t,i) раздела двух сред с показателями преломления т и т наблюдается в такой точке q'ep(t,i) (см. рис. 1.57), где выполняются все перечисленные в разд. 1.3.3 законы преломления. Векторы падающего V4(t, т) = p(t, т) - q, преломленного R(t, т) лучей и нормали dt дх связаны уравнением преломления прямого луча (1.142): Я=яп(/>-<7)+Лп sgn((p-q)°N)j(p-q)\2 -nl\(p-q)xN\ -nn(p-q)oN\U. —12 (1.151,я)
Геометрические основы компьютерной графики 129 Из принципа обратимости лучей следует уравнение пречомления обратного луча: "п(/>-?)=Я+ sgn(/?o7v)J/7n|/?|2-|/?x/v| -RoN N. (1.151,6) Преломленный луч начинается в точке p(t, т) и с точностью до скалярного множителя К имеет вектор направления на наблюдателя R(t,^ = XS^, (1152) где SlM = S-p(t,t) при ближнем и Spdz) = S при дальнем наблюдателе. Знак числа X служит индикатором направления преломленного луча относительно наблюдателя. При X > 0 преломление действительное, а при К < О — мнимое, т. к. преломленный луч удаляется от наблюдателя в противоположном направлении. Дополнительные условия существования действительного преломления, означающие отсутствие эффекта полного внутреннего отражения, имеют вид, аналогичный (1.143): \р-4>»4р-ч)*Ч- (1153) Решение уравнений (1.151, я) либо (1.151,6) совместно с (1.34, в) и (1.34, г) относительно всех допустимых переменных {t, тД > 0} имеет перечисленные в начале разд. 1.3.5 свойства, изучаемые здесь более подробно, и следствия из них: П преломление может быть множественным— решение представляет собой набор разных точек q'k =£>('*,т*), А:> 1, в которых наблюдатель видит преломления одной и той же точки q на произвольной нелинейной поверхности P(t, т); 1 преломление может быть разрывным — нельзя соединять точки преломления друг с другом, даже если соответствующие точки объекта были соединены, например, ребром; 3 преломление может быть фрагментарный — возможно, что решение {/, тД > 0} пусто, а преломление отсутствует. JiJ Пример 1.13. Внутри янтарного эллипсоида с полуосями а = 2, b-Ъ, с = 2, центром в начале координат и коэффициентом преломления п\ = 1.6 находится пирамида (рис. 1.72, а) с вершинами р,=[-1 2 -1], р2 = [\ 2 1],Рз = [-\ 0 \],р4=[\ 0 -1]. Построить преломленное изображение пирамиды, видимое наблюдателем из точки 5 = [4 4 16J воздушной среды с коэффициентом преломления т - 1.
130 Глава 1 Решение. Поверхность действительного эллипсоида описывается следующими неявным (см. табл. 1.3) и параметрическими (1.129, а) уравнениями: Кр) = KbJ f -Л \CJ 1=0; p(t,x)=[as'u)(t)s'm(x) />cos(/) csin(/)cos(t)], t e [0, n]. т e [0, 2л]. Нормаль к поверхности эллипсоида в точке p(t, т) получим по (1.61, б): N(l,x)= [*csin2(/)sin(t) ас sin (f)cos(/) ab sin2 (t)cos(x)\. Все вершины пирамиды лежат внутри эллипсоида, о чем свидетельствуют отрицательные значения неявной функции поверхности: /(/><) =/(/*) = -0.0556 < 0, f(p3) =f(pt) = -0.5 < 0. Благодаря выпуклости эллипсоида остальные точки ребер пирамиды также являются внутренними и могут иметь преломленные лучи. На рис. 1.72, б представлен результат расчета преломления MathCAD- программой. Каждое ребро пирамиды заменялось цепочкой из 50 точек. Для каждой такой точки q решением уравнений (1.151,6), (1.152) при 5,,(,,,) = S-p(t,x) рассчитывалась точка p(t, т) на поверхности эллипсоида, в которой преломляется луч, идущий от q к S. Отсутствие решений для точек вблизи вершин pi и /?4 объясняется, по-видимому, невыполнением условий существования преломленных лучей X > 0 и ип|я(/,г)| > |/?(/, г)х N(t, х)\. Рис.1.72
Геометрические основы компьютерной графики 131 Благодаря выпуклости поверхности эллипсоида (сравните ее с поверхностью в примере 1.11) практически при любых начальных приближениях параметров t(0\ т<°) и Х<°> алгоритм построения преломления приводит к одинаковому результату. Это относится даже к тем случаям, когда начальная точка p(t(0), т(0)) находится на противоположной к наблюдателю стороне поверхности эллипсоида. Кажущийся на первый взгляд логичным выбор начального приближения p(t(0), т(0>) в точке пересечения отрезка qS с поверхностью эллипсоида приводит к решению дополнительной нелинейной задачи поиска этой точки, которая также требует задания начальных условий. В итоге трудоемкость задачи возрастает вдвое. Из двух вариантов оптического алгоритма, решающих нелинейные векторные уравнения преломления прямого (1.151, я) и обратного (1.151,6) лучей, второй вариант проявил себя лучше как по скорости сходимости (машинному времени расчета), так и по более широкой области сходимости, что отразилось в большем числе полученных точек изображения пирамиды внутри эллипсоида. □ Получим геометрические решения задачи преломления точки на пчоскости для разных вариантов удаленности наблюдателя. П При дольнем наблюдателе требуется найти на плоскости с нормалью N такую точку q', чтобы преломленный в ней луч имел направление S (рис. 1.73). В первую очередь с помощью векторного или скалярного произведений нормированных векторов 5 и N вычислим значение g = sin(v)= |SxJVJ = V1 -{JS°nJ <1, (1154) откуда получим tg(Y) = --L=, sin(a)=A Cos(a)=^LZ^ tg(a)=-*^. Рис. 1.73
132 Глава 1 Проведем из точки q ортогональную плоскости прямую q + Nt и луч q + St. параллельный преломленному лучу, до их пересечения с плоскостью в точках o=q+U-4>N)N,P' = q+bzBh]Ls SoN (1.155) Выбор точки q' на луче о'-*р' обеспечивает компланарность падающего, преломленного лучей и нормали. Рассматривая прямоугольные треугольники qo'р' и qo' q' с общим катетом q о', вычислим искомую точку преломления на плоскости раздела сред: , ,, tg(g), , Л , I l-g2 , , Л (1.156) Зрительная система человека размещает преломленное изображение точки q в точке qn с той же стороны от плоскости, что и точка-образ, на равном расстоянии от точки q': f=rf-W-$ (1157) Отношение расстояний от точек q" и q до плоскости составляет число _ cos(y) _ 1 g l-g' cos(a) "\nl-g2 \\-igKf 90 y° Рис. 1.74 При наблюдении объекта, находящегося в более плотной оптической среде, из менее плотной среды (п„ > I) он кажется приподнятым, как бы находящимся
еометрические основы компьютерной графики 133 ближе к плоскости преломления, чем в действительности (п > 1). Наоборот, при наблюдении из более плотной среды (пп < 1) объекты кажутся отстоящими от плоскости дальше (п < 1). На рис. 1.74 построены графики зависимости т](у, пп) кажущейся глубины преломленной точки при взгляде на нее под углом у из воздуха в воду («п = 1.33), в стекло (пп - 1.52), в алмаз (пп = 2.42) и из воды в воздух (лп = 0.75). Рассмотрим условия существования преломленного луча. • Во-первых, это соотношение знаков чисел »V = (q - Ро) ° N, о = S о N, характеризующих взаимное расположение точки и наблюдателя. При v¥a > 0 луч q + St удаляется от плоскости. При v„a < 0 точка q и наблюдатель расположены по разные стороны от плоскости раздела сред, что является необходимым условием видимости эффекта преломления. • Во-вторых, это условие существования решения в (1.156). При пп > 1 всегда будет sin(a) < sin(y), точка q' располагается между точками о' и р', а преломленный луч всегда существует. При нп < 1 точка q' лежит на продолжении луча о' -> р' лишь в отсутствие эффекта полного внутреннего отражения, т.е. при sin(a) = g/nn< 1— условии определенности подкоренного выражения в (1.156). Например, при переходе луча из воздуха в воду (/in = 0.75) предельное значение угла преломления упр = arcsin(nn) = 48.8° достигается при угле падения а->90°. Пунктирный график на рис. 1.74 стремится в бесконечность при у -> угр и объясняет, почему из-под воды весь воздушный мир виден, во-первых, лишь в конусе с углом раствора 2упр = 97.5°, а во-вторых, — приподнятым. При nn <g < 1 получим значение sin(a) > 1: не найдется ни одного падающего луча, который преломится в более плотную среду в направлении вектора S. Например, при взгляде из-под воды под углом у > угр видна лишь отражающая поверхность. Таким образом, решение задачи преломления действительно при \vqo<0}n{0<g<nn}. (1.158) ID Пример 1.14. Пирамида с вершинами Рх=[\ 3 I], Р2 = [\ 3 3], ft = [3 1 1], Р4 = [0 0 1] погружена в стеклянный аквариум, доверху наполненный водой (лв = 1.33), так что вершины pi и рг находятся в воздухе, а вершины ръ и ри — в воде. Размеры аквариума rfv = 3, dy — 2 и d. = 3. Построить изображение каркаса пирамиды без учета преломления лучей в тонких стенках аквариума. Вектор направления на дальнего наблюдателя равен S = [2 1 з]. На рис. 1.75, а приведен эскиз сцены с аквариумом без воды.
134 Глава ' Решение. Изображения погруженных частей ребер пирамиды искажаются из-за преломления лучей на поверхностях раздела воды и воздуха. По положительныу знакам координат вектора S заключаем, что плоскостями преломления являютс* передняя (фронтальная), верхняя (горизонтальная) и правая (профильная) стенки аквариума. Зададим их общую точку Po=[dx dy dz\=\b 2 з] и нормали единичной длины Nf = z°, Nh =у°, Np =х°. Вычислим точки пересечения ребер пирамиды ptpj с поверхностью верхней грани {ро, Mi}: di3=[2 2 0.5], dl4= [0.667 2 О.ЗЗЗ], d23=[2 2 2], d24=[0.667 2 2.333]. Отрезки пирамиды р\ pi, р\ d\i, р\ d\n, рг dn, pi du находятся в воздухе и видны наблюдателю без искажений. Отрезки dnpi, d\4p*, dnpi, dup* и рзр*, находящиеся в воде, имеют преломления на бесконечных плоскостях {ро, Nr}, {ро, Nh} и {ро, Nv). т. к. для всех их точек д выполнены все условия в (1.158): v4 < 0, аг = 3 > 0, оъ - 1 > 0, аР = 2 > 0 => vq at < О, \<ч сь < О, v4 аР < 0; л„ = я» = 1.33 ^ gf = 0.598 < /in, gh = 0.964 < л„, gP = 0.845 < л„. После вычисления по (1.155) и (1.156) преломлений подводных отрезков они отсекаются полигонами ближних к наблюдателю граней аквариума. Проиллюстрируем это на примере ребра pip*. Точки pi и р* имеют следующие преломления на плоскостях фронтальной, горизонтальной и профильной граней аквариума: ftf=[3.9 1.45 3],fth= [3.583 2 1.875], др =[3 1 l], /»«=[0.9 0.45 3], P4h =D-166 2 2.749], йр=[з 0.781 3.342]. Рис.1.75
Геометрические основы компьютерной графики 135 После отсечения отрезков р'^Рм, РзъР4Ь> РзрР4р полигонами соответствующих граней получим отрезки, изображенные пунктиром на рис. 1.75, а. Конечный результат расчетов, выполненных с помощью программы MathCAD, показан на рис. 1.75,6. Там же изображены преломления задних ребер аквариума в трех его ближних гранях, вычисленные аналогично преломлениям ребер пирамиды. □ □ При ближнем наблюдателе найдем на плоскости {ро, N} такую точку q', чтобы преломленный в ней луч прошел точно через точку S (рис. 1.76). В отличие от случая с дальним наблюдателем здесь нельзя сразу найти значение 8 = sin(y). Рис.1.76 Опустим из точек q и S перпендикуляры на плоскость [ро, N] до пересечения с ней в точках o' = q+((p0-q)°N)N, р = S + ((р0 -S)°n)n. (1.159) Вычислив расстояния d=\p'-olhq = \o'-q\,hs=\p'-S\, составим уравнение с одним неизвестным g для суммы d- dq + ds длин отрезков d4 = h4 tg(a) uds = hs tg(y): K-g2 Vi -g2 Ввиду отсутствия аналитического решения оно должно искаться каким-либо численным методом. В качестве начального приближения можно использовать значение JQ) - \р-°1 8 "IM'
136 Глава ' соответствующее а = у и прохождению луча от q до S через точку с'. Поел; решения нелинейного уравнения (1.160) найдем соотношение длин отрезков 8 = d41 ds, наблюдаемое на плоскости преломление Я=о+-2-(р'-о) a и аналогичную (1.157) виртуальную точку q": Рассмотрим условия существования преломленного луча: • лри /и = пг луч от точки q до точки S идет без преломления (а = у) по кратчайшей прямой {q, S}, пересекающей плоскость в точке с'; • при т > т точка q' смещается в сторону точки о' в такое положение, где sin(y) / sin(a) = ип > 1; • при п\ < пг всегда найдется положение точки q" между точками с" и р' с соотношением углов sin(y) / sin(a) - яп < 1. Отличие от варианта преломления с дальним наблюдателем заключается в том, что угол преломления у для различных точек q не фиксирован, а образуется согласно закону Снел- лиуса—Декарта (1.141) таким образом, что все виртуальные точки qn видны наблюдателю в конусе с углом раствора 2arcsin(//n). Вне этого конуса наблюдается эффект полного внутреннего отражения. Таким образом, решение задачи преломления на плоскости действительно при v„c<0, где vq = (q-Pu)°N, o = (S-Po)°N. (1.162) Построение преломления отрезка аЪ на плоскости {ро, N} требует анализа четырех вариантов взаимного расположения концевых точек отрезка а и b относительно плоскости и наблюдателя, отраженных в табл. 1.8: Таблица 1.8 ^Г"^-^ vjo < 0 vac > 0 V/,o < 0 [a',b'] [d,V] vha > 0 [a',d] • наблюдатель видит полное преломление a'b'', если оба конца отрезка расположены с ним по разные стороны от плоскости; • преломление отсутствует, если оба конца отрезка и наблюдатель расположены по одну сторону от плоскости;
Геометрические основы компьютерной графики 137 • в двух случаях наблюдается неполное преломление q'd при пересечении отрезком ab плоскости {ро, N} в точке d = a+(po-f»{b_a)sab (b-a)°N v ' ?D Пример 1.15. Фотокамера лежит в воде на дне круглого бассейна радиусом R = 5 м на глубине Л = 2 м и смещена от центра на расстояние г - 3 м. Над бассейном построен купол в виде каркасной полусферы радиусом R с угловым шагом параллелей и меридианов, равным 30° (рис. 1.77). Рассчитать изображение купола в камере. -h 1 Рис.1.77 Решение. Зададим систему координат с началом в центре поверхности воды и позицией камеры S = [г -И о]. Плоскость преломления имеет нормальное описание {ро, N} с элементами р$ = [о 0 0]h7V = [o 1 о]. Параметрическая модель гладкой поверхности полусферы приведена в (1.129, а): p{t,i)= K[sin(f)sin(x) cos(f) sin(f)cos(x)] V/ e [0, n I 2], т e [0, 2л]. Для получения узлов каркаса — точек пересечения п = 3 параллелей и m - 12 меридианов — выполним дискретизацию параметров: 71 271 Г, = I Д„ т, =j Лт V/ = 0, п, j = 0, т, Д, = — Дт = —. 2и т Тогда узлы будут размещены в точках «7,., =/>(',, т,), /-я параллель образована соединением отрезками узлов q,o ч- q„„, ау'-ый меридиан — узлов qot -=- qnj. Решая уравнения (1.159)—(1.162) при пП = 1 /1.33 = 0.75 для каждой точки qu, получим точки q'y и узлы виртуального каркаса qfj. Соединяя их в порядке, анало-
138 Глава 1 гичном соединению узлов qtj в меридианы и параллели, получим изображения преломления каркаса на поверхности воды и виртуального каркаса (рис. 1.78, о). Рис.1.78 На рис. 1.78, б преломление изображено так, как его видит подводный наблюдатель. Радиус окружности, заключающей в себе все преломленное изображение, равен 2.28 м, а угол раствора конуса видимости с учетом глубины залегания наблюдателя h = 2 м составляет 2arctg 2.28 2arcsin(«n) = 97.5°.C:
Глава 2 Геометрические преобразования В этой главе мы рассмотрим законы движения геометрических объектов на плоскости и в пространстве, а также методы изображения объектов и сцен на экране дисплея в различных ракурсах и проекциях. Цель изучения данных вопросов— овладение математическим языком описания динамики и визуализации. Профессиональный художник интуитивно чувствует, как нужно изображать объемный мир на плоском холсте. Реалистичностью экранного изображения компьютерная программа обязана математически строгому расчету фаз движения объектов на основе закономерностей геометрических преобразований. Геометрическое преобразование — это отображение р' =/(р) точки р е R" п- мерного пространства образа в точку р'е R" я'-мерного пространства прообраза. Геометрические преобразования делятся на нелинейные (например, отражение в кривом зеркале) и линейные. Линейное преобразование точки описывается векторным уравнением р' = РА + В (2.1) с матрицами преобразования Ае R"x" и Be R х" , не зависящими от вектора/). В зависимости от размерности пространств п, п' и свойств матрицы А линейные преобразования делятся (рис. 2.1) на невырожденные (аффинные) и вырожденные (проективные). Свойства аффинного преобразования (АП): п = я', rang(/4) = п, что означает квадратность и невырожденность матрицы А. Существование обратной матрицы А~1 позволяет по точке прообраза р' восстановить точку образа р: р = {р'-Е)А-К (2.2) При проективном преобразовании т < п и не существует обратной матрицы А~1, поэтому однозначное восстановление образа по прообразу невозможно из-за потери информации об одной или нескольких координатах образа.
140 Глава 2 х' wR3-»R2 p=[x у z] yn p 0 =[* у] x' Рис. 2.1 2.1. Аффинные преобразования 2.1.1. Основные понятия и соотношения Аффинное преобразование (от англ. affinity — родство) имеет следующие свойства: □ отображает л-мерный объект в и-мерный — точку в точку, линию в линию, поверхность в поверхность; □ сохраняет параллельность линий и плоскостей; □ сохраняет пропорции параллельных объектов— длин отрезков на параллельных прямых и площадей на параллельных плоскостях. Эти свойства позволяют строить прообразы полигонов на плоскости и полиэдров в пространстве по конечному набору т точек их вершин: (2.3) Далее вершины р\ соединяются прямыми линиями (ребрами) в нужном порядке. Система вершин и ребер составляет каркасную (проволочную) модель полиэдра. Для получения объемной модели определяются и закрашиваются видимые грани. Преобразование вектора V — рг-рх, соединяющего точкир\ мрг, V = р2- Pi = Р2А + В- рхА-В = (р2- Px)A = VA (2.4) показывает, что преобразование В, воздействуя на оба конца V, не влияет на У. Pi Рт _ Р\ Рт А + В В
Геометрические преобразования 141 Любая комбинация N последовательных АП А„В, А2,Вг AN,BN Ро -> Р\ -> - -> PN' где/» = роА\ + В,pi - р\ Ai + Вг= роА\ Аг + В\ Аг + Вг\\ по индукции Л' Л' Л' PN = Л)П 4+ £В. ПAj = РоА + в> (2.5, а) /=1 1=1 у=/+1 j<N А,В эквивалентна одному АП р0 —» pN с матрицами преобразования л — А\ А2 ••• Адг, В = (... (ВхАг + В2) Лз + ... + В^) AN + BN. <2'5' ^ Этот алгоритм использует операции сложения и умножения матриц. Он достаточно трудоемок в расчете матрицы В. Комбинация N преобразований вектора V согласно (2.4) и (2.5) также не зависит от наличия в этих преобразованиях переносных составляющих: N 1=1 (2.6) С целью упрощения и унификации записи геометрических преобразований вводится понятие расширенного пространства (РП) R"+l, в котором (я + 1)-я координата равна фиксированному числу — единице или нулю. Координаты точки р = [р l] или вектора V = [р 0] в РП часто называют однородными. Наиболее «дачное, по мнению автора, объяснение этому спорному термину приведено в [35]. Преобразование (2.1) точки в РП принимает вид [р А=Ъ Я А О ЯХ| или р' = рС, где С = А 0„х1 В 1 В 1 есть матрица преобразования в РП с обратной матрицей д(я+1)х(я+1) (2.7) С"' = А- Оих1 _-ВА~1 1 вписывающей обратное преобразование в РП р = р'С~ , равносильное (2.2). Цепочка из N преобразований в РП Ро -^ Pi PN
142 Глава 2 эквивалентна одному преобразованию с матрицей N с = Цс,. 1=] (2.8) По сравнению с алгоритмом (2.5) матрица преобразования в расширенном пространстве рассчитывается единообразно— с помощью только перемножени* матриц. Унификация — основное преимущество выполнения АП в однородных координатах, позволяющее без лишних раздумий правильно записать и быстрс вычислить матрицу сложного преобразования С как произведение матриц элементарных преобразований С,. Несмотря на то, что для этого требуется выход е пространство R"+l, количество арифметических операций в общем итоге даже снижается, да и программирование (2.8) гораздо проще, чем (2.5, б). К недостаткам преобразований в расширенном пространстве можно отнести: □ избыточную размерность расширенных матриц и векторов: □ фиксированные элементы последнего столбца [о ... О l]7, потребляющие машинные ресурсы; □ необходимость контроля и коррекции фиксированных элементов после матричных операций в связи с возможным накоплением погрешностей машинного округления. В отличие от (2.3), одновременное групповое преобразование точек может быть выполнено по более простой матричной формуле Pi Pi \_rmj С. (2.9) Преобразование вектора V-pi-p\ согласно (2.4) и (2.7) выполняется в РП следующим образом: У o]=[v о] А 0„х1 В 1 или V' = V С. (2.10) Смещение произвольной точки р при ее преобразовании по (2.1) равно d{p)=p'-p=p(A-E„) + B. Точку ри, остающуюся в процессе АП неподвижной, можно найти, решая уравнения р» -рИА + В или d(pH) - 0„: рИ = В(Е„-А)К (2.11) Условие существования точки рн— невырожденность матрицы Е„-А. Точка, неподвижная при всех допустимых значениях матриц А и В, называется центром преобразования.
Геометрические преобразования 143 Невырожденное преобразование прямой и плоскости, описываемых в неявной форме векторным уравнением pFT =0 , изменяет их матрицу F следующим образом: p"Fn = pCFn = pFT = 0 => F = F'CT , F' = f{£tY (2.12) Читателю предлагается самостоятельно убедиться, что перенос плоскости из примера 1.10, имеющей вектор коэффициентов неявной формы F = [6 3 начало координат с помощью любой из матриц Q = дает вектор F' " 1 0 0 0" 0 10 0 0 0 10 -1 0 0 1 = [б 3 2 О] ,с2 = 1 0 0 0" 0 10 0 0 0 10 0-201 >с3 = "10 0 0" 0 10 0 0 0 10 0 0 -3 1 2 -6J,b Важным свойством линейных преобразований является равенство модулей опре- Оелителей ||Л|| = ||С|| матриц АП изменению площади (в R2) и объема (в R3) преобразуемого объекта, что позволяет быстро вычислять эти важнейшие параметры геометрических фигур по известным их исходным значениям и матрицам преобразований. Знание координат (л + 1)-ой пары точек образа и прообраза, не лежащих в пространстве R"-1, позволяет вычислить матрицы С и С[ методом парных точек: (2.13) Здесь обязательно нужно контролировать последние столбцы полученных матриц. Часто бывает удобнее оставить объект неподвижным, а преобразованиям подвергать систему координат. Это пассивное АП описывается матрицей Ск = С1, обратной к матрице С такого же активного преобразования объекта. Дополним метод парных точек (2.13) формулами расчета матриц прямого и обратного преобразований СК с = Р\ .Рп+1. -1 Pi .Рп+1. , С"' = р'х Рп+\. -1 Р\ .Рп+1. Ск = Р\ Рп+\. -1 ■- -1 Р\ -Рп+1. с_1 = 1- -| Pi Рп+\. -1 Р\ -Рп+1. (2.14) в которых Pi+Pn+i и р[ +р'„+\ — расширенные формы одноименных точек в исходном и конечном положениях СК. После вычисления матрицы Ск любая точка pj имеет в новой СК координаты J>\ = /?,СК, а любой вектор V - pi-p\ преобразуется в вектор V' = VC„. С2-15)
144 Глава 2 2.1.2. Элементарные аффинные преобразования Все множество аффинных преобразований может быть сведено к следующим элементарным преобразованиям (ЭП). 2.1.2.1. Перенос Перенос (transfer) всех точек объекта на вектор Ар в неподвижной СК (преобразования / на рис. 2.2, а и б) описывается уравнением р'=р + Ар и матрицами переноса А=Е„,В = Ар.т(Ар) = Ар 1 , Т(-АР) = -Ар 1 -г-'М. (2.16) Переносное смещение d— Ар не зависит от положения точки. Неподвижная точка согласно (2.11) удовлетворяет уравнению Р" Опх„ = Ар. При ненулевом переносе Ар ф 0„ она отсутствует, а при Ар = 0„ все точки пространства неподвижны. Определитель матрицы переноса |Т"| = 1. 2.1.2.2. Масштабирование Масштабирование (растяжение, сжатие, отражение) вдоль осей координат описывается координатными уравнениями jc' = niyX, у' - туу, z' = m.z с коэффициентами тх, ту и т. — диагональными элементами матриц масштабирования: л=2 тх О О A=diag[mx ту mz ],В = Оп, M[mx,my,mz)= л=3 О ту О О 0 /и. (2.17) Рис. 2.2
Геометрические преобразования 145 При #?1ш = -1 точка отражается вдоль оси ю е {х, у, z) от координатной плоскости ю = 0. Если все коэффициенты mv = my = m. = -1, то точка кососимметричпо отражается относительно начала СК. На рис. 2.2 изображены операции: 3 масштабирования 2 в R2 матрицей М(2, -1); "3 отражения 3 в R2 вдоль оси х матрицей Л/(-1, 1); П отражения 4 в R3 вдоль оси у (от плоскости xz) матрицей Л/(1, -1, 1); 3 отражения 5 в R3 от оси z матрицей Л/(-1, -1, 1); 3 отражения 6 в R3ot начала координат матрицей Л/(—1, —1,-1). Неподвижная точка, подвергаемая масштабированию, удовлетворяет уравнению pHdiag\l-mx \-ту \ \-mz\=On . При /иш = 1 неподвижны все точки на оси ю. Центр масштабирования находится з начале координат, т. к. только точками = Ол остается неподвижной при произвольных масштабных коэффициентах #?гш. Масштабирование с нечетным числом отрицательных коэффициентов изменяет топологические свойства преобразуемых объектов. В частности, направление обхода вершин полигона при таком масштабировании меняется на противополож- -:ое. Возможность подобных эффектов необходимо предусматривать в алгоритмах, правильность работы которых зависит от направления обхода. Примером может служить задача определения видимости плоской грани полиэдра по направлению ^ рассчитываемой нормали, зависящему от направления обхода вершин полигона грани. Если оно положительно и нормаль внешняя, то грань видима. Зеркальное гтражение полигона этой грани имеет отрицательное направление обхода и внутреннюю нормаль, рассчитываемую по тем же формулам, что и нормаль самой грани. Таким образом, отраженная грань, реально видимая в зеркале, будет идентифицирована программой как невидимая и не отобразится на экране. Зпределитель матрицы масштабирования равен \М\ - mv ту т.. У матрицы отражения с коэффициентами шш = ±1 он равен \М\ — (-1)*, где к— число инвертируемых координат преобразуемой точки. Например, при отражении вдоль одной XII получим \М\ - -1. В результате инвертируются направления обхода всех отражаемых полигонов без изменения их площадей, а также объемов полиэдров. При неравных масштабных коэффициентах преобразование масштабирования изменяет углы между векторами, площади, объемы и форму геометрических фи- :>р. Неравномерное растяжение или сжатие вдоль осей координат— простей- _]ий способ получения эллипса из окружности и эллипсоида из сферы. 2.1.2.3. Сдвиг Zdeu? (shift) вдоль направлений осей СК или их комбинации описывается следующими координатными уравнениями и матрицами сдвига в R2 и R3: x' = x+sxyy у'^У + ^ухХ *ху 1 (2.18, а)
146 Глава 2 х = x+sxyy+sxzz y' = syxx+y+syzz => 53 = Z' = SZXX + Szyy + Z 1 sxy sxz syx 1 syz Six szy 1 (2.18,6) Параметры сдвига задаются недиагональными элементами матриц 5г и Л. Коэффициент матрицы сдвига s,-,- есть единица смещения вдоль оси /, пропорционального 7-ой координате. Сдвиговое смещение d = p(Sn-E„) (2.19) зависит от положения точки р, что и отличает его от переноса. Неподвижная точка удовлетворяет уравнению p„(S„ - Еп) = Ол. Если в матрице S„ все недиагональные элементы ю-ой строки — нулевые, то при сдвиге неподвижны все точки, лежащие на оси ю. Две нулевые строки матрицы S„ - Е„ дают множество неподвижных точек на координатной плоскости. Центр сдвига при произвольных параметрах матрицы S„ находится в начале координат. Важно отметить, что если в матрице сдвигового преобразования элемент j,-,- ф О не единственен, то векторы смещения (2.19) не параллельны, а сдвиг осуществляется одновременно вдоль нескольких осей СК, и его нельзя заменить последовательностью одноосевых сдвигов: " 1 0" _sxy '. 1 S 1 Jyx 0 1 I Syx sxy '+ sxysyx 1 "xy Jyx 1 Преобразование сдвига может иметь вырожденную матрицу с нулевым определителем, например, "1 О Г S> = 1 1 1 1 .¾ О 1 О 1 -1 1 Размерность пространства, натянутого на точки сдвинутого в R" объекта, равна рангу матрицы 5„. Следовательно, при rang(S„) < п преобразование сдвига не является аффинным. На рис. 2.3, а приведены примеры преобразований сдвига на плоскости с матрицами (2.18, о) и сдвиговыми смещениями (2.19): П отрезка (1) матрицей " 1 О" So = -2 1 с параллельными векторами смещений d = [-2у о] j| jc° и множеством неподвижных точек, лежащих на оси jc;
Геометрические преобразования 147 П квадрата (2) и круга (5) матрицей 5,= 1 1 -2 1 с непараллельными векторами смещений d = [-2у х\. На рис. 2.3, б выполнены преобразования объемной фигуры в пространстве: 3 сдвиг (/) вдоль оси у матрицей 1 -2 О" 53= 0 1 О О 0 1 с параллельными векторами смещений d = ]p -2х 0\\\у° и множеством неподвижных точек, лежащих в плоскости yz; ID сдвиг (2) матрицей "1 0 0" 53= -1 1 0 -1 -1 1 с векторами d = [- у —z -z о]; 3 сдвиг (3) вырожденной матрицей "1 0 1 0 1 0 1" 0 1 ранга 2, в результате чего все точки прообраза лежат в плоскости x-z = 0.
148 Глава 2 2.1.2.4. Вращение Вращение (rotation) точки на плоскости ху вокруг начала координат (рис. 2.4, а) описывается следующими координатными уравнениями: f х - г cos(a + ф) = х cosfo) - у sin (ф) [у' = rsin(a + (p) = xsit\(({>)+ ycosfo), откуда следуют матрицы вращения в положительном (против часовой стрелки) и отрицательном (по часовой стрелке) направлениях: л(ф)= cos(cp) s'm((p) -sin((p) cos(cp) Л(-Ф) = COs(lp) -5т(ф) S»lfo) COS^) = /?Т(ф)=^1(ф). (2.20) / V' у <Р» О жЬ Рис. 2.4 При вращении точки в пространстве вокруг осей правой системы координат (положительные направления вращений удовлетворяют правилу буравчика и показаны на рис. 2.4, б) матрицы вращений получим из соответствующих уравнений: . **(-ф*)=я;'(ф*); □ х' = х, у' = >'COsfov) - zsinfov), z' = ysinfoj + zcosfoj, 10 0 Кх(ч>х) = 0 COsfox) 81п(фя) 0 -sinfox) cosfoj □ jc' = xcosfo,) + zsinfo,), У = у, z' - -xsinfo,) + zcosfo,), cos[(py) 0 -sin^J Ry(py)= 0 1 0 sin^j 0 cos(p ) , Пу{-<Ру)= *Лъ)> (2.21, а) (2.21,6) П х' = Acosfo.) -ysinfo,),/ = jcsinfo,) + ycosfo.), г' = г,
Геометрические преобразования 149 Л:(фг)= cos((pz) sin((p.) О -sin((pr) cos((pz) О О О 1 . я:(-Фг)=яг"|(фг)- (2.21,6) Преобразование вращения не изменяет углы между синхронно вращающимися векторами, площади, объемы и форму геометрических фигур, а также топологические свойства полигонов. Определители всех матриц вращения равны единице. Благодаря свойству ортогональности RTR = RRT = Е„ при изменении знака угла вращения на противоположный обращение матриц вращения заменяется их транспонированием: Векторы смещения вращательного движения d = p(R„(4>)-E„) (2.22) образуют цилиндрическое векторное поле, ось симметрии которого со содержит множество неподвижных точек. Центр всех вращений на произвольные углы вокруг любых осей координат располагается в начале СК. Строго говоря, вращение не является элементарной операцией, т. к. его можно представить последовательностью масштабирования и сдвига: cos((p) sin((p)l_rcos((p) 0 1 Г 1 tg((p) -sin(cp) cos(cp) 0 cos((p) -tg(cp) 1 Тем не менее ввиду простоты понимания, распространенности и важности места вращательного движения в системе геометрических преобразований целесообразно считать вращение элементарным, а не сложным преобразованием. 2.1.2.5. Табличный расчет тригонометрических функций Весьма важным в практике применения матриц вращения является быстрый расчет тригонометрических функций угла и наоборот — угла по значениям его тригонометрических функций. Актуальность этой проблемы объясняется присутствием преобразования вращения практически в каждом сложном преобразовании и высокой частотой выполнения этой операции, в том числе и во вложенных циклах. Использование встроенных в языки программирования функций cos и sin, вычисляемых суммированием рядов Тейлора, конечно, заманчиво, но непрактично из-за их невысокого быстродействия. Еще меньшая скорость сходимости у обратных тригонометрических функций, из которых во встроенной библиотеке обычно имеется только функция arctg. От-
150 Глава 2 сутствующие функции arcsin и arccos можно вычислить либо создав собственные варианты этих функций ( г i -\ л i(x)=if ( | х |< 1: arctg л/Г-7 \ sgn(x)~ ) ( ac os M=if ( х : arctg Л + {*<0}-71, ^|, (2.23, а) (2.23, б) либо суммируя до сходимости по заданной погрешности 8 соответствующие ряды Тейлора: 3 s 3-5 arcsinu)=jcH х + 2-3 2-4-5 *5+- 2-4-6-7 -х +...= 2к+\ 2к к=\ '=2 arccosi V ; 2 /=2 -arcsin(jc). Оба ряда у границ области |а| < 1 сходятся очень медленно (более 4000 итераций) и с недопустимо большой ошибкой (до 0.0086 рад, т. е. 0.5°) при абсолютной погрешности е = Ю-6. В настоящее время наиболее быстрым и популярным считается табличный метоо вычисления тригонометрических функций с кусочно-линейной интерполяцией между узлами сетки. Суть его в том, что при запуске прикладной программы один раз с высокой точностью вычисляется N + 1 узловое значение наиболее востребованной в машинной графике монотонно убывающей функции с{х) = cos(a) в интервале х е [0, п 12] с шагом Ах = п I 2N. Таким образом, в оперативной памяти компьютера создается 2 х (jV + 1)-матрица (таблица) узлов сетки а,- = (Дх, г, = COS(x,) V/ = О, N. При вычислении тригонометрических функций cos(a) и sin(A') произвольный аргумент а циклическим смещением а = а - 2sgn(A)n приводится в интервал [-л, л]. Далее используются известные тождества, сужающие интервал до [0, я / 2]: • 0<а<п/2: cos(a) = c(x), sin(A) = с(л / 2 - а); (2.24, я) • л / 2 < а < л: cos(a) = -с(п - a), sin(A) = c(x-nl 2); (2.24, б) • -тг/2<а<0: cos(a) = с(-а), sin(x) = -с(л / 2 + а); (2.24, в) • -п<а<-п/2: cos(a) =-с(л + a), sin(A) = -с(-л/2-а). (2.24, г)
Геометрические преобразования 151 Вычисляя значение с(£) по аргументу 0<£<л/2, определим индекс i' = [4/AxJ, при котором х, < £ < х,+| (рис. 2.5). Тогда приближенное линейно интерполированное значение функции равно с(£)=С;+(с,+1-с,.) -g- 0 х, х. Е дг.. Рис. 2.5 Допустим, составлена таблица {л„ с,} с крупным шагом Ах = 0.01745 рад = 1° и задан аргумент х = -14.2 рад. Сместив его на два периода, получим х = -14.2 + 4л = -1.6336 рад = -93.6°. Вычислим по (2.24, г) функции cos(a) и sin(x): Э &, = л + х - 1.508 рад => / = 86, сы = 0.06976, сы = 0.05234, откуда -с(£)~ -0.062789, в то время как cos(a) = -0.069792. Абсолютная и относительная погрешности интерполяции составили 2.25 • Ю-6 и 3.59 • Ю-5; 3 £ = -тс / 2 - х = 0.06283 рад => / = 3, сз = 0.99863, r4 = 0.99756, откуда -(-(¾ «-0.99799, тогда как sin(x) = -0.998027. Абсолютная и относительная погрешности интерполяции составили 3.648 • Ю-5 и 3.655 - Ю-5. Расчет обратных тригонометрических функций 0 < arccos(«) < л (рис. 2.6, а) и --. 12 < arcsin(o) < л / 2 (рис. 2.6, 6) аргумента -I < а < 1 начинается с поиска индекса /, для которого с,-+| < |д| < с,. С помощью линейно-интерполяционной функции L{a,i) = х[ + — Ах ci+\ ~ci
152 Глава 2 получим приближенные значения L(a,i) при а>0; л-L(-a,i) при а<0; тс/2 - l{a, i) при a > 0; Ц-а,/)-тс/2 при а<0. arccos(a) = arcsin(a) = (2.25, я) (2.25, б) Рис. 2.6 Вычислим по таблице {л„ с,}, г = 0,90, функции arccos(o) и arcsin(tf) для a = -0.98. Так как n i = 0.982 и сп = 0.978, то г = 11. Тогда по (2.25) находим arccos(fl) »тс - L(-o, i) = 2.941445 рад; arcsin(o) * L(-a, /) - л / 2 = -1.370648 рад. Точные значения углов равны, соответственно, 2.941258 рад и -1.370461 рад Даже при такой крупной сетке, построенной с шагом 1°, максимальная абсолютная погрешность вычисления обратных тригонометрических функций на границах интервала -1 < a < 1 составила 4.767 • 10 4 рад или 0.03°. В заключение приведем примеры нелинейных элементарных преобразований.
Геометрические преобразования 153 £3 Пример 2.1. Получить матрицы кручения и изгиба вокруг координатных осей. Решение. Деформация кручения характеризуется линейно возрастающим углом вращения слоев материала, ортогональных оси кручения, при удалении от неподвижного основания. Кручение так же соотносится с вращением, как сдвиг с переносом. Вывод матрицы кручения вокруг оси л- аналогичен выводу матрицы (2.21, я). Пусть а— погонный угол кручения, т.е. дополнительное вращение, приходящееся на единицу длины (на рис. 2.7, а изображено кручение параллелепипеда при а = 9°). Тогда координатные уравнения и матрица кручения имеют вид х' = х [1 О О / = 7cos(oc)-zsiri(ac) => fVx(a)= О z' = ysin(cec)+zcos(cec) О cos(ctc) sin(ctc) -sin(ctc) cos(ctc) = «*(<*)■ Аналогично получаются матрицы кручения вокруг осей у и z: Кручение превращает прямую ро + Vt, не ортогональную оси кручения, в винтовую •ривую. Следовательно, это нелинейное преобразование не является аффинным. В отличие от кручения при деформации изгиба угол поворота точки вокруг оси изгиба пропорционален ее удалению. Матрицы преобразования изгиба вокруг координатных осей, зависящие от погонных углов а, Р и у (на рис. 2.7, 6 изображен изгиб параллелепипеда вокруг оси z с коэффициентом у = 4.5°), равны Dx(a)=Rx(a^y2 + z2\ Dy^)=Ry(^x2+z2\ Dz{y)=RzUx2+y2 .
154 Глава 2 Изгиб превращает прямую линию ро + Vi, не параллельную оси изгиба, в спиральную кривую (см. рис. 1.31, о). Следовательно, и это нелинейное преобразование не является аффинным. □ 2.1.3. Сложные аффинные преобразования Сложным (комбинированным) называется преобразование, реализующее цепочку не менее, чем из двух элементарных преобразований. Отметим, что почти все аффинные преобразования не коммутативны, т. е. результат цепочки преобразований зависит от порядка их выполнения. Для цепочки из двух АП с матрицами С\ и Сг некоммутативность означает С\СгФСгС\. Например, комбинации вращения объекта вокруг оси со е {л', у, z} на угол ср и переноса на вектор Ар имеют разные матрицы сложного АП: ~RM о„х, 0,х„ 1 Rw{<p)T{Ap) = t{ap)rM-- [Ар 1 RM &PRM Хо(ф) О,*, Ар 1 °nxl 1 Как исключение, попарно коммутативны лишь преобразования перенос - перенос и масштабирование — масштабирование: т{аР1)т{аР2)= Еп Арх °nxl 1 О Ар2 М (тх, ту, т, ) М (цх, цу, \i.z )= rjxl 1 ^П 0„х[ Д/?1 +Ар2 1 ~тх 0 0 " 0 mv 0 У 0 0 т, V* 0 0 ^ 0 0 - Til ' v- 0 , о Vz = M\px,\}.y,\).z)M\nix,my,mz). При выполнении преобразований не теряйте из виду систему координат! Например, вращения куба вокруг оси л\ а затем вокруг оси у, оставшейся неподвижной, дают матрицу RyRt, и конечное положение куба, показанное в конце цепочки 1 - 2 на рис. 2.8. Если забыть направление оси у и второе вращение куба сделать вокруг отклоненного ребра, которое вначале было вертикальным ((цепочка 1 - 3)), то матрица полного АП с учетом вращения системы координат вокруг оси х, поворота куба и возврата в исходное состояние будет равна Rx\Rx RyRx)= RyRx ф RxRy ■ Разные конечные положения кубов наглядно доказывают, что преобразования вращения не коммутативны.
Геометрические преобразования 155 30° ^ ^Г ^ Рис. 2.8 2.1.3.1. Методы расчета матрицы сложного преобразования Рассмотрим два метода расчета матрицы сложного преобразования С в задачах с произвольным расположением осей вращения, прямых и плоскостей отражения. 3 Метод разложения (декомпозиции) сложного движения объекта на N элементарных движений, описываемых матрицами С, относительно координатных осей и плоскостей неподвижной СК. Тогда по (2.8) получим N c-ncf Разложение процесса на составные части — отличительная черта "методов серого ящика", в которых форма (начальное и конечное состояние объекта) наполняется содержанием (промежуточными состояниями и способами их достижения) не единственно возможным образом. Задача и искусство программиста состоит в оптимизации состава ЭП. Полезным приемом, часто облегчающим выбор ЭП, является временный перевод системы координат матрицей Ск в такое положение, где оси вращения, прямые и плоскости отражения становятся координатными. В измененной СК выполняются необходимые элементарные АП с общей матрицей Q. Восстановление системы координат в исходное положение описывается матрицей С,7 . Таким образом, сложное АП имеет матрицу C = CKQC~X.
156 Глава 2 При расчете матрицы Ск необходимо помнить об инвертировании знаков параметров элементарных преобразований — вектора переноса начала координат и углов вращений СК вокруг ее осей. О Метод парных точек, определяющий матрицу АП по трем (на плоскости) или четырем (в пространстве) парам линейно независимых точек образа и прообраза. Это принципиальное безразличие к способам перехода от начального к конечному состоянию объекта — явный признак "метода черного ящика". Обращаемые в (2.13) и (2.14) матрицы всегда будут невырождены при условии, что тройки точек не коллинеарны, а четверки — не компланарны. Наилучшая обусловленность матриц достигается при ортогональности систем векторов, построенных на выбранных точках образа и прообраза. Читателю предлагается оценить эффективность метода парных точек на следующих примерах. & Пример 2.2. Рассчитать матрицу преобразования треугольника р\ ргръ в треугольник/74/75/76 (рис. 2.9). 1р4<"- -4—А i5 1 \ i \Рг \Р(,, \ J дгГ i ^ Р? /42 : [ \ \У: -2-j- 0 ; _-2| ^1^4 "гО 2; ..4-- Ч: х \Р> Рис. 2.9 Решение. Подставив вершины треугольников в (2.13), сразу получаем необходимую матрицу АП: С = -4 2 1 -3 -1 1 -1 1 1 2 4 -1 3 1 -1 1 5 1 = -1.375 1.25 0 -1.125 1.75 0 -1.25 4.5 1 Вот и все. А теперь попытайтесь угадать последовательность и параметры элементарных преобразований, переводящих треугольник р\ргръ в треугольник /74/75/76, вычислить матрицы этих преобразований, сравнить их произведение с вышенайденным результатом — и вы почувствуете разницу методов! □
Геометрические преобразования 157 __ Пример 2.3. Рассчитать масштабный коэффициент иэ и матрицу d пропорционального Отображения ПРЯМОУГОЛЬНОГО ОКНа {Хпйп + Xmax, yinin + Ушах} В ПЛОСКОСТИ ху МСК в центр окна ЭСК {left -*■ right, up + down) (рис. 2.10). У* -'max У Л -'nun _ Pi Pi p, л c, Ю=> r 1 up . *m . Г. X P ., '«, " - p> Рю гЬОПУ 1.-- ; ;. )*, >', Рис. 2.10 Решение. Обозначим коэффициенты прямоугольности окон в МСК и ЭСК: p_.Vmax-.Vmin _ down-up *max-*min ' Э right-left У пропорционачьных окон коэффициенты прямоугольности ри рэ равны, а окно МСК отображается во все окно ЭСК. В этом случае матрица Сэ наиболее просто находится методом парных точек (2.13) при п - 2. Хотя задача решается на плоскости, но с целью использования ее результата для преобразований в пространстве выберем четыре пары некомпланарных точек в МСК и ЭСК: Р\=[хтт Утт °] ~» Р\э = №l down О], Рг Ръ = l*min " l*max .Ушах -Vmax о]-* о]-* Рг-ъ Рзэ~- = [left = [right up up 0]. 0]. Тогда Сэ = -Vinin .Vmax .Углах 0 right-left _ *max 0 0 0 0 1 Г l l l -i left left right 0 down - up *max *inin .Vmax Ути down 0 1 up up 0 0 I 0 I 1 I (2.26) В случае непропорциональных окон получим матрицу Сэ методом разложения, зыполнив цепочку элементарных преобразований исходного окна в МСК
158 Глава 2 Шаг 1. Перенос центра окна/?ц в начало МСК матрицей т\ = т{ [-xu ~Уц О]), где .гц =- , +Хг, ,. Ут'т + Ушах Уи 9 (2.27, а) Шаг 2. Пропорциональное масштабирование окна по осям координат и изменение направления оси у матрицей M=diag[]x, -цэ l], где цэ right - left down — up Утъх Ут\п Шаг 3. Перенос центра окна в точку /Ъц в ЭСК матрицей при рэ > р; при рэ < р. (2.27, 6) Т2=г([х >'и о]), где х.п = left + right Ую = up + down (2.27. в) Матрица полного преобразования равна C3=7jA?7"2 = U.3 0 0 0 -V-з 0 0 0 0 0 1 0 *цэ-^э*ц Гцэ+ШУц 0 1 (2.27, г) Коэффициенты этой матрицы дают прямые уравнения пересчета координат точки из МСК в ЭСК (координата z3 вектора рэ = рСэ при этом не используется): ЛГэ = Хш + Цэ(Л" - Хи), )'э - )'ш - ЦзО - уи). (2.28) Описанный алгоритм гарантирует, что любое изображение в прямоугольном окне без искажений отобразится в любом желаемом окне дисплея, заполнив его максимально полностью и симметрично относительно центра. Если при расчете масштабного коэффициента цэ по (2.27, б) заранее неизвестны границы окна МСК, целиком вмещающего сцену, можно задать значение Цэ = 40 из тех соображений, что один сантиметр экрана (40 пикселов) соответствует одной единице длины в пространстве МСК. Наконец, можно выбрать единицу длины в МСК равной размеру пиксела экрана 0.25 мм. Тогда цэ = 1, что сильно упрощает матрицу (2.27, г) и координатные уравнения (2.28): I 0 0 0" Сэ = 0 о -1 0 о 1 о *цэ-*ц Ую+Уи ° • ДГэ = Лиз - Хи + X, уъ = Уи.ъ + Уи-у. (2.29)
еометрические преобразования 159 Сравним методы вычисления матрицы сложного АП на примере весьма распространенной операции изменения пространственной ориентации системы коорди- iam, заключающейся в совмещении начала СК с точкой о, а какой-либо координатной оси, допустим, z— с направлением заданного вектора К*Оз (рис. 2.11). Положение других осей в измененной СК не регламентируется. Данное преобразование применяется, например, в алгоритмах вращения (У) вокруг заданной прямой о, V) или отражения (2) от произвольной плоскости вдоль ее нормали V. Рис. 2.11 Решение задачи достигается за два преобразования. '.. Перенос начала координат в точку о, описывается матрицей Т(-о). 1. Поворот оси z в направлении вектора V, выходящего из начала новой СК. Обозначим нерасширенную матрицу этого преобразования A(V). Расширенная матрица полного преобразования СК равна C{o,V)=T(-o)A(v). Рассмотрим различные методы вычисления матрицы поворота A(V). Метод разложения Алгоритм, основанный на методе разложения, рассматривается во многих учебниках по машинной графике [5, 26, 33, 34] и состоит в нахождении проекции v = [Vx V.] вектора Уна координатную плоскость xz (у разных авторов варианты алгоритма отличаются выбором плоскости проецирования) и выполнении кух вращений СК xyz (рис. 2.12): D первое вращение вокруг оси у на угол а, у которого cos(a)= -г^г , sin(a) = -pf , где Ivl = -Jv? + v} И M Система координат после этого занимает положение x'y'z', в котором ось z' совпадает с направлением вектора v;
160 Глава 2 П второе вращение вокруг новой оси х' на угол -Р, у которого cos(J3)= И И sin()3) = ^-. Система координат после этого занимает требуемое положение x"y"z", в котором ось г" совпадает с направлением вектора V. Рис. 2.12 Таким образом, матрица поворота СК по методу разложения равна AP(V) = К,,(-а) RM- (23°) Всегда ли верно это решение? Очевидно, что оно не является таковым при |v| = О, когда V || у0. В этом случае угол а не определен, а совмещение орта г° с вектором F достигается не за два, а за одно вращение СК матрицей ЛР(Ю = ДЛ(8ёп(К,)90°). Однако, и при V#y° у метода (2.30) имеются скрытый недостаток и особенности программной реализации, которые даже не обозначены и не обсуждаются в перечисленных выше учебниках: П при расчете матриц вращения по (2.21) возможно использование неверных аргументов, вычисленных с помощью функции arccos в интервале [0°, 180°], в то время как углы изменяются в интервалах -180° <а< 180°, -90°<Р<90°. Так же некорректно определение угла а (но не р!) функцией arcsin в интервале [-90°, 90°]. Следовательно, угол а должен вычисляться с учетом знака его синуса, т. е. функцией (1.31) с векторными аргументами [vx Vz\ и [о 1J. Итак, в (2.30) углы вращений находятся следующим образом: ct = if( |v|: ang^,y°\ о), р = arcsin (ууЛ (2.31)
Геометрические преобразования 161 3 поскольку матрицам вращения требуются, собственно, не сами углы, а их косинусы и синусы, которые в рассматриваемой задаче явно выражены через элементы вектора V, то практичнее создать модификации матриц вращения (2.20) и (2.21) с двумя аргументами с as— косинусом и синусом угла вращения: R2(c,s)-- R2y(c,s) = , R2x(c,s)= с О 0 I s 0 R2:(c,s)-- 1 0 0 0 с s 0 -s с э с s 0 -s с 0 0 0 1 (2.32) Эти матрицы рекомендуется использовать даже в тех случаях, когда исходным является угол вращения (р: вычислив один раз с = cos((p) и s - sin((p), подставить их в (2.32) вместо двукратного вычисления в (2.20) и (2.21); 3 прямая подстановка cos[a.)=jj, sin(cg = -p*- v v cos()3) = fL. sin(p) = Yy в матрицы вращений (2.30) и их ручное перемножение приводит к весьма громоздкой записи матрицы ЛР(Р). которую автор здесь сознательно не приводит, дабы не искушать читателя этим порочным методом разработки алгоритмов компьютерной графики. Во-первых, в процессе ручных выводов очень легко наделать ошибок. Во-вторых, вместо элегантного перемножения матриц в одной строке программы поэлементное описание матрицы Ap(V) требует много строк — это путь к разбуханию программного кода, источник дополнительных ошибок и затрат времени на отладку программы. Матрицы некоторых сложных преобразований на плоскости, вычисленные методом разложения, приведены в табл. 2.1. Таблица 2.1 Преобразование Масштабирование от точки о Отражение от точки о Матрица преобразования Т{-о)м((пх,ту)т{о) = тх 0 0 0 ту 0 (\-тх)ох \}-ту)оу 1 Т(-о)м(-\,-\)т(о) = -1 о о" 0-10 2ох 2оу 1
162 Глава 2 Таблица 2.1 (продолжение) Преобразование Отражение от прямой {о, V} cos(cc)=7n-, sin(cc)=-7-p И и Отражение от прямой у = ох + Ь о = Ьу°, a - arctg(fl), |л| < оо Отражение от прямой л: = a Отражение от прямой у —Ь Отражение от прямой у = х Отражение от прямой у — -х Вращение вокруг точки о на угол ф Матрица преобразования = 7 Г(- o)R(- о)м{- \,\)r{o) T(o) = 2sin2(a)-l -2cos(a)sin(a) С -2cos(a)sin(a) I-2sin2(a) 0 X Y 1 X = 2cos(a)(oA cos(a) + o(,sin(a)) Y= 2sin(a)(ovcos(a) + o;.sin(a)) (-by0)r{-a)M{\ -1)ВДт(ьу°)= "(l-ЛЦ2) 2a/La>) 0 2a/La>) («2-.V(1 + «2)0 -lab/^ + a2) Ib/^ + a1) 1 т(-ох°)м(-1 \)т(ох°)= т(-Ьу°)м(1-\)т(ру°)= й(45°)Л/(-1, 1)й(-45°) = л(-45°)Л/(-1, 1)й(45°) = т(-о)Щт(о) = Х=о,(\-со Y =о,,(\ -ее "-1 0 о" 0 1 0 2a 0 1 "1 0 0" 0-10 0 2b 1 "0 1 0" 1 0 0 0 0 1 0-10 -10 0 0 0 1 соб(ф) sin^) 0 -8т(ф) COS^) 0 х УК s(<p)) + orsin(<p) s(<p))-o.vsin(<p)
Геометрические преобразования 163 Таблица 2.1 (окончание) Преобразование Сдвиг вдоль прямой {о, V) cos(ct)=|^|,sin(ct)=-j^ Матрица преобразования T(-o)R(-a) ' 1 0 0" 0 0 1 R{a)T(o) Матрицы сложных преобразований в пространстве приведены в табл. 2.2. Таблица 2.2 Преобразование Масштабирование от точки о Отражение от точки о Отражение от прямой {о, V) cos(a)=^-, sin(a)=-x, V V cos(p)=|^,sin(P) = ^, v = VK?+K? Матрица преобразования = T(-o)M\(nx,my,mz)T(o) = mx 0 0 0" 0 my, 0 0 0 0 mz 0 {\-mx)ox \}-my)oy (l-mz)oz 1 Г(- о) AY(-1-1,-1) r(o) = -1 0 0 0 0-100 0 0-10 2ox 2oy 2oz 1 V#y°: 7-(- o)Ry {- a)Rx (p)A/(-1,-1, \)RX(- $Ry(a)т(о) v\\y° Г(-о)Й(-1, l-l)7-(o) = "-1 0 0 0" 0 10 0 0 0-10 2ox 0 2oz 1
164 Глава 2 Таблица 2.2 (продолжение) Преобразование Отражение от плоскости {o,N} cos(oc)=-2-, sin (а)= —, V V cos(p)=^.sin(p) = ^, v = ^N* + N; Матрица преобразования V\\x°: Т(-о)м{\-\-\)т{о) = 10 0 0 0-100 0 0-10 0 2oy 2o, 1 V\\z°: т{-о)м(-\-\, \)т{о) = -1 0 0( 0 -IOC 0 0 1 С 2ox 2oy 0 )1 ) ) N#y° : 7(-o)Ry(-a)Rx(p)M(\, \-\)Rx(-№у{a)T(o) N\\y°: Т{-о)м{\-\, \)т(о) = "l 0 0 0" 0-100 0 0 10 0 2oy 0 1 N\\x°: T(-o)M(-\, 1, 1)7(0) = "-1 0 0 0" 0 10 0 0 0 10 2ox 0 0 1
Геометрические преобразования 165 Таблица 2.2 (продолжение) Преобразование Вращение вокруг прямой {о, V) на угол ф cos(cc) = —5-, sir^cc^-^, V V cos(p)=^.sin(p)=^, v = V^2+^2.4»-sgn(KJ Матрица преобразования N\\z°: Т(-о)м(], \,-\)т{о) = "l 0 0 0" 0 10 0 0 0-10 0 0 2o_ 1 V#y°: Т{- o)Ry (- a)Rx ((3)¾ (фх (- $Ry (а) т(о) = = V\\y°: T(-o)Ry(?y<p)T(o) = соб(ф) 0 -s^sinfa) 0 0 10 0 SySinfa) 0 cos((p) 0 Оя(1-С08(ф))- Ог(1-«»(ф))+ ( - syo 2sin(q>) +SyOxs\n(q>) V\\x°: T(-o)Rx{sx<p)-T(o) = rl 0 0 0" 0 cos((p) sxsin(v) 0 0 -s^sinfo) ««(ф) 0 oy (l - соб(ф))+ oz (l - соб(ф))- + sxoz s\n((p) -sxoy sin (ф)
166 Глава 2 Таблица 2.2 (окончание) Преобразование Матрица преобразования V\\2°: T(-o)Rz(sz<p)T(o) = cos((p) szsin((p) 0 0 -,yrsin((p) cos(<p) 0 0 0 0 1 0 oT(l-cos((p))+ oy{\-cos{(p)y ^ + s:oysm((p) -szoxs'm((p) Экономичный метод разложения Экономичный вариант метода разложения заключается в вычислении вектора нормали Л' = z°xVe ху и двух вращений системы координат (рис. 2.13): П на угол а вокруг оси z; П кратчайшего вращения на угол р вокруг новой оси у'. Рис. 2.13 Судя по интервалам изменения углов -180° < а < 180° и 0° < Р < 180°, формулы их расчета и матрицы поворота следующие: a = if Щ: ang\y°, n), о), р = arccos(j° о р), Aw( V) = Л.(-а) Ry(-P). (2.33) Метод парных точек Для получения 3 х 3-матрицы A(V) методом парных точек найдем в пространстве три неколлинеарные точки, в которые перейдут концы ортов х°, у0 и z° после
Геометрические преобразования 167 поворота системы координат (рис. 2.14). Одна из этих точек на конце вектора У— прообраз z°. В общем случае при V#z° выберем прообразы векторов у0 и х° на концах векторов нормали N = z° хУ е ху и бинормали W - NxV. Длины векторов N и W равны — это необходимо для неискаженного преобразования углов из СК x'y'z' в СК хуг. Подставляя точки образа |х°, у0, z°] и прообраза {W, N, V) в нерасширенный вариант (2.14), получим aJY)- ~w~ N V -1 >' У° z° = ~w~ N V -1 "1 0 0" 0 1 0 0 0 1 = NxV N V --1-1 Рис. 2.14 Особый случай — параллельность векторов V \ \ z°, при которой z° х V = О3. Специальный выбор векторов N = V.y°, W=NxP=\Vz\x0 обеспечивает ортогональность, равномасштабноапь и правую ориентацию тройки {W,N,V} базисных векторов системы x'y'z' как при У ТТ z°, так и при Г Ti 20. Эти три свойства необходимы для правильного отображения в СК xyz как величины, так и знака угла вращения, выполняемого в СК x'y'z'. Обобщая сказанное, запишем алгоритм расчета матрицы поворота системы координат методом парных точек в следующем виде: 7V = iff|z°oF|<l: z°xV, У.у°\ Ап(у)= ЫхУ N V (2.34, а)
168 Глава 2 Метод парных точек позволяет сразу найти матрицу полного преобразования системы координат, равную 1\-о) An(V), без разложения на промежуточные преобразования: N = iff |z° oV <1: z°xV, V.y° C„(o,V)- o + NxV o + N o + V 1 -i-l 0 1 0 0 (2.34,6) Сравнение методов (2.30), (2.33) и (2.34) по критериям понятности, простоты вывода, краткости записи, вычислительной эффективности ставит впереди всех, по мнению автора, метод парных точек. К сожалению, все рассмотренные методы страдают условностью, т. е. зависимостью алгоритмов от особых случаев ориентации вектора V. Видимо, единый алгоритм для произвольных положений этого вектора отсутствует, а те методы, что предлагаются в учебной литературе — лишь частные случаи, не учитывающие особых ситуаций. Опыт курсового проектирования студентов под руководством автора показывает, что эти ситуации встречаются не так уж и редко. Внешне они проявляются во внезапном завершении программы из-за попытки деления на ноль при обращении вырожденной матрицы. Гораздо проще, чем в Зс1-варианте, вычисляется матрица преобразования системы координат на плоскости. Допустим, требуется совместить начало координат с точкой о, а оси у придать направление вектора К(рис. 2.15). Такое преобразование полезно делать при расчете отражения и масштабирования относительно произвольной прямой {о, V). Рис. 2.15 Приведем без лишних рассуждений очевидные формулы расчета матрицы преобразования системы координат Ск: П по методу разложения a = ang{y°, v), Ср(о,У)= т(-оЩ-а); (2.35)
Геометрические преобразования 169 3 по методу парных точек лг = га(-90°)=к -vx], сп{о,у)= 'o + N Г o + V 1 о 1 -1 "1 о Г 0 1 1 0 0 1 (2.36) S1 Пример 2.4. Построить отражение треугольника на плоскости с вершинами Pl=[o О], р>2=[р О и /?з=[2 О] от прямой линии, проходящей через точки р4 = [3 0] и р5 = [2 2] (рис. 2.16). Рис. 2.16 Решение. Вычислим направляющий вектор и нормаль заданной прямой линии: Y = P5-P4=[-1 2],N = VR(-90°)=[2 l]. Последовательность действий для построения отражений р\ исходных точек р{ (i = 1, 2, 3) может быть, например, следующей. Шаг 1. Получим по (2.35) матрицу преобразования системы координат ^4/5 -VV5 О" $5 J4J5 О О 0 1 Скр = Т{-р4Щ-а)-- 1 0 -3 0 1 0 о] 0 lj V4/5 -Vl/5 О Vi/5 -fi/5 О методом разложения на два элементарных преобразования: перенос начала координат на вектор р* и вращение на угол а, у которого у _1/ cos(a)=r^- = V4/5, sin(a)=-jpj£-= ,/1/5.
170 Глава 2 Второй вариант матрицы преобразования системы координат получим методом парных точек (2.35) по двум тройкам точек |л°,>0, С>2} и {рь.ръ,р*}: '5 I Г 2 2 1 3 0 ] -1 ~\ о Г 0 1 I 0 0 1 = 5.4 0.2 1.2 -0.2 0.4 0.6 0 0 1 с = Читателя не должно смущать несовпадение полученных матриц: видимо, матрица СкР эквивалентна иной, чем в матрице Скп, последовательности элементарных преобразований, которые, по сути дела, нас не интересуют. Главная цель— получение матрицы преобразования системы координат— достигнута с помощью метода парных точек быстрее и проще. Шаг 2. Отражение вдоль оси х' описывается матрицей М = diag[-1 l]. ШагЗ. Восстановление исходной системы координат описывается матрицами сч = *-кр 4Ф $5 0 -Ji/5 fi/E 0 9/5 12/5 1 ' '-кп "210 -12 0 3 0 1 Шаг 4. Матрица сложного АП С СкрЛ7 СКр CKrl/W LKrl -0.6 -0.8 0 -0.8 0.6 0 4.8 2.4 1 одинакова для обоих методов расчета матрицы изменения СК, что подтверждает вывод о неединственности способа выполнения сложного преобразования. Шаг 5. Координаты отраженных точек рассчитаем групповым методом (2.8): Га |] Рг 1 U Ц = 'р\ г Р2 1 [рз Ч с = "0 0 1] 0 1 1 2 0 lj 0.6 0.8 1.8 -0.8 0 0.6 0 2.4 1 = 4.8 2.4 4 3 3.6 0.8 □ 2.1.3.2. Кинематический метод построения объектов Аффинные преобразования — основа кинематического метода построения параметрических объектов (кривых и поверхностей), генерирующего состояния объекта из заданных начальных состояний точки, отрезка, окружности как функции некоторого параметра, имеющего физический смысл времени движения. Конечным результатом преобразований являются не уравнения объекта, а его изображение на экране. Построение изображения эффективнее выполнять не по сложным аналитическим уравнениям, а непосредственно по обобщенной векторной
Геометрические преобразования 171 модели, задав желаемое начальное состояние объекта, необходимые матрицы преобразований и интервалы изменения параметров. Простейший пример: для построения окружности кинематическим методом достаточно задать: П начальное состояние точки, например, р(о)= [\ 0J; 3 возрастающие значения параметра в интервале t е [0, 2л]; П векторное уравнение p(t) = p(0)R(t), моделирующее вращение точки на единичном расстоянии от начала координат. Параметр t имеет физический смысл угла между векторами р(0) и p(t). Для повышения эффективности своей работы программистом должна быть создана библиотека матричных и графических функций, процедур и алгоритмов. Такой стиль разработки программ делает их модульными и компактными, лучше читаемыми, удобными в отладке и внесении корректив в структуру и параметры модели. При решении же задач анализа необходимы координатные уравнения состояний объекта, получаемые обычно кропотливыми ручными выкладками либо с помощью возможностей символического процессора MathCAD, либо какой- нибудь другой "умной" математической программы. Рассмотрим основы кинематического принципа конструирования линий. Кривая изображается на экране последовательностью точек p(t,), соединенных отрезками прямых. Визуальная близость полученной ломаной линии к гладкой кривой определяется плотностью размещения узловых точек по периметру кривой. Оптимальная плотность пропорциональна кривизне кривой, при этом минимальное расстояние между соседними точками должно быть порядка одного пиксела. Для получения такого распределения необходим анализ скорости V(t) - up(i)l At движения точки по кривой. Например, вектор скорости движения по окружности получается как at так и ручным выводом, и покоординатным дифференцированием уравнения (I.57): с(0= [1 о]Гс05(° sin(0 [-sin(0 cos (г) Анализ модуля векторной функции \V(t)\ - 1 показывает, что точка движется по окружности с постоянной скоростью, поэтому оптимальным является равномерное распределение значений параметра t, = iAt V/ = 0, п по интервалу [0, 2л] с постоянным шагом дискретности At = 2п/п. При таком выборе параметрической модели окружности соседние точки с, и гж = CjR(At) равноотстоят друг от друга как по углу At = const, так и по периметру: ki+i _ с,\ = 2sin(Af / 2) = const. = [cos (0 sin (г)] => И (f)= [-sin (0 cos (/)1- (2.37)
172 Глава 2 Соединение точек отрезками прямых аппроксимирует окружность правильным л-угольником (рис. 2.17, а). С учетом масштабного множителя цэ из (2.27, б) значения и = 2лцэ, At = 1 / Цэ достаточны для того, чтобы расстояние между узловыми точками было равно одному пикселу, а многоугольник точно совпал с окружностью. В действительности уже при At« 10 / Цэ многоугольник визуально не отличается от окружности. Возможны и некинематические параметрические модели окружности, например, удовлетворяющие каноническому уравнению хг + у2- 1 =0 функции координат x(t), >>(/) и вычисленный их дифференцированием вектор направления движения V(t): _ 1 4> \+t2 , Я'Ь 2t \ + t2 V(t)=2 -2t \-t' LM2 M2J " ,+' • И01-: (2.38) Зависимость модуля вектора скорости движения от параметра / означает, что при постоянном шаге At точки [дг(/,) >'(/,)] распределены по окружности (кривой постоянной кривизны) неравномерно (рис. 2.17, б). Кроме того, точка [-1 0J, соответствующая значениям параметра t = ±оо, вычислительно недоступна. Следовательно, дробно-рациональная модель (2.38) неудачна, хотя по ней точки окружности рассчитываются быстрее, чем по тригонометрической модели (2.37). Еще менее удачна некинематическая модель *(') = ', >'(')= Vl^"v/6[-l, 1]. Во-первых, по ней строится не вся окружность, а лишь ее верхняя половина. Нижняя половина имеет ординату y(t)= -\l-t . Во-вторых, вектор скорости V(t) = -t 4l-t в крайних точках [±1 0J при f->±l невычислим. В-третьих, нелинейная зависимость модуля скорости |к(/)| = 1/\1-' от параметра / также дает неравномерное распределение точек p(Q по периметру (рис. 2.17, в). Проведенный сравнительный анализ трех моделей одного и того же графического объекта показывает, насколько компетентно нужно подходить к выбору как уравнений модели, так и ее параметров для получения достоверного и качественного изображения объекта на экране дисплея.
Геометрические преобразования 173 Параметрические уравнения произвольного эллипса на плоскости с центром в точ- ке Рц = lxu >'uJ. полуосями а, Ь и углом наклона большой полуоси а получим за три преобразования (масштабирования, вращения и переноса) окружности c(t) (рис. 2.18): Р('М') РЦ! а О cos(cc) sin (а) О Ь -sin(а) cos(cc) Ix(t)= acos(cc)cos(f)- fcsin(a)sin(/)+ дгц, >>(/)= osin(a)cos(/)+*cos(a)sin (/)+>'ц (2.39) у' У,г i X Jy& x< Ry/ X Рис. 2.18 Модуль v(/) = \v{t)\ = Va2sin2(')+*2«>s2(0 вектора скорости V{t)= c'(t)M(a,b)R(a)= = [-acos(a)sin (/)-fcsin(a)cos(f)-asin(a)sin (/)+fccos(a)cos(/)J
174 Глава 2 движения точки по эллипсу зависит от параметра t (рис. 2.19, а): в точках апогея с максимальной кривизной скорость минимальна (v = min{a, b}), в точках перигея с минимальной кривизной — максимальна (v = max{a, b}). Следовательно. при аппроксимации эллипса полигоном плотность распределения его вершин р, по периметру должна быть переменна: максимальна на участках апогея и минимальна на участках перигея. Рис. 2.19 Точное решение задачи распределения связано с исчислением эллиптических интегралов. Простейшее же решение — равномерное распределение /, = iAt с шагом At = 2п/ п— благодаря непропорциональному масштабированию окружности в (2.39) при афЬ фактически приводит к нужному результату (рис. 2.19, б): график 6(0 плотности распределения точек p(t) по периметру эллипса, приведенный на рис. 2.19, а, обратно коррелирует с графиком скорости v(t). Оптимальные значения числа сторон полигона и шага дискретности «э =|27i|a3min{a,fc/|, Д/э = — дают минимальные расстояния между точками эллипса в один пиксел на участках с максимальной кривизной. В частном случае при а~ b = г и а-0 эллипс превращается в окружность радиуса г с центром в точке рп = |хц _уц]: p(f) = rc(f)+ Plx = [rcos(t)+Xlx rsm(?)+ya]. (2.40) Наилучшее качество аппроксимации окружности правильным и-угольником достигается при выборе параметров моделирования «0=[27tu.y~|, Д/0 = 271
Геометрические преобразования 175 Произвольную окружность в пространстве радиуса г с центром в точке pu е R3, лежащую в плоскости {pu, N}, получим несколькими способами. П По методу разлолсения подвергнем окружность единичного радиуса c(t) е ху с нормалью z° трем активным преобразованиям: • масштабированию до радиуса г; • совмещению нормали с вектором N; • переносу центра в точку рп. Векторное уравнение окружности p{t) = r[c{f) 0}Apl(N)+Pll (2.41) использует обратную матрицу преобразования системы координат AV(V) с аргументом V= N, вычисляемую в разд. 2.1.3.1 двумя способами: • по варианту (2.30), (2.31) поворот z° —> N выполняется вращениями, изображенными на рис. 2.20, а. Обозначив вектор проекции нормали v = [/Vv 0 Nz]exz, получим алгоритм a = if(|v|: angle(y,y°\o), P = i arcsin ,Ap](N)=Rx(-№y("h (2.42, a) W A Рис. 2.20 по экономичному варианту (2.33) два вращения обеспечивают кратчайший поворот z° —> N (рис. 2.20, б). Вычислив вектор W = z°xNexy,
176 Глава 2 получим алгоритм a = if(|w|: angle(y°, w), о), p = arccos(z°°/v), A^(N)=Ry(fi)Rz(a). ^42^ Для иллюстрации сказанного составим по (2.42, б) аналитические уравнения произвольной окружности в зависимости от ориентации нормированной нормали /V = ]NX Ny Nz\: • при N#z° для вектора W = z° xN = [- Ny Nx OJ длиной w = JNX + Ny * 0 и параметров углов cos(a)=-^, sin(a)= Nv/w, cos(p) = N., sin(P) = w w *' получим координатные функции jc(() = r(cos(a)cos(jp)cos(r)-sin(a)sin(r))+xu = = xn + — \NXNZ cos(f)- Nv sin(r)J, Vf y(t) = r(sin(a)cos(jp)cos(f) + cos(a)sin(r))+ yn = (2.43) = Уп + — (^yNz cos(/)+ Nx sin(/r)), w z(r)= -rsin(jp)cos(/)+zu = zu -rwcos(f) • в особом случае при N || z° в (2.43) имеет место вычислительная неопределенность типа 0/0 из-за того, что Nx = Ny = w = 0. Поэтому, полагая W = y°, a = 0 и cos(p) = Nz = ±1, получим уравнения окружности, не являющиеся следствием уравнений (2.43) и потому не имеющие права на забвение при программировании и анализе: x(t) = rN: cos(0 + хи, y(t) - г sin(0 + уи, z(t) = z„. (2.44) Применение метода разложения в задачах со сложными преобразованиями требует развитого пространственного воображения и учета особых случаев, что часто игнорируется и рано или поздно приводит к сбою программы. Кроме того, преобразование по варианту (2.42, а) не дает поворота векторов z° —>N по кратчайшему углу. П Получим уравнение окружности суперпозицией колебаний точки вдоль двух ортогональных векторов V и W, лежащих в плоскости {ри, N} (рис. 2.21). В соответствии с (1.71) выберем произвольный вектор H#N, вычислим ортогональные нормали векторы V = HxN, W = NxV
Геометрические преобразования 177 и составим комбинацию взаимно ортогональных гармонических колебаний вокруг центра ри: p(t)= pn+rcos(t)v + rsin(t)W. (2.45) Рис. 2.21 При N#z° примем H = z°, тогда y = [-Ny Nx o],W = [-NxNz -NyN: и>2],где w = ^Nx+Ny *0. Подставив эти выражения в (2.45), получим аналогичные (2.43) выражения x(t) = хц - — \NV cos(()+ NXNZ sin (f )1 w ■ y(t) = ylx+L(Nxcos{t)-^y^zMt)\ (2.46, o) w z(t)=zll +rwcos(t). При N || z° примем // = x°, тогда, подставив в (2.45) векторы к = [о -yvz o],W = [-l 0 О], получим аналогичные (2.44) функции x(t) -xu- rs~m(t), y(t) - yu - rN. cos(0, z(t) = zu. (2.46, 6) Таким образом, метод суперпозиции в конечном итоге эквивалентен методу разложения, но существенно проще его как для анализа, так и для практического построения окружности в пространстве.
178 Глава 2 П По методу парных точек, основанному на расширенном варианте (2.34, б). вычислим ортогональный нормали /V = [Nx Ny Nz\ вектор W = \f\ z°xn\: z°xN, Nzy°\ с помощью которого получим уравнение окружности ?(г)=М0 о 1\с-]{рп,м)= Pu + WxN 1 [rcos(f) rsin(() 0 l-/-cos(r)-/-sin(f)] Pix + W 1 pu + N 1 Pix • (2.47) Применение метода парных точек, в котором задаются лишь начальное и конечное состояния объекта, позволяет исключить из процесса разработки алгоритмов сложных преобразований выбор промежуточных ЭП, расчет их матриц, учет особых условий ориентации объекта относительно системы координат и другие тонкие моменты, непонимание которых может привести к нежелательным визуальным эффектам. Циклические кривые Циклические кривые образуются сложением относительного движения точки по окружности с переносным движением центра окружности по кривой pu(t) (рис. 2.22, а): p(t) = r(t)c(<at)Q + pu(t). (2-48) [-■ lit I? Я ^* Рис. 2.22 В этом уравнении: П r(t) — закон изменения радиуса окружности;
'неметрические преобразования 179 to — частота относительного вращения, согласованная с переносным движением и равная числу оборотов точки с(ш) при изменении / на 2л; j 2— матрица управления начальным состоянием и направлением вращения точки по окружности. На рис. 2.22, б приведены значения матриц Q, дающих начальные условия на осях координат и оба направления. 2 целом закон движения (2.48) расширяет возможности формулы (1.58). ~1о1учим уравнения некоторых циклических кривых. 3 Циклоида — это траектория движения точки окружности радиуса г при ее качении без скольжения по прямой у — О (рис. 2.23). Пусть в (2.48) со = 1, тогда отсутствие скольжения означает переносное движение pjf)=r]f 1]. Рис. 2.23 При изменении параметра t на 2л центр окружности смещается по оси х на расстояние 2пг — длину ее периметра. Выберем матрицу О q = m(i,-i)r(-9o°)-- 1 •1 О такую, что вращение точки c(t)Q = [-s'm(t) -cos(/)] происходит из начального положения [О -l] по часовой стрелке. Объединяя найденные элементы движения, получим векторную и координатные уравнения циклоиды p(t)=r[t l]-r[sin(0 cos(/)], x(t)=r(t-sm{t)), [y(t)=r(\-cos(t)). Трехмерный аналог этой кривой — циклоидная поверхность, по которой движется точка сферы, катящейся по плоскости. Подобная поверхность изображена на рис. 1.55, д. Ее параметрическую модель можно получить, вращая циклоиду вокруг оси у: p(t,T)=r[t-s\n(t) l-cos(0 0]лу(т)= = r[(/-sin(r))cos(x) l-cos(/) (sin(/r)-/)sin(T)].
180 Глава 2 Кинематическому методу формирования разнообразных параметрических поверхностей посвящен основной материал, изложенный в гл. 3. П Эпициклоида представляет собой траекторию движения точки окружности радиуса г при ее качении без скольжения снаружи окружности радиуса (рис. 2.24). Переносное движение описывается формулой Ри(?)=(го+г)Уп(?) с°4)1 Рис. 2.24 При изменении параметра t на 2л центр внешней окружности совершает со = Го / г + 1 оборотов вокруг внутренней. Матрица Q такая же, как у циклоиды. Подставляя найденные элементы движения в (2.48), получим параметрические уравнения эпициклоиды p(t) = (r0+r)[sin(t) cos(/)]-r [sin(tof) cos(to/)], x(t)=(r0 +r)s'm(t)-rs\n >(/) = (r0 +r)cos(t)~rcos ((r ^ ^-+1 О Гипоциклоида— траектория движения точки окружности радиуса г при ее качении без скольжения внутри окружности радиуса г0 (рис. 2.25). Переносное движение описывается формулой pjf) = (r0-r)bm(t) cos(i)l- При изменении параметра t на 2л центр внутренней окружности совершает со = л0 / г - 1 оборотов по периметру внешней. Матрица Q = R(90°) = О 1 -I О
Геометрические преобразования 181 дает вращение точки c(t)Q = [-s'm(t) cos(f)] против часовой стрелки из начального положения [о l]. Подставляя найденные элементы движения в (2.48), получим уравнения гипоциклоиды р(с)~ (ro ~r)[sin(t) cos(f)]+ г [-sin(a)/) cos(a)f)], (( x(t)= (r0 -r)sin(t)-rsin y(t) = (r0 - r)cos(t) + r cos УГ У ((r \\ Рис. 2.25 3 Коническая винтовая линия с углом раствора 2а и шагом Л (рис. 2.26) образуется сложением равномерного переносного движения по оси у и спирального относительного движения в плоскости xz, подобного движению, изображенному на рис. 1.31, я: Ф 2л 2л = — [sin(a)cos(f) cos(a) -sin(a)sin(r)]. 2л 3 Замкнутая спиральная линия, N витков которой равномерно навиты на поверхность тора с осевым радиусом г0 и радиусом витков г (рис. 2.27), образуется сложением вращения точки по окружности Ро(') = гШ 0]+[го 0 0]
182 Глава 2 Рис. 2.26 Рис. 2.27 и вращения этой окружности с N раз меньшей частотой вокруг оси у: s(f)cos — rsin(r) -(/■„ +rcos(f)sin — w [nj w [n) Vr = 0, 2nN. 2.1.3.3. Кинематическая задача перемещения в пространстве Продолжая изучение методов сложных преобразований, рассмотрим кинематическую задачу перемещения в пространстве. В компьютерной графике непрерывное движение объекта изображается последовательностью состояний (фаз. кадров) — элементов дискретного множества его положений во времени и про-
Геометрические преобразования 183 странстве. Цель кинематического анализа и синтеза — изучение и имитация реалистичного движения графических объектов, выявление в алгоритмах движения методических ошибок и непредвиденных эффектов. Движущийся в R" объект как система связанных точек имеет 2л степеней свободы: п координат центра масс и и параметров угловой ориентации. Естественно, что наличие формул движения всех основных точек объекта (например, вершин полиэдра) полностью решает задачу кинематики, т. е. позволяет построить изображение объекта в любой момент времени. Однако такая полная информация об объекте, во-первых, не всегда имеется в наличии, а во-вторых, она избыточна. Согласно методу парных точек для идентификации состояния объекта достаточно знания координат его (н + 1)-ой точки, чтобы рассчитать матрицу преобразования из предыдущего состояния и групповым методом получить координаты остальных точек. Этот метод основан на принципе пространственно-временной когерентности — сохранении взаимной ориентации точек объекта при его движении в пространстве и во времени. При неполной информации об объекте логично полагать, что согласно принципу минимального действия он движется по экономичной траектории — кратчайшим направлениям переноса центра масс и поворота собственной оси. Без учета вра- -цения объекта вокруг своей оси и его состояние Р - {о, V) задается центром базовой точкой) о и вектором V направления оси и. Возможно, что объект так- че подвергается преобразованию подобия — равномерному масштабированию во зсех направлениях относительно своего центра. Изменение размеров объекта можно моделировать изменением длины вектора V. 3 машинной графике применяются два метода кинематического расчета перехода Р, -> Рм объекта из предыдущего состояния в последующее. П Рекуррентное вычисление состояний Рм=РА Vi"= 1,2,..., начиная с состояния Pi (рис. 2.28, а). Начальное состояние либо исходно задается элементами {о\, Vi}, либо рассчитывается по формуле р\ = ^оО) из состояния Р0 подобного объекту примитива— объекта единичных размеров, центр которого о0 расположен в начале СК, а вектор V0 ориентирован вдоль некоторой координатной оси. Ниже будет показано, что матрица сложного преобразования С, может описывать как прямой переход Pt—> Pl+l, так и переходы Р, -> Оп -> Pi+i через начало координат. Достоинство рекуррентного метода в возможности реализации экономичного движения при специальном выборе матриц С,. Недостатком метода является относительная сложность расчета таких матриц. Метод рекомендуется использовать в экономичном варианте при неполной информации о движении объекта.
184 Глава 2 □ Итеративное вычисление состояний объекта />=/?,<- V/=l,2,... из состояния примитива Р0 (рис. 2.28, б). В рамках данного подхода все геометрические объекты сцены исходно задаются примитивами, которые часто являются виртуальными, т. е. реально не существующими в сцене объектами. Примитивы удобны для выполнения преобразований относительно осей координат — масштабирования и вращений, после чего следует перенос центра объекта в нужную точку пространства о,-. В следующее состояние Р,+, объект опять переносится из начала координат, будучи предварительно подготовлен для этого необходимыми преобразованиями масштабирования и вращения. Положительными аспектами итеративного метода являются: • экономия на переносах Р, -»• Оя объекта в начало координат, которые требуются в одном из вариантов рекуррентного метода; • возможность использовать меньшее число примитивов, чем объектов сцены. Недостаток метода заключается в том, что два перехода Ро —» Р, и Ро —» P,+i могут быть не эквивалентны одному экономичному переходу Р, —> Р,+). Визуально это проявляется в виде эффекта нежелательного вращения движущегося объекта вокруг своей оси. Метод рекомендуется использовать при полностью определенных законах движения объекта. Рис. 2.28 Переходим к разработке кинематических алгоритмов— методов вычисления матриц преобразования состояний объекта с не полностью определенными элементами движения. Итак, пусть даны два состояния объекта {о\, V\) и {ог, Vi) с центрами в точках о\, ог и векторами направления осей V\, Vi. Относительное изменение размеров объекта охарактеризуем коэффициентом подобия
Геометрические преобразования 185 Попытаемся получить матрицу экономичного преобразования {oi, У\} —» {02, Уг} по кратчайшим направлениям переноса о\ —» ог и вращения Fi —» F2. Кратчайшее изменение направления от У\ до Уг означает одновременный поворот всех точек объекта, перенесенного из о\ в ог, на один и тот же минимальный угол у до совмещения У\ с Уг (рис. 2.29). Рис. 2.29 3 По методу разложения, основанному на преобразовании (2.30), выполним переход из {о\, V\} в {ог, Уг} за пять фаз с соответствующими матрицами: • Ф1: {о\, V\) -> {Оз, У\} — перенос из о\ в начало координат матрицей Т{-о\); • Ф2: {03, F|}—> |о3, |^1 |z° /— совмещение вектора У\ с осью z матрицей А(У); —масштабирование матрицей М(\х., р., р); • Ф4: (03,1^2^/-^(03,^2}— совмещение вектора 1^1-° с ^2 матрицей V(K2); • Ф5: {Оз, Уг} —> {ог, Уг} — перенос из начала координат в ог матрицей Т(ог). С учетом того, что фазы Ф2 и Ф4 включают до двух ЭП, суммарное число ЭП достигает семи. Матрица полного АП вычисляется по достаточно длинной формуле С = Г(-01)Лр(к,)м(ц, и, nja-'fojTfe)- (2.49) На рис. 2.30 изображены выполняемые по описанному алгоритму фазы преобразования несимметричного объекта — двухцветного флажка, древко которого задает вектор направления У. Оказывается, что конечное состояние {ог, Уг} не полностью совпадает с результатом экономичного движения, изображенным на рис. 2.29. Совпали лишь концы вектора Уг. Остальные точки
186 Глава 2 объекта дополнительно поворачиваются вокруг оси на угол вплоть до значения 180° при |ot] -tx2| = 180°. Рис. 2.30 В чем причина такого нежелательного эффекта? Очевидно в том, что сложное АП (2.49) не является экономичным: четыре элементарных вращения объекте на углы -cu, Pi, сег и -fiz, не лежащие в одной плоскости, не дают в совокупности кратчайшего угла. Таким образом, метод разложения с промежуточной ориентацией объекта вдоль координатной оси не может дать экономичного алгоритма решения кинематической задачи. □ В экономичном варианте алгоритма по методу разложения явно присутствует кратчайшее вращение объекта на угол у > 0. заключенный между векторами V\ и \'г (см. рис. 2.29). Значение этого угла \\i = arccos(p) определяется скалярным произведением р = V\ ° V2 ■ Ось кратчайшего вращения ортогональна плоскости {oi, V\, Уг) и имеет направление нормали N= V\xVi. В случае V\ || Vi, когда |р| = 1, можно выбрать вектор N = У{ хсо0, ортогональный к V\ и орту ft)0 # Vt, где со е {х, у, z]. Фазы преобразования объекта (рис. 2.31) и их матрицы следующие: • Ф1: {oi, V]} -> {Оз, Vi} —перенос из точки о\ в начало СК матрицей Т(-о\). • Ф2: {x,y,z} -*■ {x',y',z'}— совмещение оси z с нормалью N матрицей ЛэР(Л0; • ФЗ: {о3,М.^Г}~*{Оз, У{}~ вращение вокруг оси г матрицей .R.(arccos(p)). которую экономичнее вычислять по варианту (2.32) как Л2_/р, д/lV)
еометрические преобразования 187 без использования тригонометрических и обратных тригонометрических функций; • Ф4: {х',/, z'} -» {х,у, z} — восстановление СК матрицей А^\{N); • Ф5: {03, V{}-^ {о3, М-^г} —масштабирование матрицей М(\х, \х, ц,); • Ф6: {Оз,^} —» { 02, Vi) — перенос из начала координат в точку oi матрицей Ц02). Рис. 2.31 В итоге матрица сложного АП, включающего до восьми ЭП, вычисляется по следующему алгоритму: P = VX°V2, И = В, N = V]x\fi^<\:V2,\fi\VXz\<\vx\:z0,y°\ |Fl1 (2.50) С = T(-о,Яр(/v)*2z(p, VbV )¾№(ц, u, *г)г(о2). 3 По методу парных точек построим две ортогональные системы векторов, связанные с исходным и конечным состояниями объекта (рис. 2.32): • вычислив нормаль N- V\ х Vi (если V\ \\ Уг, то при Vi#z° полагаем N = Vx х z°, а при К( || z° — N = Vx ху°) и бинормаль W\ - V\ х TV, получим исходную систему векторов на четырех точках: {01,01 + Fi.oi + N,oi + W\); • вычислив коэффициент подобия n = |^2|/|^i| и бинормаль Wi - Vi х TV, получим конечную систему векторов на четырех точках: {02, 02 + Vl, 02 + |i/V, 02 + W2}.
188 Глава 2 Рис. 2.32 В связи с простотой, экономичностью и дальнейшим широким использованием оформим алгоритм решения кинематической задачи методом парных точек в виде функции расчета матрицы аффинного преобразования по двум парам точек, возвращающей матрицу АП объекта из состояния {р\,У\} в состояние {/72, Vl). E3MAP2(oi, V\,oi, Vi) {N = Vlxif(\vloy2\<\; V2, if(|r,z|<|F,|: z°, /J, ц = М; |K,| возврат матрицы Г о, г 0,+F, 1 oi+N 1 ox+VxxN 1 -1 o2 Г o2+V2 1 o2+iiN 1 o2+V2xN 1 Ортогональность векторов обращаемой в (2.51) матрицы обеспечивает ее наилучшую обусловленность. Единственное условие существования решения — ненулевые векторы V\ и Уг. Численные значения матриц, вычисленные по алгоритмам (2.50) и (2.51), совпадают, т. к. кинематическая задача имеет единственное экономичное решение. Трудоемкость же метода парных точек существенно меньше. Расчет матрицы преобразования системы координат из состояния {о\, V\) в состояние {о2, Уг} выполняется функцией МАР2(02, Уг, 01, V\) = МАР2{о\, V\, ог, Уг)1. В качестве параметров начального состояния можно выбрать начало координат 0i = Оз и один из ортов, например, Vx = z°. Тогда преобразование с матрицей Ск(о,У)= MAP2\p,V,03,z°)
'еометрические преобразования 189 переводит начало СК в точку о, а ось z' ориентирует по направлению вектора V. Положение осей х' и у' не регламентируется. Такая неопределенность ориентации системы координат вполне допустима в задачах на преобразования относительно только одной оси. Например, это вращение вокруг оси {о, V) на угол vj/, выполняемое матрицей CK(o,v)R.{v)C-l(o,V), или отражение от плоскости {о, N} с помощью матрицы ck(o,n)m(\,\,-\)c;1(o,n). Сравним три алгоритма (два по методу разложения и один по методу парных точек) и два подхода (рекуррентный и итеративный) решения кинематической задачи на примере движения плоского полигона Р через последовательность состояний /*!-> Pi ->...->/'„,-> Pi, равномерно распределенных по окружности радиуса г в плоскости ху (рис. 2.33). Состояние Р, задается точкой центра полигона и вектором нормали к его плоскости: Рис. 2.33 0;=лг°/?г((|-1)ДУ|/), W, =/tfz((/-l)&l|/), гдеДу= 2n/m. Соединение соседних состояний каждой из вершин полигона отрезками прямых з совокупности с изображением самих полигонов дает поверхность, классифицируемую в гл. 3 как трубчатая. Скручивание продольных каркасных линий наглядно свидетельствует о вращении полигона вокруг своей оси (нормали) на переходах между состояниями. На рис. 2.34, а изображена полностью определенная эталонная поверхность без осевого вращения, поперечные сечения которой (состояния полигона) рассчитаны по формуле Pi = ?o^(-7i/2)^z(/AV)r(o,) V/ = \Jn (2.52) при m = 36, где Ро е ху — состояние полигона с центром в начале координат и нормалью z°.
190 Глава 2 Наилучшие результаты — полное совпадение с эталоном — дали экономичные алгоритмы на основе рекуррентного подхода со следующими матрицами преобразований на переходе Р,—> Р,»: □ по рекуррентному методу разложения (2.50) Pi = Ni о Ni+U W,=N,x if (|p,| < 1: Ni+l, if (\Nl:\ < \N,\: z C, = T(-о, Яр(^ )R2/p,, д/l^pf fc №,)T{oi+l); 'I (2.53) П по рекуррентному методу парных точек (2.51) C^MAP2(ohNhoi+l,Ni+t). (2.54) Остальные алгоритмы проносят полигон через состояния Р, неэкономично, с дополнительным вращением вокруг нормали, что визуально наблюдается как скручивание продольных каркасных линий. Алгоритмы различаются степенью неравномерности угла скручивания по траектории движения полигона: □ по методу разложения (2.49) как в рекуррентной, так и итеративной формах неравномерная скрутка поверхности (рис. 2.34, б) наблюдается на тех участках, где вектор 7V, меняет знак абсциссы Nix, из-за чего происходит вращение полигона на некоторый угол, вплоть до 180° (см. рис. 2.30); Рис. 2.34
Геометрические преобразования 191 TS итеративные методы экономичного разложения (2.50) и парных точек (2.51) дают равномерное скручивание (рис. 2.34, в), объясняемое тем, что экономичные переходы полигона /¾ —» Р, и Ро —> Р,+1 не эквивалентны экономичному рекуррентному переходу Pt —> Pi+l. На рис. 2.34, г, д, е показаны результаты моделирования переходов полигона по траектории произвольно расположенной в пространстве окружности. Рекуррентные алгоритмы экономичного метода разложения (2.53) и парных точек (2.54) еще раз подтвердили свою работоспособность (см. рис. 2.34. г) в отличие от других изученных алгоритмов моделирования (см. рис. 2.34, д, е). Может возникнуть естественный вопрос: если есть точный метод кинематического расчета (2.52), то зачем нужны другие алгоритмы, некоторые из которых дают нежелательные визуальные эффекты движения? Ответ прост: в общем случае движение может быть не полностью определенным. Например, трубчатая поверхность формируется протягиванием контура ее поперечного сечения по траектории осевой линии, но кок ориентирован контур в каждом сечении — этот момент не оговаривается. Изображение такой поверхности выглядит неестественно, если ее продольные каркасные линии проходят не параллельно осевой линии, а закручиваются вокруг нее. Желаемый вид поверхности достигается с помощью экономичных рекуррентных алгоритмов движения, которые дают минимальное или вообще нулевое кручение продольных линий. Общий недостаток рассмотренных методов кинематических преобразований состоит в их нечувствительности (разной степени) к вращению объекта вокруг собственной оси из-за недостаточности задания только двух пар точек :oi,0i + У\} и {02,02 + Уг) на оси движения. Если известна третья пара точек о\ + W\ и ог + Wi вне оси, то матрица преобразования {о\, У\, W\) —» {02, Vi, Wi) находится по (2.13) после расчета нормалей N\ = V\ х W\ ф Оз, N1= VixW2* Оз и четвертой пары точек о\ + N\ и ог + Ni. Оформим данный метод в виде функции расчета матрицы аффинного преобразования по трем парам точек, возвращающей матрицу преобразования объекта из состояния {oi, V\, W\) в состояние {ог, Уг, Wi). ^ МАРЪ{р\, V\, W\,oi, Уг, Wi) ! возврат матрицы г п-'г 0[ 1 02 0,+И, 1 02+^2 о, + W, 1 е>2 + W2 Ox+Vxy.Wx lj \o2+V2xW2 (2.55) C2
192 Глава 2 Для преобразования СК из исходного положения (03, х°, y°,z° J необходимо знать ее новое начало о и неколлинеарные векторы V и W, задающие новые направления осей х' и у'. Матрица такого преобразования СК равна Ск=МАРЗ\р, V, W,03,x°,y0}. Наконец, если известны четыре пары некомпланарных точек объекта в начальном и конечном состояниях, то для расчета матриц преобразования объекта С и системы координат Ск используются формулы (2.13) и (2.14) при п = 3. Состояния объекта могут быть также полностью определены точками о\,ог\\ тройками некомпланарных векторов {V\,W\,U\} и {Vi, Wi, Ui). Для этого случая введем функцию расчета матрицы аффинного преобразования по четырем парам точек. 2D MAP4(oi, V\,W\, ¢/1,02, Vi, Wi, Щ {возврат матрицы О] 1 о2 I ox+Vx 1 o2 + V2 1 ox+Wx 1 o2+W2 1 o\ + Ux 1 o2+U2 1 }D Эту функцию можно использовать для преобразования координат точки р из исходной СК {o3,x0,y°,z0} в другую декартову (не обязательно правую и ор- тонормированную) систему координат с началом в точке о и осями х', у', z', направления и масштабы которых заданы базисными векторами V,WaU: р = рСк, где Ск = МАР4\р, V, W, U, 03, х°, у0, z°). (2.57, a) Аналогично решается задача преобразования точки р е ЮтСк{о2,х°,у°}в другую декартову СК, имеющую начало в точке о и базисные векторы VwW: С = (2.56) р = рСк, где Ск 0 Г o + V 1 o + W 1 -1 "о о Г 1 0 1 0 1 1 (2-57,6) Преобразование координат— полезный инструмент определения принадлежности точки q некоторым специальным геометрическим объектам при выполнении совокупности условий-неравенств 9? для координат прообразов q', вычисленных по (2.57): □ плоским параллелограмму П и треугольнику Т с одной из вершин в точке о и выходящими из нее векторами сторон Va И7 (рис. 2.35): П: Я = {0<х'<1}П{0</<1}; (2.58,о) Т: Ж = {х>0}п{у'>0}П\х'+ у'<\}. (2.58,6)
Геометрические преобразования 193 Рис. 2.35 Например, для параллелограмма П с элементами о = [б -l], F = [2 3] и W = [-2 lj получим матрицу преобразования Q = 6 -1 г 8 2 1 4 0 1 -1 "о о Г 1 0 1 0 1 I = 0.125 0.25 -0.25 -0.375 1 0.25 1 2.5 1 Точки 91 =[7 2].¾ =[-4 2], «7з =[-3 О имеют в СК {о, V, W) координаты q\ = [0.875 0.375], ^2 = 1-0-5 4.5], q3 = [-0.625 3.875]. По (2.58, а) определяем, что точка q\ лежит внутри параллелограмма, а точки qinqi — вне его. Эти же точки в системе координат треугольника Т с элементами о =[-6 4], F = [4 -2], W = [l -5] и матрицей преобразования 0.278 -0.111 Г 0.056 -0.222 1 J.444 -0.222 1 имеют координаты q\ = [3.5 -1], «ft = [°-444 0.222], q3 = [0.667 0.333]. По (2.58, 6) определяем, что q\ е Т, qi е Т, а точка дз принадлежит границе Т; Г5 объемным параллелепипеду П и треугольной пирамиде Т с одной из вершин в точке о и выходящими из нее векторами ребер V,Ww U (рис. 2.36): П: 9* = {0<x'<l}n{0</<l}n{0<z'<l}; (2.59,я) Т: Я = {/>0}П\у'>0}П{z >0}П{x' + y+z<\}. (2. 59, 6)
194 Глава 2 Рис. 2.36 2.2. Проективные преобразования Проецирование (от лат. projectio — выбрасывать вперед) — это отображение трехмерного объекта на двухмерную картинную плоскость (КП). Получение проекции базируется на методе трассировки лучей: из центра проецирования S (проектора) проводятся лучи через каждую точку объекта до пересечения с КП (рис. 2.37). След, образуемый точками пересечения лучей с КП, составляет проекцию объекта. Если фокусное расстояние Fbo много раз больше габаритов объекта и расстояния d от источника лучей до объекта, то пучок проецирующих лучей можно считать параллельным, а источник — дальним. Такая идеализация отображения объемного мира на плоский экран облегчает построение проекций, за что приходится платить ухудшением реалистичности изображений. Рис. 2.37
Геометрические преобразования 195 За длительное время развития цивилизации придумано множество способов изображения объемных объектов на плоскости, более или менее точно передающих их геометрическую форму. Поскольку проецирование— не аффинное преобразование и в принципе необратимо, то любая проекция всегда содержит в себе ошибку (лучше сказать — неопределенность) восстановления координат объекта-образа. Назначение того или иного метода проецирования состоит в уменьшении неопределенности восприятия наиболее значимых свойств объекта за счет менее значимых. Например, архитектурный чертеж фасада здания абсолютно точно передает геометрическую ширину и высоту как всего фасада, так и его деталей, за счет полной неопределенности их глубины. К числу важнейших свойств метода проецирования относится достоверность восприятия объекта наблюдателем по его проекции, т. е. узнаваемость объекта по его плоскому изображению. Если свойство достоверности восприятия объявляется доминирующим, то наилучшей может стать "живая" проекция с далеко не минимальной геометрической неопределенностью. Например, изометрическая проекция несет искаженную информацию о размерах объекта во всех трех измерениях, но лучше передает форму объекта в целом по сравнению с изображением объекта в "фас". ПРОЕКЦИИ [ Параллельные ) ( Центральные ( Косоугольные ] ( Ортогональные ( Аксонометрические f Т и мет ические СДиметрические ) »■■ ■»■■• -j* J Изометрические С одной точкой схода С двумя точками схода .. С тремя точками \. схода Фронтальный ] \ Горизонтальный i] ^( Профильный J [ Нижний ] [ Задний ] Рис. 2.38 На рис. 2.38 приведена общепринятая классификация проекций, используемых для изображения трехмерных объектов или сцен на картинной плоскости. С учетом вышесказанного следует признать, что наилучшей проекции не существует. Во-
196 Глава 2 первых, критерий выбора проекции определяется ее назначением — достижение геометрической точности или получение эстетического удовлетворения. Во- вторых, "на вкус и цвет товарищей нет": автор данной книги, например, предпочитает диметрическую аксонометрическую проекцию (это видно по большинству рисунков), тогда как некоторые эстеты без ума от изометрии с ее чересчур правильной и скучной симметрией. Для лучшего восприятия ориентации объектов в пространстве мы иногда будем рисовать вместе с проекциями объектов еще и проекции осей МСК x'y'z', СКС x'cy'cz'c или ОСК x'0y'0z'0. Эти проекции создаются по тем же алгоритмам, которые используются для изображения объектов. 2.2.1. Ортографические проекции Для получения ортографических проекций (видов) оси ОСК ориентируются параллельно осям МСК, вдоль которых направляются пучки проецирующих лучей. Так как последние оказываются перпендикулярными координатным плоскостям, то в виде теряется информация о координате вдоль оси координат, параллельной пучку (рис. 2.39, я). Отдельные виды необратимы. Восстановление 3d- объекта возможно не менее чем по двум его видам, содержащим совместно все три координаты. Л г ■з 2 У А'- а ~1 г 1 2 3 2 3 i 4 х' а Рис. 2.39 С целью точной передачи размеров деталей в инженерной практике применяются чертежи в составе трех главных видов (рис. 2.39, б): П спереди или фронтальный (front) на КП f (ФКП), совпадающую с координатной плоскостью МСК ху. У проекции р' точки р координаты равны x' = x,y'=y,z' = 0;
Геометрические преобразования 197 П сверху или горизонтальный (horizon) на КП h — плоскость MCK xz. Координаты проекции точки р равны х' - х,у' - 0,z' = z; П справа или профильный (profile) на КП р— плоскость MCK j>z. Координаты проекции точки р равны x' = 0,y=y,z' = z. Если сплошной (не каркасный) объект имеет сложную форму, которую нельзя передать с помощью главных видов, то как исключение в чертежах приводятся вспомогательные виды: левый, нижний и задний. Матрицы видового проецирования Of=diag[l 1 0], Oh=diag[l 0 i], Ор =diag[o 1 l] (2.60) вырождены, что подтверждает невозможность восстановления по формуле (2.2) всех трех координат точки только по одному ее виду. Область применения видов — машиностроительное черчение, архитектура и другие приложения, требующие точных измерений по чертежу линейных и угловых размеров объектов благодаря параллельности измеряемых элементов плоскостям проецирования. Особое значение имеет фронтальное ортогональное проецирование с матрицей Of как последняя фаза аксонометрического проецирования. Создание на плоскости иллюзии объемности с помощью только одного изображения объекта возможно двумя способами. 3 Во-первых, объект вместе с его ОСК подвергается преобразованиям вращения вокруг двух или трех неколлинеарных осей, в то время как проецирующие лучи остаются перпендикулярными к проективной плоскости. Так получаются ортогональные аксонометрические проекции. 3 Во-вторых, можно направить проецирующий пучок под углом к КП, осветив тем самым объект сбоку. Так образуются косоугольные проекции и их оптический аналог — тени объектов на плоскости. 2.2.2. Аксонометрические проекции Выберем для определенности фронтапьную КП проецирования и последовательность вращений объекта и его ОСК х0 у<> z0: % -> фл -> Фг- Такая очередность поворотов дает привычную вертикальную ориентацию проекции у' оси у0 при произвольных углах первых двух вращений (ру и фЛ. Лишь третье вращение ОСК на угол ф. поворачивает проекцию этой оси на такой же угол. В результате получим ориентацию ОСК относительно ФКП, изображенную на рис. 2.40.
198 Глава 2 Рис. 2.40 Задача аксонометрии (от греч. axon — ось, metreo — измерять) состоит в определении координат проекций точек, осевых масштабов тх, ту, mz и ориентации проекций осей ОСК л', у' и z' на ФКП. Рассчитаем матрицу сложного преобразования (трех вращений) объекта в неподвижной СК xyz: v^fe'ktak-farb тхх т^ mxz тух туу myz т-у mzz (2.61) Ее (i,y)-bie элементы т^ =со5(ф>, jcos^-J-sin^ )sin (фЛ. }sin (<р _), туу =соЩ>у)smi$z)+sm{qx)s\r\\$})cos{qz), mxz = ~cos,{^x)sm\^y), тух = ~ cosfa )sin (фг). туу = cosfa )cos((p.), myz = sin (фх), mzx = sin\(py )cos(ipr )+ sin^ )cos^, Jsin^,), % = sin(^)sin(pj-sinfa)cos(^)cosfa..), mzz = cos(ipx)cos((py) (2.62) естьу-ые координаты /-ых ортов ОСК. Получим соотношения для расчета углов фЛ, Ц1У и ф. наклона осей ОСК к ФКП: sin Ых) = "Jxz = - С(*(ф* )sin (ф);), sini^y)=myz = sin (фх ), sin(\j/z )= w?2Z = cos(cpx)cos^ Д (2.63)
Геометрические преобразования 199 из которых следуют независимость углов ц/х, ^.и у. от угла <р_ последнего в (2.61) вращения и условие связи углов sin2(yv) + sin2^) + sin2(y_) = I. (2.64) Оно означает, что свободно могут быть выбраны только один или два угла наклона осей ОСК к ФКП. Примеры: □ yv - 45°, у, = 30° => sin2(y;) = 0.25 => у, = 30°; □ yv = 45°. у, = 45° => sin2(y,) = 0 => у, = 0°; □ у v = 90° => Ц1Х = Ц1: - 0°. Из (2.63) следует решение обратной задачи: для получения желаемых углов vyv, \iy и yz углы вращения ОСК следует выбирать из условий J sin(y,) фд. = у,., ф}, = -arcsin ^sinAjrJ cos ю = arccos (2.65) Масштабные коэффициенты осевых искажении тх = V"'^ + т% = V1 ~cos2 (ф* )sin 2 (ф>')=cos(Vx) ^ 1. ч}, = фп^ + mjy = \cos((j)x )| = cosily )< 1, т. = Jm:x + inly, = J] - cos (фд. )cos (ф v ) = cos(\yz ) < 1 (2.66) есть длины отрезков — проекций ортов ОСК на КП. Из (2.64) и (2.66) следует условие взаимосвязи масштабов: 3- , .„2 , 2 . (2.67) тх +ту + m. =2. Как и в (2.64), свободно могут быть выбраны только один или два масштаба. Иногда нужно обеспечить желаемые соотношения масштабов тх :ту: т: = А\ : ky : к:. Тогда, приняв т, = ск„ из условия (2.67) получим \k*+kl+k* , mt=k /Су I fi-ш) Т К.-? (2.68) Ориентация проекций осей ОСК на ФКП может быть определена, например, >глами у,., уху, yf. и у-л (рис. 2.41). причем у + уу: + у.х = 360°: cosfy^^^cos^-) => уу =ф,; (2.69,0)
200 Глава 2 cos cos mxxmyx+mxy +myy _ in x in у myxmzx+myy+mzy mymz sinfcy)sin^.J ■Jl-COS^Jsitl2^) -sin^Jcos^^) ^/l-cos^Jcos2^)' (2.69, 6) cosWzx/~ mzmx cos^Jsin^jcos^) ^1 - cos2 (фх )sin 2 (ф^ Ц\ - cos2 (фх )cos2 (ф^ ) Рис. 2.41 -90°<фх<0° -90°<фз,<0° 0°<фх<90° -90°<фз,<0° У _ -90°<фх<0° 0°<ф>.<90° 0°<фж<90° 0°«р,<90° Рис. 2.42
Геометрические преобразования 201 Изобразим на рис. 2.42 ориентации осей х'. у', г' и моделей кубов в зависимости от знаков углов фЛ и фг Из анализа (2.69) следуют выводы: ZS только углы фд и ф^ определяют коэффициенты осевых искажений и углы между проекциями осей ОСК; TS только угол ф. последнего поворота ОСК определяет угол у,, вертикальной ориентации проекции ОСК на ФКП. Именно поэтому вращение ОСК вокруг оси z выбрано последним, чтобы без него можно было получать разнообразные ракурсы изображения объекта с привычным вертикальным расположением оси у'. Часто при построении аксонометрической проекции задаются масштабами mv, ту и от., соответствующими единичным отрезкам на осях х',у' и z'. Тогда остальные параметры ортогональной аксонометрической проекции можно рассчитать по вытекающим из (2.66) формулам: cos :Ы=' cos U- l-i 7 cos(\fx)=mx, cos\yy)=my, cosfy. )=»?,, (2.70) cos l 2 ''^ху)=-~2' cos2(Vyz)=T—T'cos2(VzJ= у 2л \ l-ml \-т \-т} \-rni АГ - Ryxz°t - тхх тух т=х тху Шуу mzy 0 0 0 Полная матрица ортогонального аксонометрического преобразования на ФКП с учетом последней операции проецирования равна (2.71, о) Для того чтобы проекция имела вертикальную ориентацию оси у' (уу = 0), поворот объекта вокруг оси z не нужен, что следует из (2.69, а). При ф. = 0 матрица фронтального аксонометрического проецирования вычисляется как матрица сложного преобразования Af = Ry,Ot и с учетом (2.71, о) и (2.62) принимает вид cos (фу) sinfajsin^) -cosfajsin^) Ar = 0 COS^x) 5т(фх) Of = sin(cp ) -sinfojjcos^j cosfox)cos^.,) г I \ , ч ( \ л (2-71,6) cos \y>y ) sm (ф x )sin \fpy) 0 0 cos (фх) 0 sin^) -sinfa^cos^) 0
202 Глава 2 Во многих задачах (построение теней и зеркальных отражений, расчет освещенности поверхностей и т. д.) требуется знать вектор направления на источник проецирующих лучей, выраженный в объектных координатах. В МСК это вектор S. Например, при фронтальном ортогональном проецировании S = \0 0 l], при горизонтальном— 5 = [о 1 О], профильном— 5 = [i 0 о]. Преобразование сцены матрицей С изменяет и координаты вектора S в ОСК. Их легко получить с помощью обратного преобразования, описываемого матрицей С1. Координаты вектора наблюдателя в ОСК вычисляются по формуле (2.15): ^-1 SC Обратная к (2.61) матрица равна Ryxz ~ R2 Rx Ry '■ Ryxz > откуда получаем вектор источника в ОСК: 50 = SRyxz = \sx sy s. J mY m ХУ ■yx "УУ "zy mr m. (2.72, a) В частном случае фронтальной аксонометрии с вектором S = [0 О 1J и матрицей ИуЛ с учетом (2.62) получим £о=|/«*г т^ /7?„]=[-со5(фх)8ш(ф>,) sin((px) cos^jcos^jjj. (2.72,6) Рассмотрим построение аксонометрической проекции окружности p(t) радиуса г. лежащей в плоскости П под углом к КП, равным 90° - у < 90°. Ее проекцией является эллипс p'(t) с полуосями а-rnb-r sin(y) < г, ориентированными относительно проекции нормали к П как b\\N' на ± N' (рис. 2.43, а). тг.т...т. =6:5:4 „ ' > ' б Рис. 2.43
Геометрические преобразования 203 Так как координатные плоскости ОСК образуют с ФКП углы 90° - у,, то длины п ориентации полуосей эллипсов как проекций окружностей на гранях модельного куба (рис. 2.43, б) равны af=r± z, ah=rl У> ap=r 1 х, 'f = гл/l - ml || z, bb=r^\- ro2 \\ y, bp = гл/l - m\ || x. (2.73) '^7 Пример 2.5. Построить аксонометрическую проекцию куба со вписанными в его грани окружностями при соотношении масштабов /нЛ: my: т. = 6:5:4. Решение. Вычислив по (2.68) ? \77: 0.1612, тх = 6с « 0.967, тг = 5с « 0.806, т: = 4г ~ 0.645, определим по (2.69, 6) углы ориентации проекций осей ОСК уд>. = 101.2°, уу: = 150.6е, у:1 = 108.2°, а по (2.73) длины полуосей эллипсов at = «ь = <7Р = г, Ы - 0.764л, Ы - 0.592л ЬР - 0.255л, являющихся фронтальными проекциями окружностей радиуса г на передней, верхней и правой гранях куба. Изображение объекта приведено на рис. 2.43, б. Для его построения по (2.69, a), (2.70) и (2.71,6) рассчитаны следующие углы вращения объекта и матрица проецирования: "0.949 -0.187 0" <р, = -18.4°, фЛ = 36.3°, ф_. = 0°, Аг = 0 0.806 0 . □ -0.316 -0.562 0 Таким образом, мы рассмотрели основы аксонометрии— методики построения самой общей триметрической ортогональной проекции, у которой все осевые масштабы попарно не равны друг другу. Количество триметрических проекций бесконечно, стандартная триметрия отсутствует. В диметрических проекциях два из трех масштабов равны друг другу, что дает три варианта выбора углов вращения ОСК. 3 Если wiv = ту *■ т., то из (2.66) получим sin2(ipj,) = tg2(q>v), откуда |фх|=|агс1§(5'п(ф>'))|' тх = ту = \cos(®x )|, ту = *fc\s\K\($x )|, cos2(YvZ)=cos2(Yzx) = tg(<Px) tg(2<P») b{ =rj\cos{2<px)\, bh =bp = r|sin(q>J|.
204 Глава 2 Например, выбрав уу = -60°, получим tg2^v) = 0.75. Из четырех возможных углов выберем Фх = arctg 2 V J = 40.9° и определим параметры диметрической проекции куба на рис. 2.44, я: тх = ту = 0.756, щ = 0.926, yyz = у„ = 110.7°, уху = 138.6°. □ Если ту = т. ф тх, то из (2.66) получим cos2^) = tg2(<p_v), откуда |<Р^| = (arctgfcos^ ))|, тх = yl2\sin(((>x )|, ту=т2= Icos^ )|, cos2(y^)=cos2(yzjc)= tg(2<P*) bf =6h ^/-ЦпСф^», bp =ryj\cos(2(()x)\. Например, выбрав уу = -30°, получим tg2^v) = 0.75. Из четырех возможных углов выберем срх = arctg 2 v J = 40.9° и определим параметры диметрической проекции куба на рис. 2.44, б: тх = 0.926, ту = mz = 0.756, уд, = у„ = 110.7°, yyz = 138.6°. □ Если тх-т.Фту, то из (2.66) получим sin2^,) = cos2^), т. е. выбор углов вращения ОСК должен быть таков: уу е {±45°, ±135°}, фЛ. — любой. Тогда параметры диметрической проекции имеют вид _yJ3-cos(2(px) ту = |cos^x)|, 2г , 1, „ l-cos(2<p,) \ху) bf=bp= ^ r> bh=r\sin{<px)\. Например, выбрав <py = -45° и ф,.= 15°, получим параметры диметрической проекции куба на рис. 2.44, в: тх = mz = 0.73, ту = 0.966, уху = уу, = 104.5°, уХ2 =151°. В стандартной диметрической проекции соотношение масштабов составляет тх:ту:т, = 2:2: 1.
Геометрические преобразования 205 Ф,=40.9° Ф,=-45° Фх=15° В Рис. 2.44 Ф,=45°, Ф, =35.26°, Фг=30° Тогда по (2.34) определяем m =m =^2l^0.943, т= — = 0.471, * * 3 3 а остальные параметры этой проекции (рис. 2.45) равны уг = у„= 131.4°, y,.v = 97.2°, A*=^-r«0.882r, ^ = 6р = - = 0.333г. тх: Шу: т. = 2:2:1 Рис. 2.45
206 Глава 2 Для получения стандартной диметрии углы вращения ОСК должны быть заданы в соответствии с (2.70) равными ф = -arccos /Тр = -20.7°, (рх = arccos "Г k-9j = 19.47°,фг = 0°, тогда матрица проецирования и вектор источника по (2.71,6) и (2.72,6) будут равны А = "дим Ъ \72 Ъ \72 ^дим=[1 1 V7]=ll 1 2.646]. 0.935 -0.118 0 0 0.943 0 -0.354 -0.312 0 (2.74) При построении ортогональной изометрической проекции выбор углов вращения ОСК фЛ и фЛ. связан условием тх = /и = т.. Тогда из (2.68) получаем m, = J-=0.816, а из (2.70) и (2.73) следуют соотношения С052(фж) = у, cos2(q>j,)=-, cos2(yx>,)= cos2(y^)= cos2(ym)=-, bt=bh=bp=-j=r='0.5nr. v3 Из этого можно сделать следующие выводы: □ изометрическая проекция объекта может быть получена вращением его на углы ц>у е {±45°, ±135°} и фЛ. е {±35.26°, ±144.74°}; □ проекции осей ОСК ориентированы под углами, кратными 60°; □ проекции всех окружностей на координатных плоскостях ОСК подобны, отличаясь лишь ориентацией осей. На рис. 2.44, г построена изометрическая проекция куба при углах вращения Ф, = 45°, фу = 35.26° и ф. = 30°. Стандартная изометрическая проекция (рис. 2.46) получается при углах вращения объекта ( m ф. = -45°, фл- = arccos I = 35.26°, ф, = 0°,
геометрические преобразования 207 mx: т..: т, = 1:1:1 Рис. 2.46 лмеет симметрично ориентированные под углами уху~уу: = ух:= 120° проекции осей ОСК, а матрица проецирования и вектор источника согласно (2.71, б) и (2.72, б) равны А = пизо £ -£•] о if о- 4 4 • 0.707 -0.408 0 0 0.816 0 -0.707 -0.408 0 £изо=[1 1 1]. (2.75) 2.2.3. Косоугольные проекции Косоугольное проецирование отличается от ортогонального тем, что в нем для объемного видения объекта пучок параллельных проецирующих лучей не ортогонален КП. При этом сам объект и его ОСК остаются неподвижными. Соответственно, Skoc = S. Косоугольное проецирование — основной инструмент для построения тени объекта на плоскости и отражения объекта в плоском зеркале. Как показано на рис. 2.47, вектор направления на проецирующий пучок 5 = ря sy sz J составляет с нормалью к ФКП угол проецирования Xt такой, что tg(*f)= lsr + S, Параметрическая функция луча, проходящего через точку р = \х у z\ в направлении -S, естьр-St. Этот луч пересекает ФКП в точке р' = [х' у z'\. Из \ словия z' = z - s, tt = 0
208 Глава 2 получим параметр пересечения и и остальные координаты точки р' е f: Z , ix , °у tf = —, JC =JC——z, у =y——z. Рис. 2.47 В векторной форме p'=PKt косоугольное проецирование на ФКП описывается матрицей *г = 1 0 7 е* 0 1 -су о" 0 0 -sx _Sy > СХ ' су Sz Sz (2.76) Получим коэффициенты осевых искажений, проецируя косоугольно орты ОСК на ФКП: 1 0 0 0 1 0 0 0 1 *f = 1 0 -¾ 0 1 -Су 0 0 0 • тх = my=\,mz=^cl+cl= tg(Af ). (2. .77) Углы ориентации проекций осей ОСК на ФКП определяются условиями Г* = 90". tgfrJ—UL-i.. ^)=-^ = -^ (2.78) Окружности в плоскостях, параллельных КП, проецируются в окружности, т. е. без искажений (рис. 2.48). Это главное отличие и основное преимущество косоугольного проецирования перед аксонометрическим, позволяющее избежать построения эллипсов с произвольной ориентацией полуосей.
Геометрические преобразования 209 На рис. 2.48, я изображена косоугольная фронпшльная проекция сцены, состоящей из модельного куба с вписанными в его грани окружностями и осями ОСК. Рис. 2.48 Приведем по аналогии без вывода формулы расчета параметров косоугольных горизонтальной (рис. 2.48, б) Kh 1 О о - сх 0 - с О 0 1 с — —£- с = —— тх = т.= \, ту= д/с^ + cl = tg(Ah), У„ = 90°, tg(Y>2)=-¾ =_£* , tgfrJ=-£s-=-i*- (2.79, a) (2.79, ¢) (2.79,6) и профильной (рис. 2.48, в) проекций: К„ О -Cj, -сг О 1 О О 0 1 , Су , cz mv = mz = 1, тх=^сгу+с\ =tg(Xp) Y,.- = 90°, tg(Yz> -^ = -^-, tg(YJ=-^ = - cz sz ' cy Некоторые направления вектора S дают стандартные косоугольные проекции. (2.80, а) (2.80, б) (2.80, в)
210 Глава 2 □ Кабинетная проекция (косоугольная фронтальная диметрия), изображенная на рис. 2.48, а. образуется при s = \ [ 2V2]. Тогда по (2.76)—(2.78) определяем ее параметры: тх = ту = 1, т. = 0.5, уху = 90°, у,, = y,v =135°, lr = arctg(0.5)« 26.6°, сх=су= —j= = 0.354, SKa6 = [l 1 2л/2], К, каб о 1 2л/2 2л/2 1 0 0 0 1 0 -0.354 -0.354 0 (2.81) Данная проекция наиболее наглядна и проста в построении. Часто кабинетной проекцией ошибочно называют построенную на бумаге в клетку косоугольную проекцию с соотношением масштабов тх : ту : /я, = 2:2 близким к соотношению 2:2:1 кабинетной проекции. □ Кавапьерная или военная проекция (косоугольная фронтальная изометрия). изображенная на рис. 2.49, образуется при выборе S = [l 1 v2 J. Тогда по (2.76)—(2.78) определяем параметры проекции: тх = ту = т, - 1, уху = 90°, уу. = yZK - 135°, ?ir=arctg(l) = 45°, сх =С> =-^ = 0.707, SKaB = [l 1 л/2], "кав 1 1_ л/2" "Л 1 о о 0 1 о -0.707 -0.707 0 (2.82) Рис. 2.49
Геометрические преобразования 211 По сравнению с кабинетной проекцией лучи при кавальерном проецировании проходят более полого, под большим углом к КП. Из-за этого проекции объектов выглядят вытянутыми и несколько неестественными. В то же время каваль- ерная проекция удобна для измерения длин отрезков, параллельных осям координат. Геометрическая точность и способность отображать объем объясняют использование в старину кавальерных проекций в фортификационном деле. ^ Зенитная проекция (косоугольная горизонтальная изометрия) образуется при выборе направления проецирования Тогда по (2.74) находим ее параметры: т._ = 1, y,v = 90°, уху = 120°, уу: = 150°, тг ■ ш. Я 1ь = 45°, с. = 0.5, cv = — = 0.866, S„ у 2 = [l 2 4*\ *, о 0 0 0 0 S 2 1 I -0.5 0 0 -0.866 1 (2.83) Данная проекция представляет наклонный вид на объект сверху. В аэрофотосъемке используется зенитная диметрия — вид с высоты птичьего полета — с углом наблюдения Хь ~ 0° и соотношениями осевых масштабов и координат точки наблюдения 2 2 2 2 тх : ту: т. = 1 : ку : 1, sx +sy = kysy. Выбор коэффициента сжатия высоты ку - ctg(Xh) « 1 позволяет изображать на чертеже вытянутые вверх объекты — горы, небоскребы, башни и т. д. Если перед косоугольным проецированием выполнить вращения объекта, то получим косоугольную триметрию — наиболее общий вид параллельного проецирования, в котором осевые масштабы связаны условием, обобщающим (2.67): ml+ml+ml =2 + tg2(A). (2.84) 2.2.4. Центральные (перспективные) проекции При построении центральной проекции (ЦП) используются однородные координаты и эквивалентные векторы. Декартовы \х у z 1J и однородные j Ь с h] координаты расширенного вектора связаны соотношениями а Ь с ~h (2.85)
212 Глава 2 Назовем операцию (2.85) приведением однородного вектора к декартовой форме, в которой h — 1. Эквивалентность векторов [hx hy hz h\~ [х у z l\ означает, что они имеют равные соответствующие декартовы координаты. Задание масштаба И * 0 позволяет без арифметических операций изменить сраз\ все координаты в 1 / h раз. Возможны два способа работы с однородными векторами: □ все операции проводятся с векторами в декартовой форме, а полученные однородные векторы сразу переводятся по (2.85) в декартову форму; П операции проводятся с однородными векторами по специальным формулам. а перевод в декартову форму выполняется только на последнем этапе вывода изображения на экран дисплея. Основные операции с однородными векторами: П сложение и вычитание □ умножение вектора на скаляр El i Рг \pA+Plh2 h\hlk а £ 1 = ар j . h ~ h P — a \p h]„aP , =SP i - П скалярное произведение векторов □ векторное произведение векторов Рг \ _P\°Pi lPl°P2 h\h2^ P2 =£e^~^xp2 нъ2\ Рассмотрим методику получения центральной проекции точки р = [х у z] на фронтальную КП от точечного проектора с координатами S = [s \sx sy sz J (рис. 2.50). Через точку р проходит прямой луч, описываемый параметрической функцией S + (р - S)t Vf > 0. В отличие от параллельного проецирования, не все точки пространства имеют центральные проекции, а лишь те, которые вместе с КП лежат по одну сторонч от проектора, т. е. удовлетворяют условиям z < s. при s. > 0 или z > s. при s. < 0.
Геометрические преобразования 213 Рис. 2.50 Координаты р' = [х' у' 0J проекции точки р на ФКП находим из условия z' = О пересечения луча с плоскостью ху: sr 1 z' = 5, + (Z - S.)lt - 0 => ff - - / = Jj,+(y-5j,)/f = sz-z h h ' У-Cyz (2.86, a) (2.86, 6) h sx Sy 1 , , cx=—, cy=—, cf =—, h = ]-cfz. sz sz sz Получаем уравнения в однородных координатах Их' = х-cxz, Иу' —у— CyZ, hi' — 0,h— \-ctz (2.87) и эквивалентное декартово решение в координатной и векторной формах: 1 0 0 0 [х' у z' l]~ \hx' hy hz' h]=[x у z lj Р~РЦ(- 0 10 0 -cx -cy 0 -c{ 0 0 0 1 , (2.88) Uf Это и есть решение задачи центрального проецирования точки на фронтальную плоскость, получаемое за два этапа: 3 расширенный вектор координат точки умножается на матрицу Цг, 3 полученный однородный вектор преобразуется в декартову форму.
214 Глава 2 Между этапами следует выполнить проверку значения h. Условие существования центральной проекции tr>0 согласно (2.86, о) равносильно условию h > 0. Ем\ удовлетворяют точки/?i,/>2 ирз на рис. 2.50. При И < 0 центральной проекции точки на ФКП не существует. В частности, если луч S —»/м параллелен ФКП, то z = s.. h = 0, а проекция р'^ является вырожденной, т. е. удаленной в бесконечность: , x-sx , y~sy X = — -» °°, у = — -» °° . Л И Тем не менее конечная величина отношения У _У~*у задает на ФКП направление на точку р\. Наконец, если луч S -> р$ сразу после испускания удаляется от КП, то на первом этапе расчета центральной проекции получим И < 0 и /?5 —мнимую проекцию точки ps. Не трудно заметить сходство механизмов центрального проецирования и образования тени точки q на плоскости по формуле (1.144) (см. рис. 1.63): в обоих процессах прообраз q' может быть действительным (при И > 0 и t > 0), мнимым (при И < 0 и t4 < 0) или вырожденным (при h = 0 и v - 0). Есть и отличие: точка, расположенная относительно проектора за плоскостью проецирования, имеет действительную центральную проекцию, но не имеет действительной тени. Другими словами, плоскость проецирования является прозрачной (часто она вообще виртуальная, т. е. мысленно подразумевается, но в действительности не существует), а плоскость тени реальная и непрозрачная, иначе, выходящие из источника лучи, обтекая объект, не создавали бы на ней освещенность вокруг тени. При удалении проектора от ФКП в бесконечность центральная проекция объекта вырождается в параллельную. При этом, если: П проектор удаляется в ортогональном к картинной плоскости направлении, то KI < °°, \иу\ < °о, \s:\ -> со, с* = су = а = 0, а в (2.88) получим Цг= Of— матрицу ортогонального фронтального проецирования из (2.60); П проектор удаляется в неортогональном к КП направлении, то \s,\ -> оо, 0 * |сЛ.| < оо, 0 * \су\ < со, а= О, аЦ{= Кг— матрица косоугольного фронтального проецирования из (2.76). Важнейшее свойство центрального проецирования, давшее ему второе название, — перспективное (от лат. perspicio — ясно вижу) схождение проекций параллельных линий. Изучим это интересное явление, благодаря которому плоские изображения выглядят объемно и реалистично.
Геометрические преобразования 215 Центральной проекцией отрезка прямой линии, например, р\ р-, на рис. 2.50, также является отрезок p[pj на прямой пересечения ФКП с плоскостью, проходящей через три точки: S,pi и pi. Подставим уравнение прямой p(t) = ро + Vt в (2.88): Ш y(l) z(t) \}Ц< = = [x0 + Vxt-cx(z0+Vzt) y0 + Vyt-cy(z0 + Vzt) О l-c{(z0+Vzt)]~ x0-cxz0+{Vx-cxVz)t yo-cyz0+(vy-cyVz)t o ^ i-c{z0-CfVzt l-CfZ0-cfVzt = [x'(t) y'{t) 0 l]. В том, что полученные координаты проекции x'(t) и y'(t) описывают прямую линию, нетрудно убедиться, вычислив наклон этой линии: d/ _ dy'/dt _ ^-ctzoyy-(cy-ctz0)VZ Ax' dx'/dt (l - cf z0 Ух - (cx - c{ z0 )VZ {sz-zoyy-(?y-z0)vz (sz-zoyx-(sx-z0)yz ■ const Vf. Таким образом, прямая линия проецируется также в прямую линию, но с неравномерной шкалой: движение точки по прямой p(t) с постоянной скоростью Кдает неравномерное движение ее проекции p'(t). Убедимся также, что предельное положение (точка схода) проекции прямой линии ро + VI рс{ = lim p'(t) = V К —s, s,,:——sT О у <■ У ут ' = S-±V (2.89) не зависит от расположения точки ро, а определяется только координатами источника S и направляющего вектора V. Все параллельные прямые, не параллельные плоскости проецирования, имеют на перспективной проекции одну и ту же точку схода. Ее можно просто получить, проведя из точки S прямую S + Vt до пресечения с ФКП. Если эта прямая параллельна проективной плоскости, то точка схода отсутствует. Из сказанного следуют выводы: 3 центральные проекции пучка параллельных прямых сходятся в одну общую точку (2.89); 3 условие существования точки схода: V. Ф 0 — пучок параллельных прямых не должен быть параллелен плоскости проецирования; 3 если V. = 0, то точка схода вырождена, т. е. удалена в бесконечность, а проекции параллельных прямых, параллельных картинной плоскости, параллельны.
216 Глава 2 Аналогично (2.86)—(2.89) выводятся формулы для центрального проецирования на горизонтальную Цъ = РсЬ = "10 0 -сх 0 -cz 0 0 1 0 0 0 V sx—-s 0 х у У УУ и профильную КП: ■ ^Р = Рср = 0 -су ~сг 0 1 0 0 0 1 0 0 0 0 5,, Sr У у х * X 0 0 1 X Z , сх — , cz — , V, Sz у Sy У vy ~СР 0 0 1 51- — * > ''У » ^z ' 5д: ^х У, ~^sx V vx 1 ch=— sy 1 Cp=~ Лх (2.90) (2.91) Можно обойтись и одним фронтальным проецированием, поворачивая объект к проектору нужными гранями. Но если картинная поверхность состоит более чем из одной плоскости, то лучше использовать совместно разные виды перспективных проекций для уменьшения числа геометрических преобразований и времени расчета. Центральные проекции условно классифицируются (см. рис. 2.38) по числу точек схода изображения куба или параллелепипеда. Например, проекции каркасных кубов на рис. 2.51 имеют одну (а), две (б) и три (в) точки схода по числу пучков параллельных ребер, не параллельных плоскости ху. Второй объект получен вращением первого вокруг вертикальной оси. Третий объект — вращением второго вокруг оси, параллельной оси х. Условность классификации ЦП означает, что изображения других объектов могут вообще не иметь ни одной точки схода (например, тетраэдр) или более трех таких точек (октаэдр). Построение центральной проекции отрезка ab требует анализа четырех вариантов расположения его концевых точек а и b относительно плоскости проецирования и проектора в зависимости от значений параметров Иа и Л/,: П при {ha > 0}П \hb > О} отрезок а'Ь' есть действительная проекция отрезка ab; П при {ha < 0}П {/¾ ^ О} проекция отрезка отсутствует в силу мнимости (вырожденности) ЦП обоих его концов; □ в оставшихся двух вариантах проекцией является луч, начинающийся в точке действительной проекции и уходящий в бесконечность в направлении, проти-
Геометрические преобразования 217 воположном точке схода отрезка. Например, при {ha >0}f]{hb <о} и направляющем векторе V= b-a по (2.88) и (2.89) вычисляем точки а' ~ аЦ(, Ьс * V у V " z ' z по которым строим проекцию отрезка в виде луча а' ->2а' - Ьс. При {А0 < 0}f| {hb > О} получим проекцию-луч Ъ' -> W - ас, где Ь'~ЬЩ,ас = К у V Z ' Z lD Пример 2.6. Построить проекцию отрезка прямой ab на угол первого октанта, образованный пересечением координатных плоскостей ху и zy. Координаты проектора S = [2 1 4], концов отрезка а = [о 1 б] е zy и Ь = [з 2 о] е ху (рис. 2.52).
218 Глава 2 Решение. Рассчитаем по (2.88) и (2.91) матрицы центрального проецирования на фронтальную и профильную плоскости: щ Найдем однородные и декартовы координаты проекций концов отрезка на эти плоскости: 1 0 0.5 0 0 1 -0.25 0 0 0 0 0 0 0 -0.25 1 , #р = 0 0 0 0 -0.5 1 0 0 -2 0 1 0 -0.5 0 0 1 'а Г Ь 1 'а Г Ь 1 ЦГ = ^Р = 0 16 1 3 2 0 1 0 16 1" 3 2 0 1 Ц{ = ^Р = -3 -0.5 0 -0.5 3 2 0 1 0 16 1 0 0.5 -6 -0.5 6 10 1 3 2 0 1 0 16 1" 0 -1 12 1 a'f 1 b'( 1 "р 1 b'p 1 Рис. 2.52 Из четырех проекций только две а'„=а и b\=b являются действительными Проекции a'f и hi, — мнимые, лежащие на отрицательных продолжениях лучей S —> а и S —> Ь, что подтверждается значениями hj - -0.5 < 0 и hhp = -0.5 < 0.
Геометрические преобразования 219 Таким образом, мы имеем по одной точке проекции a'pezy и Ь\е.ху на горизонтальной и фронтальной картинных плоскостях. Полная проекция отрезка ab состоит из двух отрезков, для построения которых нужны еще две точки — по одной на каждой плоскости проецирования. Например, вычислив направляющий вектор V = b-a = [-3 -1 б] и по (2.89) и (2.91) точки схода Pcf 4 I О 3 Рср О I 8 3 (их можно построить графически, проведя через точку S прямую, параллельную ab, до пересечения с плоскостями f и р), получим параметрические уравнения лучей \p'r(t)=b'+(b[-pcf)tf=[3 2 0]+[-1 1/3 0]ff Vrf>0, [PpU) = ар + (*p -PcP>p = [О 1 6]+ [О 2/3 -2]tp V/p >0. (292) При tt = tv - 3 лучи пересекаются в точке с = [О 3 0] на оси у, обеспечивая переход проекции отрезка с одной проективной плоскости на другую. Используя мнимые проекции b'pezy и а\&ху, получим альтернативные (2.92) параметрические уравнения лучей p'f(t) = b'{+{b'(-a'f)tf=[3 2 0]+[-3 1 0j/fVff>0, Pp(t)=ap+(ap-b'p)tp=[0 1 6]+[0 2 -6]tpVtp>0, пересекающиеся при tt = tf = 1 в точке с = [0 3 о]. В итоге центральной проекцией отрезка ab является ломаная линия acb. Однако, если не проверять все точки проекций на мнимость, будет получена неверная ЦП, состоящая из двух отрезков abp и ba'(. СЗ Одним из видов центрального проецирования является так называемая "обратная перспектива". Построение изображений объемных тел в этом ракурсе широко применялось в византийской и унаследовавшей ее традиции древнерусской живописи. Ее яркими представителями являются знаменитая икона Андрея Рублева "Троица" XV в. (рис. 2.53, а) и миниатюра из Евангелия XVI в. (рис. 2.53, б). Визуально обратная перспектива отличается от прямой тем, что в ней из двух одинаковых фигур крупнее выглядит та, которая расположена от наблюдателя дальше, что придает изображению некоторую ирреальность, неестественную потусторонность. Рассмотрим геометрическую модель метода обратной перспективы и построение с помощью этой модели изображения объекта. Желаемый эффект достигается отделением активного процесса формирования проекции от пассивного процесса ее созерцания. В соответствии с названием метода разместим наблюдателя и проектор S по противоположные стороны от ФКП (рис. 2.54), а именно: ГЭ направление на дальнего наблюдателя зададим ортом z°;
220 Глава 2 П положение проектора S = [o О -F\ на фокусном расстоянии F от ФКП зададим так, что минимальная аппликата объекта zmm > -F, а объект целикоу располагался бы между наблюдателем и проектором. ,*•*■ П.. ..•" ;V'v :': ;■■-/■-* ^VV" -' . . .. • /•*■-. 1¾^¾ ■4F • pf»-.- -. у Рис. 2.53 Рис. 2.54 Таким образом, расчет обратной перспективы точки р = [х у z] выполняете? по формуле (2.88) с матрицей и координатами проекции "10 0 0 Ц( 0 10 0 0 0 0 F~] 0 0 0 1 Fx , Fy > х =——• У ~ F + : F + z (2.93)
Геометрические преобразования 221 На рис. 2.55 приведена рассчитанная по (2.93) обратная перспективная проекция сцены, состоящей из квадратного подиума и стола с квадратной крышкой, на которой лежит, немного свесившись вперед, книга в форме параллелепипеда. Рис. 2.55 2.2.5. Проективные алгоритмы сложных преобразований Проективные преобразования кроме своего непосредственного назначения — изображения сцены в желаемом ракурсе — могут применяться для быстрого построения: 3 различных фигур и изображений на плоских и криволинейных поверхностях; __1 сцен от первого лица, изображаемых с позиции подвижного наблюдателя; 3 простейших оптических эффектов — теней, отражений, преломлений. Основное преимущество проективных алгоритмов— возможность группового преобразования /почек по (2.9), т. е. параллельных вычислений по одним и тем же формулам для всего множества точек. Такой подход к организации вычислительного процесса составляет серьезную конкуренцию алгоритмам трассировки см. разд. 1.3), в которых проводятся индивидуальные лучи через каждую точку каждого объекта. Процесс трассировки более трудоемок по сравнению с группо- зым преобразованием и имеет преимущество лишь при малом числе точек и высокой сложности их преобразования. Для расчета групповых преобразований по (2.8) и (2.9) необходимо сформировать матрицу координат Q. Ее строками являются расширенные формы: __1 точек J), =[pj l] — центров объектов, концов отрезков прямых, вершин полигонов; __1 векторов Vj = [Vj о] — скоростей движений и направлений осей вращений; П нормалей Nt = [jV, о] к плоскостям граней полиэдров, теней и отражений.
222 Глава 2 При групповой организации координат всех объектов сцены в одной матрице общее преобразование сцены матрицей С выполняется за одно умножение: Q' = QC Если требуется выполнить индивидуальное преобразование /«-го объекта сцены матрицей О"1*, то можно объединить строки координат этого объекта в блок Q<'">, тогда Построение изображения Зё-объектов на плоском экране дисплея может быть выполнено двумя способами (рис. 2.56). П Двухэтапное преобразование координат точек: • из МСК в СК ФКП с помощью d — одной из проективных матриц 0( Af, К{ или Цс. Qf~QC„- (2.94, a) • из СК КП в ЭСК с помощью матрицы С-, из (2.26) или (2.27): Qi = QfC?. (2.94,6) Двухэтапный метод применяется при построении изображения сложной сцены, состоящей из множества объектов. Между первым и вторым этапами решаются задачи визуализации изображения: • отсечения графических элементов, не попавших на КП; • удаления невидимых элементов, заслоненных другими элементами; • освещенности видимых поверхностей; • расчета различных оптических эффектов — отражений, преломлений, теней. При использовании центрального проецирования после первого этапа выполняется приведение координат к декартовой форме. .Д./ .Sl V > 0 F , ^ »ис. 2.56 С 1~ф х, о~ - А ■; >'и * '■■ ~т=* ,:^У - \ П Преобразование координат точек из МСК сразу в ЭСК: <2э = Q( Cm, где Cm = С С. (2.95 (
Геометрические преобразования 223 Одноэтапный метод удобен для параллельного проецирования одиночных выпуклых объектов прямо на экран дисплея. Решение задачи отсечения выполняется быстрыми целочисленными алгоритмами в ЭСК. Совмещение ЭСК с МСК превращает двухэтапное преобразование (2.94) в одно- этапное (2.95). Если при этом ось z3 направлена к наблюдателю, то в левой ЭСК направления всех вращений будут обратными по сравнению с правой СК, что нужно учитывать при выборе параметров матриц вращений (2.21). При выводе элементов изображения на экран дисплея сразу после их расчета и при низком быстродействии ЭВМ наблюдается неприятный эффект "мерцания", при котором последовательность вывода замедлена и видна в реальном времени. Устранение мерцания и "дергания" изображения достигается методом двойной пуферизации [36], т. е. разделения массивов памяти, используемых для формирования изображения и вывода его на экран. Если используемый программой графический режим имеет хотя бы две страницы видеопамяти (буфера кадра), то одна из них выбирается пассивной видимой страницей, а другая— активной и невидимой. После построения всего изображения на активной странице по командам прикладной программы выполняется переключение страниц. В отсутствие второй видеостраницы в качестве буфера используется массив оперативной памяти размером с окно вывода, откуда данные блочно, т. е. быстро, копируются в видеопамять. Этот способ предпочтительнее, т. к. запись в ОЗУ выполняется быстрее, чем в видеопамять, но он требует от программиста создания собственной библиотеки растровых функций построения прямых, окружно- :тей, полигонов и решения задач заливки, отсечения, вывода текста, решаемых встроенными библиотечными функциями любого развитого языка программирования. 2.2.5.1. Проецирование пространственных линий на плоскость Применим проекционный подход к построению изображений графических объектов на различных поверхностях. Вначале рассмотрим некоторые методы проецирования пространственных линий на плоскость, в том числе и на плоскость •крана. Они могут быть полезны программисту, создающему библиотеку функций построения различных геометрических фигур. Общий подход к проецированию полностью детерминированной линии p(t) е R3 •t3 МСК на плоскость экрана заключается в расчете по (2.95) матрицы проецирования Ст, выборе значений параметра t„ вычислении узловых точек pt = p(l), их экранных проекций рЭ1 = p(tj )СПЭ и соединении каждой пары соседних точек этрезком прямой линии функцией //ие(/Ь(,/ъ.,-+|). Проецирование обладает полезным свойством: локальные участки кривой p(t), ча которых вектор V(t) ~ dp(t) I At составляет с нормалью к проективной плоскости малые углы, имеют на проекции pj(t) большую кривизну и сгущение узлов. Оптимальным является распределение узлов на кривой линии по следующему принципу: плотность точек pk пропорциональна кривизне самой кривой, а не ее
224 Глава 2 проекции. Для изображения отрезка прямой достаточно проекций всего двух его концевых точек. Проецирование пространственной окружности на плоскость эквивалентно аффинному сжатию плоской окружности в эллипс. Как показано на рис. 2.19, это преобразование автоматически сгущает удаленные от центра эллипса точки p3j, в то время как узлы pt распределены по окружности равномерно. Рассмотрим методы проецирования некоторых не полностью определенных линий. Начнем с построения правильной п-сегментной ломаной линии Р = {р* ...рпр„+]}, вписанной в дугу окружности, с параметрами: □ f = {ро, N) — плоскость окружности; □ ро — центр окружности; □ N— нормаль к плоскости окружности; □ Рх — первая вершина ломаной линии; □ 5 рад — угол раствора дуги окружности. Наиболее рациональный путь решения задачи состоит в построении образа ломаной линии Ро е ху путем н-кратного вращения орта х° вокруг оси z на угот у = а / я, преобразовании образа в заданное положение Р на плоскости f и, наконец, проецировании на картинную плоскость или экран (рис. 2.57). Рис. 2.57 Наличие трех элементов ро, р\ и ТУ, связанных с плоскостью f, позволяет построить матрицу Со преобразования из СК xyz в СК x'y'z' с помощью функции МАРЪ, определенной в (2.55). Зададим ее аргументы 01=Оз, K,=z°, Wi=x°, ог=ро, V2 = N, W2=p\-po
Геометрические преобразования 225 так, чтобы образ точкир\ был в х°,а коэффициент масштабирования по осям х и у был одинаковым и равным г = \р\ -ро|. Отметим, что если задать Vi = N, то коэффициент масштабирования в направлении оси у будет равен r\N\, а ломаная линия Р е f будет вписана в дугу эллипса, а не окружности. На основе сказанного составим функцию проецирования дуги правильной ломаной линии с матрицей проецирования Сп. ^У рго_агс(ръ, N, р\, а, п, Сп) ',R = R.{a I и); II матрица вращения на угол у С = ЛШ'Зрз.г0,*0, PQ,N,p^ - Ро/Сп ; // матрица проецирования р = х° , рэ = рС ; // образ первого узла и его проекция V/ = ], п II цикл построения сегментов ломаной линии {q = ръ, II запоминание проекции i-ro узла р = pR; II расчет образа (/ + 1)-го узла рэ = рС ; // проекция (/ + 1 )-го узла line(q, рэ); // проекция отрезка ломаной линии } Задание специальных значений аргументов функции рго_агс позволяет проецировать различные пространственные линии: 3 при а = 2тг получим проекцию правильного п-уголышка; 3 при достаточно большом значении п ломаная линия практически совпадает с дугой окружности. Например, выбор w = [l80a/7i] располагает узлы ломаной линии на дуге описанной окружности через один градус. Следуя рекомендациям, изложенным в комментариях к рис. 2.14, получим оптимальное значение п = a\i3rNz \N\ где г = \р\ -ро|, а ц, — вычисляемый по (2.27, б) масштабный коэффициент перехода из ОСК в ЭСК. Если все координаты и размеры элементов в МСК заданы в пикселах, то цэ = 1; 3 для проецирования окружности задаются a = 2л и большое число сторон аппроксимирующего окружность правильного полигона, например, п — 360 или его оптимальное значение 2nu,,WV, п= —. , - .
226 Глава 2 Проекция представляет собой вписанный в эллипс я-угольник, плотность расположения вершин которого пропорциональна кривизне эллипса, а минимальное расстояние между вершинами составляет один пиксел. В описанном методе положение окружности в пространстве задается центром р и точкой р\, лежащей в плоскости {ро, N} и определяющей радиус окружности г = |/7| -ро\. Часто исходными параметрами окружности могут бытьро, N и г. чтс делает ее построение неоднозначным, т. к. при этом остается неизвестной начальная точкар\. В условиях неполной определенности можно вычислить матрицу С преобразования из СК xyz в СК x'y'z' с помощью функции MAPI из (2.51) с аргументами о\ = Оз, К, =z°, т =ро, V2 =rN. Взяв теперь начало окружности образа в х°, получим точку J>\ =х°С0, лежашук: в плоскости {ро, N] на расстоянии г от точки ро. Реализуем все сказанное в виде функции проецирования окружности радиуса г. лежащей в плоскости {ро, N]. & pro_circle(r,po, N, Сп) {" = 2nii3rNz N II число вершин аппроксимирующего полигона R = /?г(2л / л); // матрица вращения на угол между вершинами С = МАР2\р^,2°, ро, rNpn; // матрица проецирования р = х° , рэ= рС ; // образ первой вершины и ее проекция V/ = 1,п II цикл построения сторон полигона {q = ръ\ II запоминание проекции i -ой вершины р = pR; II расчет образа (/' + 1)-ой вершины рэ = рС ; // проекция (/ + 1)-ой вершины line(q, рз); II проекция ребра полигона } С помощью функции pro_circle были построены изображения окружностей, вписанных в грани кубов, на рисунках данного раздела. & Пример 2.7. Построить в диметрической проекции изображение глобуса, состоящее из параллелей с шагом 30°, меридианов с шагом 45° и контура. Ради\с глобуса г, угол склонения вправо в плоскости ху равен фск = 23.5°.
Геометрические преобразования 227 Рис. 2.58 Решение. Желаемое склонение глобуса достигается вращением матрицей 0.917 -0.4 0" 0.4 0.917 0 . 0 0 1 Диметрические проекции пяти параллелей, имеющих общие векторы нормалей Л'п = y°RCK, различные радиусы и центры /•(се) = Acos(an), ри (an) = г sin (ап )у° RCK ;троятся функцией pro_ circle(r(a„ ), Pll(ап ) N„, АдимСэ ) Van е {0°, ±30°, ±60°}. Диметрические проекции четырех меридианов, имеющих отличающиеся друг от друга векторы нормалей N(aM)=[cos(aJ 0 sin(aM)]tfCK, общие нулевые центры и радиусы л, строятся функцией pro_circle(r,03,N(aM),AnlMC3) VaM е {0°,45о,90°, 135°}. Ортогональная фронтальная проекция контура глобуса создается большой окружностью в его сечении, перпендикулярном вектору S = [l 1 л/7 J из (2.74), и .троится функцией pro _ circle (г, О з, 5, Of Сэ J. □ Яск=Я2(-Фск)=
228 Глава 2 2.2.5.2. Стереографические проекции Во многих приложениях (компьютерные игры, тренажеры, авто- и авиасимуля- торы, управление манипуляторами и т. п.) важно создать восприятие глубины сцены, максимально близкое к реальной действительности. Проецирование на плоскость из единственного центра равносильно монокулярному зрению, которое дает неполное ощущение трехмерности окружающего мира. Оно, конечно, лучше параллельного проецирования, которое вообще не способно к передаче глубины из-за бесконечной удаленности наблюдателя. Система монокулярного зрения человека преобразует двухмерную картинку на близкой к сферической поверхности сетчатке глаза в объемную, используя следующие "подсказки" на подсознательном уровне [26]: □ геометрическая перспектива — схождение в одну точку параллельных прямых; □ воздушная перспектива— ослабление толщей атмосферы цветового контраста и разрешающей способности глаза; □ параяпакс движения— ближние к глазу объекты смещаются на плоскости проекции больше, чем дальние; □ относительный размер знакомых наблюдателю объектов; □ экранирование (перекрытие) дальних объектов ближними; □ фокусирующая аккомодация— зависимость напряжения фокусирующих мускулов глаза от расстояния до объекта. Система бинокулярного зрения обрабатывает дополнительную информацию: П угол сведения оптических осей глаз; □ несогласованность местоположения проекций объекта на двух сетчатках, используемая мозгом для оценивания расстояния до объекта. Программная имитация бинокулярного зрения состоит в разработке алгоритма построения стереографической проекции— двух центральных проекций на общую КП от двух разнесенных в пространстве проекторов (рис. 2.59). Пусть расстояние между глазами (оптическая база) равно 2D. Зрительная система фокусирует взгляд в некоторой точке — центре визуальной массы объекта или группы объектов, находящемся от наблюдателя на фокусном расстоянии F. Проведем через центр визуальной массы фронтальную плоскость проецирования ортогонально направлению взгляда. Глаза наблюдателя (проекторы) находятся в точках S„eB=[-D 0 F],Snp=[D О F] и фокусируются под углом сведения у = arctg Если D « F, то у * 0° и оба глаза видят объект практически одинаково. При сравнимых расстояниях D и F изображения, формируемые в сетчатке каждого глаза, отличаются друг от друга, чем и достигается эффект объемности при со-
Геометрические преобразования 229 единении мозгом двух картинок в одну. Наиболее комфортные для зрения условия и наилучший стереоэффект достигаются при tg(y)«0.1, откуда уя6° и Fa\0D. Например, при среднестатистической базе 2D = 70 мм получим F= 35 см — оптимальное гигиеническое расстояние для чтения, письма и точной ручной работы. Рис. 2.59 Стереоизображение состоит из двух центральных проекций объекта, рассчитанных отдельно для каждого глаза. Рассматривание стереопары производится с нулевым углом сведения глаз. Преобразования произвольной точки р в проекции левого и правого глаз состоят из операций вращения вокруг соответствующего глаза на углы флев = Y. фпр = -У и центрального проецирования на ФКП, описываемого по (2.88) матрицами ^<лев 1 0 Г) F 0 0 1 0 0 0 0 0 0 0 0 1 F 1 цпр = 1 D О 0 О 1 О о о о о о о 1 Таким образом, построение стереопары {рпев,рпр} точки р выполняется по следующим формулам: Рлев лев > рпр ~ pT(-S„p)Ry(-o)T(Snp)IJnp. (2.96) На рис. 2.60 построено стереоизображение трех четвертей глобуса радиуса R - 20 мм при фокусном расстоянии F - 300 мм и оптической базе 2D = 70 мм. Рассматривать стереопару рекомендуется с расстояния 30 см с непрозрачной перегородкой между глазами на линии, разделяющей пространства левого и правого изображений.
230 Глава 2 Рис. 2.60 Кроме пространственного существуют и другие методы разделения стереопар [5]: □ цветовое: изображение левого глаза строится, например, красным цветом, правого — зеленым, а для просмотра используются цветные очки. Вместо цветовых фильтров можно использовать поляризованные. Недостаток способа в том, что по сути дела можно формировать только простые каркасные изображения, но зато реализация метода проста и полностью использует пространственное разрешение дисплея; □ пространственно-временное: изображение для левого глаза строится в четных строках экрана, для правого — в нечетных, а для просмотра используются электронные или электромеханические очки, перекрывающие соответствующий глаз на время прорисовки четных или нечетных строк. Этот подход может быть реализован на дисплеях с чересстрочной разверткой, позволяв выводить быстро меняющиеся динамические цветные полутоновые изображения, но с уменьшением вдвое разрешения по вертикали; □ временные: для левого глаза используется одна страница видеопамяти, для правого — другая, а их переключение происходит с достаточно большой частотой кадровой развертки. Для перекрытия глаз также должны использоваться электронные или электромеханические очки. Пространственное разрешение по строкам здесь не теряется; □ наилучшие условия для восприятия стереоизображений созданы в системах виртуальной реальности, где в специальные очки или шлем вмонтирован бинокулярный монитор из двух мини-дисплеев. На них подаются картинки рассчитанные отдельно для каждого глаза. Программа с помощью механических, инфракрасных или электромагнитных датчиков отслеживает повороть головы и, возможно, глаз, что создает удивительный эффект "погружения в действительность" со стереоскопическим изображением и изменением сцены в реальном времени в зависимости от движений головы или глаз наблюдателя В перспективе создание систем с лазерной прорисовкой изображений непосредственно на сетчатке каждого глаза.
Геометрические преобразования 231 2.2.5.3. Картографические проекции К типичным, широко распространенным и общеизвестным представителям сложных проективных преобразований относятся картографические проекции, применяемые для составления плоских географических карт поверхности Земли. Последняя, являясь приближенно эллипсоидом вращения с соотношением экваториального радиуса к полярному 1.00336 : I [28], не может быть развернута на плоскость без складок и разрывов. В связи с этим фактом здесь уместно привести стихотворение известного картографа А. В. Гедымина: Изучая суть проекций, Карты вовсе не безгрешны Надо помнить положение: И в пределах разных норм С переходом сферы в плоскость Нарушают верность линий, Неизбежны искажения. Площадей, углов и форм. Искажения, возникающие на карте, являются расплатой за удобство, которое мы получаем при пользовании плоским изображением вместо глобуса. Характер искажений зависит от способа проецирования и от вида картографической сетки — системы меридианов и параллелей на карте, т. к. в нее, как в "прокрустово ложе", приходится вгонять изображения материков. В зависимости от неиска- жаемого параметра принято следующее деление карт [3]: 3 равноугольные — проекции Меркатора, сохраняющие угловые соотношения и конфигурацию фигур за счет искажения их площадей. В таких проекциях строятся навигационные карты, используемые в судовождении; 3 равновеликие— проекции Ламберта, сохраняющие соотношения площадей фигур в разных частях карты за счет искажений их конфигураций, особенно сильных на краях карты. Такие проекции применяются для создания политических карт, где важно показать правильное соотношение размеров различных стран; 3 равнопромежуточные — эквидистантные проекции с равными расстояниями между определенными линиями (параллелями или меридианами) картографической сетки во всех частях карты; 3 произвольные — проекции, которым свойственны в разной степени как угловые, так и площадные, и дистантные искажения. Типовыми операциями картографической съемки являются преобразования координат образа из системы координат земной поверхности в другую систему, описывающую прообраз на поверхности проецирования, и развертывание последней на плоскость. Считая Землю сферой радиуса г = 1, зададим сферические координаты точки на ее поверхности вектором р = [1 ер \|/J, в котором 3 ф° е [-180°, 180°] — долгота, отсчитываемая от Гринвичского меридиана; 3 vj/° е [-90°, 90°] — широта, отсчитываемая от параллели экватора. Радианное а и градусное а° измерения угла связаны соотношением с '«О а = а. 71
232 Глава 2 Системами координат проективной поверхности могут быть полярная, цилиндрическая или коническая. Механизм построения любой картографической проекции таков, что проектор и наблюдатель находятся по разные стороны от проективной поверхности. Такая проекция фактически является обратной перспективой (см. рис. 2.54), что хорошо заметно на некоторых видах карт. Важно отметить, что создание картографических проекций при неподвижном проекторе не всегда возможно. В этих случаях используются формулы прямого преобразования координат, которые аналитически выводятся в рамках проективного метода с подвижным проектором. Искажение какого-либо геометрического параметра образа характеризуется отношением к нему того же параметра прообраза на плоской карте. Примем в качестве образа прямоугольник на экваторе сферы с длинами сторон а по долготе и b по широте. Обозначим длины сторон фигуры прообраза а' и Ь'. Эта фигура будет близка к прямоугольнику лишь при достаточной малости значений а « I и Ъ « 1. Определим коэффициенты долготного mv, широтного mw, углового т^ и площадного т искажений: /% = lim о-»0( а ■"•=a(i)' «v tnA = , тш - пц пц. (2.97) т. ) "^"К" J '"Ф На равноугольных и равновеликих картах будет, соответственно, т^ - I итш= 1. Для визуального оценивания искажений построенные ниже карты содержат проекции черных квадратов, размещенных в разных местах поверхности сферы. При аналитическом выводе коэффициентов искажений в различных картографических проекциях (для этого автор использовал возможности символического процессора MathCAD) благодаря малости длин отрезков а и b можно считать, что на широте \\i они имеют измерения a sec(vjy) по долготе и b по широте. В зависимости от формы и положения проективной поверхности наиболее распространены следующие виды картографических проекций. Азимутальные проекции При построении азимутальной проекции проецирование точки сферь р = [l ф щ выполняется на /носкость, касающуюся сферы в некоторой точке />0=|l Фо Vol (рис 2.61). Для превращения этой плоскости во фронтальную расположим начало системы координат x'y'z' в ро, а ее ось у' направим по касательной к меридиану фо, который на карте будет расположен вертикально. Такое сложное преобразование системы координат описывается матрицей Са = ^-фоШ¥оН-г0)-
геометрические преобразования 233 Рис. 2.61 Расположив проектор в точке [О О -F] на оси z', проходящей через центр сфе- эы — точку [о 0 -l], получим матрицу проецирования (2.93) "10 0 0 " 0 10 0 1 0 0 0 F ' 0 0 0 1 Тогда с учетом взаимосвязи (1.3, б) сферических и декартовых координат получим азимутальную проекцию точки: P-W У 0 l]~[sin(cp)cos(\|/) sin(\|/) cos(cp)cos(\|/) l]caZ/f. (2.98) Задавая различные фокусные расстояния, получают следующие разновидности азимутальной проекции: 3 при F= 1 (проектор в центре сферы) строится гномоническая проекция, для которой характерно разрежение линий сетки при удалении от центра карты. При выборе F> 1 становится возможным построение карты целого полушария; 3 проекция, соответствующая F=2, называется стереографической. Проектор располагается в диаметрально противоположной точке -ро; 3 проекция, построенная при фокусном расстоянии F>2, называется внешней, т. к. проектор находится вне сферы; 3 при F—> оо азимутальная проекция вырождается в ортографическую, при этом проецирующие лучи параллельны, а линии сетки сгущаются от центра карты к ее периферии. При всех значениях фокусного расстояния искажения отсутствуют в точке каса- -ия плоскости со сферой.
234 Глава 2 Варьируя расположение плоскости проецирования, получают следующие азимутальные картографические проекции: П полярную: плоскость касается сферы в полюсах при vyo = ±90°. Сетка полярной карты состоит из концентрических окружностей параллелей и радиальных прямых меридианов. Коэффициенты долготных и широтных искажений, вычисленные по (2.97) при уо = 90°, равны F _(F-l)sin(\j/)+1 F "o'F-l+MvY mXV = (F-\+snM? <2"> Полярную проекцию точки р = [l ф у] удобнее описывать не декартовым (2.98), а полярным вектором [р ф-ф0] с модулем р и коэффициентом широтного искажения mv: F-l+sin(y) дц/ Например, при F= 1 получим параметры гномонической проекции р = ctg(i|/), ПЦ - sin-'(^), mv = sin^(y), /nz = sin'(Ч1)."», ~ s'n ЧчО. искажающей как углы, так и площади. Аналогичны свойства и ортогрофиче- скон проекции с параметрами р = cos(vjy), mv = 1, mv = тг = тш = sin (у). На рис. 2.62, а в этой проекции построена карта северного полушария. Таким образом, с точки зрения искажений гномоническая и ортографическая проекции являются произвольными. Уравнивая в (2.99) коэффициенты mv и /hv, получим способ построения азимутальной равноугольной карты Меркатора как стереографической (npi F=2) проекции с параметрами 2cos(\j/) 2 , 4 l + sin(v) v v l + sin(v) (l + sin(\j/))2 На этой карте, как видно из рис. 2.62, б, сохраняются пропорции фигур в разных ее частях при увеличении площади в четыре раза на краю по сравнению с центром. Равнопромежуточная полярная проекция с линейным модулем р = п 12 - v. имеет постоянный шаг параллелей и коэффициенты искажений л/2-\|/ cos(\j/) v cos(\j/) 71/2-V
Геометрические преобразования 235 F(V)= 71-2 , 3 Уф е [0. л / 2]. Она реализуется при переменном фокусном расстоянии t_(7V2-y)(l-sin(y)) 7t/2 - \j/ - cos(y) Оптимальное по среднеквадратичному критерию л/2 j (р(ч/, Л1')— (л/2 — v^dxj/ —> min 0 F постоянное расстояние проектора от плоскости, дающее наиболее равномерную сетку параллелей, составляет F« 2.8. Практичный метод построения равнопромежуточных карт заключается в распрямлении каждого меридиана на плоскость проецирования, что как раз и описывается формулой p(v)=y~v- Равномерный масштаб позволяет изобразить всю поверхность земного шара внутри одной окружности, что и реализовано (без Антарктиды) в эмблеме Организации Объединенных Наций (рис. 2.62, в). На внешних краях такая карта имеет максимальные искажения; гаЙ^О 1 » J-iU-l-l-ч ^•^Ш -гЖа\ 4-£ь^Л/~~7 Рис. 2.62 П экваториальную: плоскость параллельна оси вращения сферы и касается параллели цю = 0° в точке с долготой фо. Соответствующий меридиан фо расположен на карте вертикально в центре. Дуги остальных меридианов сходятся на полюсах. Линия экватора на карте горизонтальна; параллели изображены
236 Глава 2 дугами, кривизна которых уменьшается при удалении центра проецирования. В экваториальной стереографической (она является равноугольной) или внешней проекциях обычно строятся карты полушарий Земли, например, восточного при фо = 90е, цю - 0° и F- 2 (рис. 2.62, г). В этом ракурсе хорошо проявляются свойства обратной перспективы; □ косую: плоскость занимает произвольное касательное к сфере положение, а алгоритм проецирования дан в (2.98). Применяется, во-первых, для изображения земного шара в наклонном положении, в котором кривые линии параллелей и меридианов наглядно подчеркивают его объемность (рис. 2.62, д). Во-вторых, косая азимутальная проекция дает малые искажения карты локальной области земной поверхности, для чего параметрам сро и \\ю задаются значения координат географического центра этой области. Например, на рис. 2.62, е построена гномоническая карта Гренландии и ее окрестностей с центральной точкой фо = -40е и vj/o = 70е. Для изображения диагонально протяженной области можно изменить в (2.98) матрицу преобразования на Са = Ry (- ФО fix (V0 % (ЧУ{- z° ) с углом у между диагональю области и параллелью. Цилиндрическая проекция При построении цилиндрической или панорамной проекции точка сферы проецируется на боковую поверхность охватывающего сферу цилиндра, после чего тот развертывается на плоскость. В зависимости от положения оси цилиндра относительно оси вращения сферы цилиндрические проекции делятся на продольные (все параллели горизонтальны, а меридианы вертикальны и равно отстоят друг от друга), поперечные и косые. На линии касания цилиндра со сферой искажения отсутствуют, а при удалении от нее увеличиваются. Горизонтальные искажения присущи всем цилиндрическим проекциям, а вертикальные зависят от способа образования проекции. Получим алгоритм проецирования точки р = [l Ф у J на поверхность продольного цилиндра, касающегося сферы по экватору. Без внесения дополнительных широтных искажений эту криволинейную поверхность можно заменить вертикальной плоскостью х'у', касающейся цилиндра по меридиану ф (рис. 2.63). Такое преобразование системы координат описывается матрицей Cu(<p)=^(-<p)r(-z0). Разместив проектор в точке [0 0 -F] на оси z', рассчитаем по (2.93) матрицу Ц(. Развертывание боковой поверхности цилиндра эквивалентно переносу проекции на расстояние ф вдоль оси х'. Таким образом, проекция точки р = [l ф щ на развертке цилиндра вычисляется следующим образом: q'~ [sin(cp)cos(t|/) sin (у) cos^)cos(y) 1]Сц(ф)//г, (2.100) p' = q" + q>x° =|<р h 0j.
Геометрические преобразования 237 Рис. 2.63 Аналитическое выражение для ординаты проекции F-l+cos(v) (2.101) позволяет исследовать влияние фокусного расстояния F на искажения цилиндрических карт. Коэффициенты долготных и широтных искажений, вычисленные по (2.97), равны „ - ' m _(^-0cos(V)+lr_8/,(V,F) ф cos(v)' V (F-l + cos(v))2 9v При F= 1 (проектор в центре сферы) получим зависимость Л(1|/) = tg(v|/) с коэффициентами искажений wzv = cos-2(vjy), wzz = cos-l(v|y), mm = cos~3(\j/). Эта проекция, сильно искажающая на высоких широтах как углы, так и площади, является произвольной. Уравнивая в (2.101) коэффициенты mv и шч„ получим дифференциальное уравнение dbfo,F)_ 1 Э\|/ cos(y) Его решение A(i|/) = ln|sec(v|/) + tg(v)| = X(v|/)
238 Глава 2 есть лямбда-функция [13] широты ц/. Равноугольная цилиндрическая проекция Меркатора (рис. 2.64, а) с коэффициентами искажений mz = 1, тш = cos-2(vjy) проективно строится при переменном фокусе F((pb%)(l-cos(cp))e(l 15]у¥е[0я/2) Л(ф)-Б1П(ф) Оптимальное по среднеквадратичному критерию л/2 J" (Л(\|/,^)-Л(\|/))2с1\|/-^тт о F постоянное значение фокусного расстояния, дающее наименьшие угловые искажения, равно f* 1.275. Изображение полюсов в проекции Меркатора невозможно, а приполярные области имеют большие искажения площадей. При F-> оо все проецирующие лучи горизонтальны, /г(у) = sin(vjy), а коэффициенты искажений равны тч - cos(vy), mz = cos2(y), тя = 1. Таким образом, это равноппощадная цилиндрическая проекция Ламберта (рис. 2.64, б). На ней параллели сгущаются от экватора к полюсам. Наконец, равнопромежупючная цилиндрическая проекция (рис. 2.64, в) получается при использовании линейной формулы Нч>) = V с коэффициентами искажений 1Щ = 1, /Hz = cos(vjy), 1Щ - тщ = cos '(чО- Реализующий эти свойства проектор имеет переменное фокусное расстояние я F(v)=V(l-cos(V))e y-sin(y) 71-2 , 3 VV е [0, л / 2]. Оптимальное по среднеквадратичному критерию л/2 [ (h(w,F) -1(/) 2dij/—>min /г О постоянное значение фокуса, дающее наиболее равномерную сетку параллелей, равно F« 2.8.
Геометрические преобразования 239 Рис. 2.64 Коническая проекция При построении конической проекции точка сферы р = [\ Ф УI проецируется на боковую поверхность надетого на сферу конуса, после чего тот развертывается на плоскость. Сетку конической карты составляют концентрические дуги параллелей и радиальные прямые меридианов. Для уменьшения радиальных (широтных) искажений проективный конус должен касаться сферы по средней параллели картографируемой области цю * 0 (при фо = 0 конус становится цилиндром, и для построения карты должен использоваться алгоритм (2.100)). На этой параллели карты искажения отсутствуют, а при удалении от нее увеличиваются. Угол между меридианами ф| и фг на конической развертке равен |ф1 - фг| sin(vj;o). Измерив его, можно определить параллель фо, на которой объекты изображены без искажений. Для удобства пользования картой задается средний меридиан фо, который на развертке должен быть вертикальным. Коническая проекция применяется для изображения протяженных по долготе областей средних широт 20е < |ф°| < 70е (Россия, США, Канада), хотя и способна отобразить на одной карте объекты в разных полушариях. Получим алгоритм проецирования точки р = [l ф ф | на поверхность конуса, касающегося сферы по параллели фо. Без внесения дополнительных широтных искажений эту криволинейную поверхность можно заменить вертикальной плоскостью х'у', касающейся конуса по меридиану ф (рис. 2.65). Матрица такого преобразования системы координат равна
240 Глава 2 Рис. 2.65 Разместив проектор в точке [О О -F] на оси z', рассчитаем по (2.93) матрицу Ц{. Развертывание поверхности конуса эквивалентно переносу системы координат в его вершину на вектор v = ctg(v0)yo и вращению проекции вокруг оси z' на угол у = (ф— фо) sin(\)/o). Таким образом, проекция точки сферы р = [l ф у] на развертке конуса вычисляется по следующим формулам: q' ~ [sin^)cos(\y) sin(\y) cos^)cos(\|/) l]cK(<p)L(f , (2.102) p=q'T(-v)Rz(y). Ее положение можно описать также полярным вектором \р у] с модулем F-l + cos^-Vo) и используемым в (2.102) углом у = (ф-фо)з1п(^о), отсчитываемым от вертикальной проекции меридиана фо. Исследуем влияние фокусного расстояния F на искажения углов и площадей. Коэффициенты долготных и широтных искажений, вычисленные по (2.97), равны p(\i/,\i/0,F)sin(\i/0) _ (F-l)cos(v-Vo)+l _ -Эр(р/,у0, F) W<p cos(v) ' V (f-1 + cos(v-Vo))2 Э\|/ (2.103)
Геометрические преобразования 241 При F= 1 (проектор в центре сферы) получим зависимость р(у) = ctg(i|/o) - tg(V|/ - V|/o) и коэффициенты искажений wz и даи, сильно отличающиеся от единицы на широтах, далеких от ц>о. Следовательно, эта проекция является произвольной. Уравнивая в (2.103) коэффициенты т9 и тч, получим дифференциальное уравнение Эр(у,у0, F)_ -p(\|/,Vq, F)sin(\j/0) Э\|/ cos(vjf) с начальным условием р(^о, щ, F) - ctg(vj;o), решение которого есть ^ sec(y)+tg(v) ) Равноугольная коническая проекция Меркатора (рис. 2.66, а) с коэффициентами искажений mz = 1, тш = г2(ц>, щ) sin2(vj;o) cos"2(ij;) проективно строится при переменном фокусном расстоянии F(vv )_ (ctg(v0 )-r(v, Щ)) (l - cos(y - щ)) ° ctg(v0)-r(v,Vo)-sin(v-Vo) Приравнивая в (2.103) произведение коэффициентов /«„, и mv к единице, получим дифференциальное уравнение Э\|/ sin(v0) с начальным условием р(уо, щ, F) = ctg(yo), решение которого есть р = ^2 + ctg2 (v0)- 2sin ' (v0)sin(ф) = /(\|/, \j/0). Равноплощадная коническая проекция Ламберта (рис. 2.66, 6) проективно строится при переменном фокусном расстоянии F/vv \_ (ctg(Vo)-/(v,Vo)) (l-cos(y-vo)) 0 ctg(v0)-/(v»Vo)-sin(v-Vo) Наконец, равнопромежуточная коническая проекция с постоянным шагом параллелей (рис. 2.66, в) имеет коэффициенты искажений _ , cosjv) _1 cos(vo)-(V-Vo)smWo) и строится либо по формуле P(V|/) = Ctg(V|70) - (V|/ - V|/o),
242 Глава 2 либо проективным методом при переменном фокусном расстоянии v. (ctg(y0) - (У ~ Vo ))(1 ~ cos(y)) ctg(y0)-(v-Vo)-sin(v) F(y) = h—J*/" tubffjB Рис. 2.66 2.2.5 А. Построение сцены с подвижным наблюдателем Далее рассмотрим методы построения сцены с подвижным наблюдателем, перемещающимся в трехмерном пространстве по некоторой траектории. Это типовая задача, решаемая при разработке компьютерных игр, в которых объекты сцены изображаются в перспективной проекции так, как их видит перемещающийся в пространстве наблюдатель. Положение объектов в MCK xyi описывается множеством точек р/, векторов Vt и Nh расширенные формы которых р,, Vi и Л', составляют строки матрицы координат Q. Объекты могут быть как неподвижными относительно МСК (здания, рельеф местности, интерьер комнаты и др.). так и подвижными (герои игры, средства их передвижения, деревья, окна, двери, лифты зданий и др.). Для того чтобы составить модель сцены, представим, что перед глазами наблюдателя на фокусном расстоянии F находится прямоугольная рамка, через которую он рассматривает окружающий мир (рис. 2.67). Соотношения длин горизонтальной, вертикальной сторон рамки и фокусного расстояния g: v: F определяют горизонтальный ос и вертикальный Р углы обзора: a = 2tg g 2F P = 2tg v 2F
Геометрические преобразования 243 Рис. 2.67 Среднестатистический глаз человека имеет углы обзора ос » 150° и Р » 110е [17]. Отсюда следует оптимальная пропорция параметров рамки g:v:F«7.5:3: 1, при которой видимая область сцены заполняет всю рамку. Зададим положение рамки траекторией движения ее центра s(t), вектором нормали к плоскости Z(t), направленным к наблюдателю, и вектором Y(t) _l_ Z(i) ориентации вертикальной (относительно наблюдателя) стороны. В центре рамки разместим начало подвижной системы координат наблюдателя (СКН) хн ун zH с ортами М)=Г®. <{t)=z(t), x°(thy°(t)xz°(t). (2-104) С помощью матрицы (2.55) преобразования из МСК в СКН Н(()=ШРз1$),ЩЩо3,у0,г0) (2-105) вычисляются координаты элементов сцены в СКН: Q40 = Q(t)H(t)- (2.106) При выбранном расположении СКН наблюдатель находится на оси zH в точке S{t)=s{t)+FZ{t),
244 Глава 2 имеющей в СКН постоянные координаты SH = [о 0 f], что упрощает уравнения (2.86) центрального проецирования точки [xH(t) yH{t) zH(/)]: Проекция точки действительна при zH < F, в противном случае точка находится сзади наблюдателя и через рамку не видна. Кроме того, невидимыми для наблюдателя являются точки с zH < F. Их действительные проекции отсечены прямоугольником рамки, т. е. не удовлетворяют условиям видимости {-^Мф{-^Щ\ ,2.,08) Рассмотрим подробнее особенности формирования в реальном времени параметров положения рамки в пространстве. При разработке программы, отображающей сцену глазами подвижного наблюдателя, определенным командам, подаваемым с клавиатуры или мышью, назначаются соответствующие движения наблюдателя и связанной с ним рамки. Возможна, например, следующая система клавишных команд управления: П <Т> или <-1> — смещение вдоль оси zH на расстояние -d, (вперед) или d. (назад); П <Shift>+<T> или <Shift>+<i> — смещение вдоль оси уИ на расстояние dy (вверх) или -dy (вниз); П <Shift>+«—> или <Shift>+<—» — смещение вдоль оси хн на расстояние -dx (влево) или dx (вправо); П <<—> или <—» — поворот вокруг оси ун на угол ф^. (влево) или -ц>}. (вправо); П <Ctrl>+<T> или <Ctrl>+<!> — поворот вокруг оси хн на угол -tpv (наклон вперед) или <рд (наклон назад); П <Ctrl>+<<-> или <Ctrl>+<->> — поворот вокруг оси zH на угол <р. (наклон влево) или -ф. (наклон вправо); П отсутствие команды означает остановку в текущем положении. Для большего правдоподобия оси вращений виртуальной рамки должны проходить не через ее центр, а через точку S(t) расположения действительных глаз наблюдателя. Оси вращений при этом параллельны осям Хн, у» и zH. В самом общем виде движение рамки описывается в СКН матрицей преобразования С„ = гИн^^Фх^^Д (^ФгЖИ^х ±dy ±d^) (2109) с соответствующими каждой команде значениями и знаками углов вращений и координатных смещений. Во избежание бесполезных умножений на единичные матрицы можно каждой конкретной команде сопоставить более простую, чем (2.109), матрицу АП. Например, в приведенной выше системе команд клавише
Геометрические преобразования 245 <Т> соответствует матрица Сн = 7д-с/,2°], а поворот влево по команде <<—> отрабатывается с помощью матрицы Сн = г(- Би )Ry \(ру )^(5^). Важная проблема при разработке программ с подвижными элементами — обнаружение и отработка столкновений наблюдателя с объектами сцены и объектов друг с другом. Столкновение наблюдателя с каким-либо объектом можно обнаружить, например, тестами ориентации (1.122) и (1.123) точки S(t) внутри этого объекта. Столкновение объектов обнаруживается по расположению любой вершины одного объекта внутри другого (рис. 2.68, а) либо по пересечению любого ребра одного объекта с любой гранью другого (рис. 2.68, б). Рис. 2.68 Поведение наблюдателя и объектов при столкновении определяется их подвижностью и упругими свойствами. Например, при столкновении с неподвижной стеной наблюдатель должен остановиться либо упруго от нее отскочить. Остановка означает отмену команды управления, приведшей к столкновению. Упругий отскок, удовлетворяющий законам отражения (см. рис. 1.56), требует расчета соответствующей команды. Аналогично отрабатываются столкновения объектов друг с другом. Ниже приводятся алгоритмы с остановкой при столкновении наблюдателя с объектами сцены. Пусть 3 tk, А: = 0, 1,2,... — вырабатываемые по сигналам таймера ЭВМ моменты опроса устройств — источников команд управления; "3 so, Zo и Yo— параметры начального положения рамки и вычисляемая по (2.105) матрица пересчета начальных координат из МСК в СКН; 3 H0=MAP3^Q,Yo,Zo,03,y°,z0); "3 Qo — матрица начальных координат элементов сцены. Циклический алгоритм расчета перспективного изображения динамической сцены в зависимости от команд управления можно реализовать объективным и субъективным методами, отличающимися тем, какая система координат принимается неподвижной (см. рис. 2.67). В обоих методах на k-ом шаге движения вычисляются матрицы Сык и С^т> Vm = l,A/ собственных движений рамки в СКН и М объектов в МСК (у неподвижных элементов сцены матрицы движе-
246 Глава 2 ний единичные). Матрицы Нк и Hk+i на соседних шагах моделирования связаны соотношением В объективно неподвижной МСК xyz движения наблюдателя и объектов рассчитываются независимо друг от друга. Проецирование выполняется на подвижную картинную плоскость, поэтому для визуализации сцены (отсечения проекций объектов контуром рамки, удаления невидимых элементов, закрашивания видимых поверхностей) требуется преобразование координат всех объектов из МСК в СКН. На А>ом шаге алгоритма моделирования вычисляются: П по (2.106) матрица координат объектов в СКН Quk = Qk Нк, центральные проекции объектов и визуализация сцены на экране дисплея; П по (2.109) матрица Сщ и матрица движения наблюдателя в МСК Ck=HkClikHk-{; (2.П0) П прогноз параметров рамки и наблюдателя на (к + 1 )-ом шаге: ty+i =^Q. zk+\ =zkck> (2.111) sk+i =sk+\ +FZk+\, Hk+l = HkCuk ; П прогноз координат объектов сцены на (к + 1)-ом шаге: вы = Qk'^Ci"» Vm = IM; (2.112) П если точка S/t+i принадлежит хотя бы одному из т е [I, М] объектов, то выполняется остановка: «+, = «-, Zk+l = Zk, fifif = Qtm>, Я/м = Нк (2.113) Субъективно (с точки зрения наблюдателя) полагая неподвижной СКН Хи ун zn. мы должны перед циклом моделирования пересчитать начальные координаты всех объектов сцены из МСК в СКН по формуле группового преобразования QhO = Go Щ. Движение объекта в СКН есть суперпозиция двух движений: собственного и относительного, обратного движению рамки. Проецирование сцены выполняется на неподвижную фронтальную плоскость рамки. На к-ои шаге алгоритма моделирования вычисляются: □ центральные проекции объектов и визуализация сцены на экране дисплея; П по (2.109) матрица Снк и матрицы собственных движений объектов в СКН: C^>=HkiCk<m>Hk Ут=Щ; (2.114)
'еометрические преобразования 247 D прогноз координат объектов сцены на (k + 1)-ом шаге: Qu%\ = Q^C^C-l Ут = 1М,Нк+1= HkC~l; (2.115) 3 если точка SH = [о О F\ принадлежит хотя бы одному из m е [1, М\ объектов с координатами <2нТ+1 >то выполняется остановка: G^\=QT^kn = Hk. (2.П6) Гравнительный анализ двух методов построения сцены с подвижным наблюдателем свидетельствует о несколько меньшей трудоемкости субъективного подхо- vj, в котором все расчеты ведутся в системе координат, жестко связанной с наблюдателем. С учетом направленности ее оси zH навстречу наблюдателю и выраженности всех координат сцены относительно картинной плоскости субъективный метод идеален для реализации алгоритмов визуализации как на программном, так и на аппаратном уровнях. 2.2.5.5. Проективные алгоритмы построения оптических эффектов Переходим, наконец, к изучению проективных алгоритмов построения оптических эффектов — тени объекта на плоскости, отражения от зеркальной плоско- гтн и преломления на плоской границе раздела двух сред. В разд. 1.3.5 эти задачи решались методом трассировки путем поиска точек пересечения множества световых лучей с поверхностью проецирования. Это универсальный способ по- проения эффектов на произвольной криволинейной поверхности. Для каждого л\ ча задача пересечения решается индивидуально, что требует больших машинных ресурсов и не позволяет применять групповые методы преобразований, т. к. при неплоской поверхности отсутствует единая для всех точек объекта матрица проецирования. Роль проекторов в моделировании оптических эффектов играют две точки: 3 L — источник прямых лучей, создающих тень; 1 S— позиция наблюдателя, выступающего в роли приемника прямых и источника обратных лучей. Особенности дальнего и ближнего расположения этих элементов сцены относительно объекта и плоскости проецирования эффекта обсуждаются в комментариях к рис. 1.61, 1.62. На рис. 2.69 построена схема вычисления оптических эффектов на плоскости f = {ро, N} от исходной точки q в МСК до экранного изображения ее оптического эффекта <7э в ЭСК. Данная схема является развитием двухэтапного процесса, изображенного на рис. 2.56, и использует три самостоятельные СК со своими матрицами преобразований.
248 Глава 2 Рис. 2.69 П Система координат плоскости f— в ней формируется оптический эффект. Для перехода из МСК в СК f требуется вычислить матрицу CK=MAP2(p0,N,O3,z°), делающую плоскость построения эффекта фронтальной. В базисе СК f расширенные формы точки qt, вектора Vf, источника Lr и наблюдателя Sf находятся следующим образом: • iff = яСк, ближние Lf = LCK и S{ = SCK ; • V{ = VCK, дальние L{ = LCK n5f= SCK. Координаты векторов Lt (при построении тени) или 5f (при построении отражения или преломления) определяют параметры матриц Kt косоугольного (2.76) или Z/f центрального (2.88) проецирования на фронтальную плоскость f. что дает проекцию эффекта q'f =qfKt или Щ ~ qflj{ . Дополнительным шагом вычисления эффекта отражения является ортогональное отражение с матрицей Mf =diag[l 1 -l], после чего находится проекция <7f = q~{K{ или q'f ~ qfUf Вычисление проекций эффектов всех точек объекта позволяет определить необходимые габариты плоскости f или, при заданных габаритах f, отсечь не попавшие на нее элементы алгоритмами clip2_cross (см. рис. 1.18) или clipljtest (см. рис. 1.19).
'еометрические преобразования 249 После каждой операции центрального проецирования точки q\ ~ ц(Щ или ее отражения q\ ~qf \MfL!f ) проверяется условие fit > О существования действительной проекции q'f. При выполнении этого условия она приводится по (2.85) в декартову форму. Индикатор правильности вычисления проекции в базисе СК f — значение z\ = 0. Проекцию эффекта в СК f можно получить сразу из образа в МСК как q'f ~ qCf с помощью матрицы Ct, вычисляемой в зависимости от вида эффекта и типа проецирования как Q =СКК{ либо С(=СкЦг для нахождения тени и преломления или Ct = Ск (М{ К{ ) либо Q = Ск (мг Ц{ ) при расчете отражения. D Мировая СК, переход в которую из СК f осуществляется с помощью матрицы С"1. Возможно получение эффекта в МСК сразу из образа в МСК как q" ~ qCM с помощью матрицы См = С{СК . 3 Экранная СК, переход в которую из МСК дает окончательное изображение оптического эффекта q"3 ~ q'Cm и выполняется с помощью матрицы Cm из (2.95). Без учета преобразования из СК картинной плоскости в ЭСК можно считать, что Cm — одна из проективных матриц Ot, Af, Kt или Ц{, зависящих от положения наблюдателя S. Эффект объекта должен выводиться на экран раньше самого объекта q3 ~ qCm для недопущения экранирования объекта его эффектом. Если требуется изобразить на плоскости f какую-либо текстуру, сетку или просто гладкую окраску, то ее точки pt легко проецируются на экран преобразованием Л~МСк1спэ)- Поверхность построения эффекта должна выводиться на экран раньше самого эффекта для недопущения экранирования эффекта и объекта поверхностью. Теоретически возможно построение эффекта на экране сразу из образа в МСК по формуле ч'з ~Я\смСт)> т. е. за одно матричное умножение. В этом простом и чрезвычайно эффективном методе таится возможность расчетной ошибки в том случае, когда обе матрицы См и Cm содержат центральное проецирование, а нелинейная операция приведения
250 Глава 2 расширенного вектора к декартовой форме выполняется только один раз. Например, в задаче построения тени при ближних источнике и наблюдателе имеем См = СКЦ^СК , Спэ = Z/кп f. Аналогичный случай имеет место и при расчете отражения с ближним наблюдателем, где См = СКМ{Ц{С~ , Cm = Цкп f. Для получения на экране достоверного изображения можно идти двумя путями: П разделить одношаговый процесс на два преобразования, каждое из которых имеет по одному декартову приведению, например, q'f ~ q(CKUf), ц'ъ ~ q'{ \f~lL{Kn f ) В промежутке между этими действиями может решаться задача отсечения проекции эффекта ограниченной плоскостью f в ее системе координат; П использовать альтернативный путь от точки q до изображения ее эффекта q' на рис. 2.69 с одним центральным преобразованием, например, cjj~q\fKMfC;lIjKnt). Теперь задача отсечения решается в ЭСК. Отсекателем является проекция ограниченной плоскостью f, а объектом отсечения — экранная проекция эффекта. Преимущества проективных методов проявляются только при групповой обработке данных, когда за одно матричное умножение вычисляются проекции сразу всех точек объекта. Как только возникает необходимость поточечных операций, скорость работы проективных алгоритмов резко снижается из-за замены параллельных вычислений последовательными. Такое бывает, когда разные точки одного объекта отличаются свойствами существования эффекта. Например, тень объекта, пересекающегося с плоскостью проецирования, создается лишь теми его точками, которые находятся относительно плоскости со стороны расположения источника света (см. рис. 1.64). Если в процессе движения объекта такая ситуация возможна, то придется искать пересечение с плоскостью отрезков его ребер и полигонов граней. При этом возникают новые точки, отрезки и полигоны. Все это выбивает проективный алгоритм построения тени из русла группового метода. Аналогичная картина наблюдается при расчетах преломления, отражения, центрального проецирования, отсечения проекции контуром ограниченной плоскости проецирования. Следовательно, групповой подход имеет ограниченное применение. Рассмотрим подробнее проективные алгоритмы построения оптических эффектов с учетом проблем их существования и видимости. Тень Тень точки q на плоскости f является косоугольной (при дальнем источнике L\ либо центральной (при ближнем источнике) проекцией с/ е f (см. рис. 1.63). Про-
Геометрические преобразования 251 ективный алгоритм построения тени точки q на ограниченную плоскость f имеет следующий вид. 23 Шаг 1. Вычисляются qt = qCK и Lt— векторы точки и источника в СК f. При Ц. q\z < 0 источник и точка не лежат по одну сторону от плоскости, тень не существует, и алгоритм завершен. Шаг 2. Координаты вектора Lt дают матрицу Kt либо Ци Шаг 3. Вычисляется действительная проекция qf~qCf=[x{ у{ zf /if] точки q на f. При fit < 0 она не существует и алгоритм завершен. На этом шаге используются матрицы Q =CKKt либо Ct — СкЦ{. Шаг 4. Если точка q\ е f , т. е. лежит внутри границ плоскости f, то тень видима а на КП или экран выводится ее проекция Яз -йЬк'Спэ)-0 23 Пример 2.8. Решить проективным методом задачу построения тени каркасной пирамиды на плоскость f (см. пример 1.10) при расположении источника света в точке £ = [б 3 1.5], т.е. при у = 1.5 (см. рис. 1.65). Изобразить на плоскости прямоугольную сетку с единичным шагом, целиком вмещающую тень объекта. Решение. Плоскость тени описывается в неявной форме вектором нормали \' = [б 3 2] и точкой />о=Л,2° = [0 0 з], которую примем за начало СК if jf Zf. Пустим из нее оси Xf, zt || N и yt е f в направлении точек ps=hxx°=\[ 0 0]. p6=A,+W = [6 3 5], p7=P0+Nx{p5-p0)=[-9 20 0j. Таким образом, в СК xtyt zt плоскость f является фронтальной. Получим по (2.14) матрицы прямого и обратного перехода от МСК к СК f: 03 П Г 0 0 3 1]"'[ 0 0 0 1" \р$-ро\х° ' _ 1 оо1 VTo 0 0 1 \Р6~ Рй\2° 16 3 5 1 0 0 7 1 \Р7~Ро\у° 1 L-9 20 0 1J [ 0 7л/10 0 1 0.316 -0.407 0.857 О] Г 0.316 0 -0.949 0" 0 0.904 0.429 0 _, _ -0.407 0.904 -0.136 0 -0.949 -0.136 0.286 0 ' к 0.857 0.429 0.286 0 2.846 0.407 -0.857 1 0 0 3 1 Ск = Ро Р5 Рб Pi 1 1 1 1
252 Глава 2 Вычислим положение источника в СК f и необходимые матрицы проецирования: Lf=[6 3 1.5 l]CK=[3.32 0.474 6 l], #f = 1 0 -0.553 0 0 1 -0.079 0 0 0 0 0 Q =CKUf = -0.158 -0.237 -1.107 3.32 -0.474 0.87 -0.158 0.474 О о -0.167 1 -0.143 -0.071 -0.048 1.143 О О О О Определяем координаты точек р\ +рь и их проекций в СК f: ' Pit ! P2t 1 />3f ' PAt !. = >1 1" Pi 1 РЪ 1 Рл !. Ск = 4.743 1.581 2.53 3.476 2.936 3.143 2.936 3.143 0.813 1.4 >i г Р2 ' Ръ ! р4 •. Q = 3.004 2.688 0 0.476 -0.158 2.688 0 0.476 -0.395 0.395 0 0.119 2.53 1.265 0 0.714 6.309 -0.332 -3.32 3.432 5.286 1.714 5.645 5.645 3.32 1.771 О О О О />lf ! Pli ' P3f 1 /и ]. Все аппликаты точек Lt и р,* одного знака и, кроме того, все значения Л,т > 0, следовательно, вся пирамида имеет действительную тень на плоскости f. Абсциссы и ординаты проекций p'if дают целочисленные границы -4<Xf<7,0<^f<6 прямоугольника на плоскости f, целиком вмещающего тень объекта. На рис. 2.70 построена диметрическая проекция сцены с вектором направления на дальнего наблюдателя заданным в примере 1.10. Матрица Спэ = Аднм приведена в (2.74). Расчет сцены выполняется в следующей последовательности: П с помощью функций 0]АДИМ,[6 0 0]АДИМ), /ше([0 0 Ппе{[0 0 0]АДИМ,[0 7 0]АДИМ), Ппе([0 0 0]АДИМ,[0 0 7]Адим)
Геометрические преобразования 253 рисуем оси координат: ось х длиной 6, ось у длиной 7 и ось z длиной 7. Длины осей определены по максимумам соответствующих координат всех точек сцены; Рис. 2.70 ^ строим прямоугольную сетку с единичным шагом на плоскости тени: lme([xf О О 1]СКЧАЛИМ, [х{ 6 О 1]СКЧАДИМ) Vxr = =4~7, line([-4 у, О \]c;lAWM,[l yt О \]с;1Ашм) 4yt = 06; ^ рассчитываем диметрические проекции точек тени р^С^ Адим V/ = 1,4 и соединяем их шестью прямыми согласно топологии объекта; 3 рассчитываем диметрические проекции точек объекта /7,-Адим V/ = l, 4 и соединяем их шестью прямыми согласно топологии объекта; 3 рассчитываем диметрическую проекцию источника LAmm. Отражение Отражение точки q от плоскости f является косоугольной (при дальнем наблюдателе S) либо центральной (при ближнем наблюдателе) проекцией q' е f отраженной точки q° (см. рис. 1.68). Проективный алгоритм построения отражения точки q от ограниченной плоскости f имеет следующий вид. 23 Шаг 1. Вычисляются qf =qCK и St— векторы точки и наблюдателя в СК f. При St. qt: < 0 наблюдатель и точка не лежат по одну сторону от плоскости, отражение не существует, и алгоритм завершен. Шаг 2. Координаты вектора St дают матрицу Kt или Ц{.
254 Глава 2 Шаг 3. Вычисляется проекция q' точки q° на f: Qf~qCf-[xf Ух zf hf]- Здесь используется матрица С{ =СКМ{К{ либо С{ =СКМ(Ц{. Шаг 4. Если точка q\ е f , т. е. лежит внутри границ плоскости f, то отражение видимо и на КП или экран выводится проекция %~й(ск1спэ)- & Пример 2.9. Решить проективным методом задачу построения отражения каркасной пирамиды от плоского зеркала из примера 1.12 (рис. 1.70). Наблюдатель находится в точке 5=2^ 1 v8 J. Решение. В указанном примере установлено, что вершина пирамиды /м не может иметь отражения в зеркале, т. к. она с наблюдателем расположены по разные стороны от его плоскости. Там же найдены точки dX4 = [1.429 0.857 -\А29], d24=[\ 0.75 -0.5], d34 = [\A09 0.273 -l] пересечения ребер р\р4, pip* и ръри с бесконечной плоскостью зеркала. Таким образом, отражение пирамиды создается отрезками/»!рг,р\ръ,ргръ,р\ d\4,pidi4 и ръ du. Вычислим необходимые векторы и матрицы проецирования с учетом, что плоскость зеркала описывается в неявной форме нормалью A^ = [6 2 3J и точкой />0 = [о 0 2], а вершины полигона зеркала находятся в точках mi=hzz°=[0 0 2\=p0,m2=hxx°=[\ 0 0], «з = ЛуУ = [О 3 О], т4 =/И] +/и3 -т2 = [-1 3 2\: ск = /И] 1 т2 1 /И] +N 1 т\+ Nx (т2 - /И]) 1 -1 о3 1 \т2-т}\х° 1 \N\z° 1 |Л^|-|ш2-/и,(^° 1 = 0.447 -0.256 0 0.958 -0.894 -0.128 1.789 0.256 0.857 0 0.286 0 0.429 0 -0.857 1 [Sf lj=[2 2 2д/8 l]cK= [-2.376 0.938 3.853 l], Uf = 1 0 0.617 0 0 1 0.617 0 0 0 0 0 0 0 -0.26 1
Геометрические преобразования 255 S = [2 2 5.657] =>Cm = *-отр ^'K'"f^'K *"п 1 0 0 1 -0.354 -0354 0 -0.21 -0.403 -0.958 .21 0 -0.23 0 0.923 0 0.469 0 0.23 0 0 0 0 0 0 -0.177 0 1 0.13 0.043 -0.112 0.87 Учитывая предупреждение о возможных ошибках декартова приведения, находим групповым методом экранные проекции точек полигона зеркала, пирамиды п ее отражения: /И] 1 т-> 1 ( Щ 1 т4 1 Р\ ' Р2 РЪ ' dl4 1 ^24 1 Уз4 1 А 1 Pi 1 Pi 1 du 1 ^24 1 Я34 1 ^пэ - — -i Г = J Г = '-отр 0.707 -0.707 0 0.646 1 0 0 1 0 3 0 1 -1.707 2.293 0 0.646 -1.094 -1.094 0 1 1 0 0 1 0 3 0 1 -2.641 3.547 0 1 тъ 1 т2э 1 /и3э 1 т4э 1 2.707 2.707 0.646 2.646 4.354 2.354 1.934 1.362 1.177 0.927 1.763 0.626 1.901 -1.168 0.523 1.934 1.177 1.763 2.554 2.301 1.625 1.362 0.927 0.626 1.354 0.823 1.177 1.253 1.088 1.177 1.44 1.018 1.588 1.253 1.088 1.177 2 0.785 3.7 1.544 1.081 1.498 2 3.215 2 1.088 0.852 0.532 0 0 0 0 0 0 Г 1 1 1 1 1 />1э 1] Р2э ! />3э ' dl43 1 ^24э 1 .^34э 1_|_ 1.32 -1.147 0.329 1.544 1.081 1.498 1.773 2.261 1.023 1.088 0.852 0.532 0 0 О О О О Г 1 1 1 1 1 Ръ 1 Ргъ 1 РЪъ 1 <^14э 1 ^24э 1 _^34э 1. По этим данным на рис. 2.71 построено изображение сцены, полностью совпадающее с картинкой на рис. 1.71, б. Отсеченные фрагменты проекций ребер пирамиды изображены пунктиром. Из всех ребер лишь проекция ръ ръэ не подверглась отсечению экранной проекцией полигона зеркала {пнз /игэ /пзэ пш тъ), т. е. реброргръ целиком видно в зеркале. Ребра/>1/>2,£>1/?з и отрезки ребер рг du, ръ Яз4 видны в зеркале частично, а отрезок p[3d[43 полностью отсечен проекцией зеркала. □
256 Глава 2 Рис. 2.71 Преломление Разработка проективного алгоритма преломления осложняется изломом лучей, проходящих от точек объекта к наблюдателю, на границе раздела сред с показателями преломления п\Фпг. Аналогично лучевому алгоритму преломления (см. разд. 1.3.5.3) рассмотрим два случая удаленности наблюдателя от плоскости преломления f и соответственно два варианта расчета в базисе f значения g = sin(y) для угла преломления у. 1. Наблюдатель бесконечно удален от плоскости f в направлении S, составляющем с нормалью к f угол преломления с синусом (1.154) 8- >fxzf° \Sfx + S, fy (2.117) м не зависящим от положения точки q. Следовательно, угол падения а и вектор падающего луча V также не зависят от q, а точка преломления q' е f является косоугольной проекцией q на плоскость f (см. рис. 1.73). Получим направление проецирования Vt масштабированием вектора наблюдателя St в ортогональном к f направлении: Vt=StM(l,[,K), гдеХ = tg(v). tg(«) № п2 (2.118) Теперь становится возможным сформировать по (2.76) матрицу косоугольного проецирования Kt. необходимую для расчета точки преломления q\. Решение (2.118) определено при 0 <g < пП, что является условием отсутствия полного внутреннего отражения и совпадает с (1.158). Так как направление проецирования не зависит от положения точки q в среде с показателем преломления /п. то возможно групповое преобразование всех точек объекта, находящихся в этой среде.
Геометрические преобразования 257 2. Наблюдатель находится в конечной точке St (см. рис. 1.76). В отличие от параллельного проецирования здесь проявляется эффект аберрации: продолжения падающих лучей q—>q' для разных точек среды с показателем преломления т не пересекаются в единственной точке, которую иначе можно было бы считать центром проецирования. Действительно, т. к. теперь g * const, то высота . _ ds _Vg(Y)_. Ul-g1 на которой продолжение падающего луча пересекает вертикаль p'S, зависит от расположения точки q. Это причина отсутствия единой матрицы центрального проецирования и невозможности группового преобразования всех точек объекта. Решая задачу индивидуально для каждой его точки, вычислим такое значение g = sin(y), при котором луч q —>q' после преломления попадет точно в наблюдателя S. Составим аналогичное (1.160) нелинейное уравнение: / 2 1^ + Г~2^ь\ = ^Sfx ~qfx>>2+ (¾ ~q*y}2 ■ (2.119) Оно всегда имеет численное решение g, удовлетворяющее условию 0 < g < пп. Далее по (2.118) находим вектор Vt, а по (2.76)— матрицу косоугольного проецирования Kt. Оформим проективный алгоритм построения преломления точки q на ограниченной плоскости f раздела двух сред в следующем виде. & Шаг 1. Вычисляются qf =qCK и St— векторы точки и наблюдателя в СК f. При Sf-qt:>0 наблюдатель и точка не лежат по разные стороны от плоскости, преломление не существует, и алгоритм завершен. Шаг 2. По (2.117) либо (2.119) находится значение g. Если g g (0, ип), то преломление не существует, и алгоритм завершен. Шаг 3. Координаты вычисленного по (2.118) вектора Кг дают матрицу Kt. Шаг 4. Вычисляется проекция q' точки q на плоскость f: q'{ ~qCf=[xf yf zf hf]. Здесь используется матрица Q =CKKf. Шаг 5. Если точка q'f е f , т. е. лежит внутри границ плоскости f, то преломление существует и на КП или экран выводится ее проекция
258 Глава 2 Р7 Пример 2.10. Решить проективным методом задачу построения преломления каркасной пирамиды на гранях стеклянного аквариума из примера 1.14 (см. рис. 1.75, а). Вершины пирамиды равны Л=[1 3 [],Р2=[\ 3 3], ft = [3 1 \],р4=\0 0 1]. Пересечение ребер пирамиды с поверхностью воды (верхней гранью аквариума) происходит в точках rf,3=[2 2 0.5], с/,4 = [0.667 2 0.333], rf23 = [2 2 2], d24=[0.667 2 2.333]. Размеры аквариума rfv = 3, rf,. = 2 и <:/. = 3. Вектор направления на дальнего наблюдателя равен S = [2 1 з]. Решение. Построение сиены включает: □ изображение верхней, передней и правой граней аквариума; □ изображение не погруженных в воду отрезков pi рг,р\ du,p\ du,pi dn и pi d-ы; □ расчет преломления и отсечения погруженных отрезков d\3p3, dup4, diips и dup* в трех гранях аквариума. Прежде всего определим аксонометрическую проекцию, в которой должна изображаться сцена. Найдем по (2.72, б) минимальные углы вращения сцены, дающие желаемый вектор S: sin(<P*)=-nr фд. = arcsin Vl4 15.5е <pv = -arctg(2/3)= -33.69°. Тогда по (2.71, б) получим матрицу триметрического проецирования А = д/9/13 -^2J9\ 0 0 д/13/14 0 -^4/13 -^9/182 0 0.832 0 -0.555 -0.148 0.964 -0.222 Экранные проекции вершин каркаса аквариума и концов отрезков надводной части пирамиды вычисляются как "X 0 0 0 0 dz 0 dz dr А = 0 2.496 0 -1.664 2.496 0.832 -1.664 0.832 0 -0.445 1.927 -0.667 1.482 -1.112 1.26 0.815 0" 0 0 0 0 0 0 0 ? Pi Pi dn dl4 d23 _d24. A = 0.832 -0.832 1.387 0.37 0.555 -0.74 2.743 2.075 1.52 1.754 1.186 1.31 0" 0 0 0 0 0 Pb Р2э d\33 d\43 dli3 d243
Геометрические преобразования 259 и на изображении (рис. 2.72) соединены друг с другом в соответствии с топологией обоих каркасов. Для ориентирования приведена сетка экранной системы координат. Рис. 2.72 Построение преломления рассмотрим на примере ограниченной плоскости верхней грани аквариума. Найдем 3 матрицу преобразования системы координат, совмещающую эту грань с фронтальной плоскостью f: "1 с к ~ Rx 'тО T(-dyZ°): О О О О -1 о о 3 вектор наблюдателя в новой СК f: Sf=SCK=[2 -3 1 Ol; D вектор направления падающих лучей (2.118): 43]; g =-^13/14 = 0.964<«п =1.33 => ?l = 3.43=> Кг=ф -3 3. D матрицу косоугольного проецирования: I 0 0" К{= 0 10 -0.583 0.875 0 D матрицу преобразования исходных точек из МСК в экранные проекции их преломлений: " 0.832 -0.148 0 0" 0 0.281 0 0 -0.555 -0.222 0 0 0 1.365 0 1 -пр ■СКК{СК А-
260 Глава 2 П групповым методом находим точки в ЭСК, необходимые для расчета преломления пирамиды и задних ребер аквариума в его верхней грани: РЪ 1 /?4 1 d]3 1 dl4 1 d23 1 ^24 • О 1 dxx° 1 dyy° l </zz° 1 r = *-пр 1.941 -0.555 1.387 0.37 0.555 -0.74 0 0.832 0 -0.555 0.979 1.143 1.52 1.754 1.186 1.31 1.365 1.217 1.646 1.143 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 = Ръ 1 А?4э 1 ^13э 1 С?14Э 1 ^23э 1 ^24э 1 Оэ 1 dxx% 1 dyy° 1 d *° 1 По этим данным на рис. 2.73, о построены преломления погруженных в воду отрезков пирамиды и результат отсечения их проекцией верхней грани аквариума с помощью функции clip2_cross (отсеченные фрагменты показаны пунктиром). Рис. 2.73 Решая аналогичные задачи для передней и правой граней аквариума, получим изображения преломлений пирамиды на рис. 2.73. б и 2.73. е. Объединяя все построенное на рис. 2.72 и 2.73 в одно целое, получим изображение сцены на рис. 1.75,6. □
Глава 3 Математические модели поверхностей и объектов В процессе построения сцены решаются геометрические и оптические задачи. К первоочередным относятся геометрические задачи формирования поверхностей, составления моделей объектов сцены, композиции объектов в пространстве сцены, отсечения элементов сцены, не попавших в отображаемую область, удаления невидимых элементов отображаемой области. В результате получается эскиз сцены. Далее решаются оптические задачи реалистичного изображения объектов: закрашивание поверхностей с учетом их цвета, освещенности и ориентации в пространстве, расчет теней, отражений и более сложных оптических эффектов — полутеней, переотражений, бликов, полупрозрачности и т. п. При этом могут появиться новые виртуальные, т. е. кажущиеся, объекты, которые усложняют эскиз сцены. Таким образом, построение сцены — процесс многошаговый. По окончании формирования изображения в буферной памяти ЭВМ оно выводится на экран дисплея. 3.1. Методы моделирования поверхностей Поверхность — это граница, отделяющая пространство, принадлежащее объекту, от внешнего мира. Модели поверхностей играют важную роль в конструировании, производстве и изображении объемных объектов. Очевидными примерами областей их применения являются: 3 проектирование корпусов и оболочек в машиностроении — автомобилей, кораблей, самолетов и их отдельных деталей; 3 разработка программ обработки поверхностей для автоматических станков; П дизайн изделий легкой промышленности — мебели, посуды, обуви и одежды; 3 визуализация экспериментальных данных о границах раздела сред в естественных науках— медицине (компьютерная томография), геологии и локации (построение рельефа поверхности Земли, морского дна, космических объектов).
262 Глава 3 Из всех аспектов изучения поверхностей наибольший интерес, на наш взгляд, представляют методы конструирования математических моделей поверхностей и их реалистичного изображения на плоскости. В соответствии с этими двумя категориями на рис. 3.1 представлена схема классификации поверхностей, раскрытие которой составляет содержание данной главы. Логично начать углубленное изучение поверхностей со способов их изображения, чтобы потом можно было иллюстрировать методы построения моделей в наглядной графической форме. Ш (! ПОВЕРХНОСТИ D -С Кинематические С Каркасные j ( Точечные J Кусочные -С Сплайновые -< Фрактальные —►[ Графические J <! (вращения) (Переноса) (Комбинированные} ft t Линейчатые ) ►(развертываемые)- -+Г Конические J »( Косые ) L>(TopcoBbieJ (Цилиндрические) Нелинейчатые 3 С двумя направляющими С тремя направляющими Циклические} ( Косые плоскости —►(. Квадратичные/) Г Цилиндроиды ' Высших порядков и: трансцёндёнтйыё ( Коноиды J* Однополостные гиперболоиды Косые цилиндроиды j (конусоиды Рис. 3.1 3.1.1. Методы изображения поверхностей Изображение является мощным графическим средством зрительного восприятия геометрической информации. Далеко не каждый человек может построить в своем воображении объемную фигуру по ее словесному описанию или уравнениям математической модели. Основная задача компьютерной графики, собственно, и
Математические модели поверхностей и объектов 263 состоит в преобразовании геометрических моделей в наглядные визуальные формы, реалистично отображающие на плоскости строение и ориентацию объектов, расположенных в пространстве. Как только появляется необходимость изобразить на экране дисплея какую-либо поверхность, тут же возникает множество вопросов. П Какими изобразительными средствами можно достоверно передать форму поверхности? Я Как выбрать удачный ракурс изображения, раскрывающий на плоском экране особенности строения объекта? D Как закрасить изображение поверхности, наиболее точно подражая игре света и тени на поверхности реального объекта? Начнем рассмотрение этих проблем в логически обоснованном порядке. 3.1.1.1. Выбор проекции изображения Выбор проекции изображения осуществляется из арсенала методов параллельного или центрального проецирования, подробно рассмотренных в гл. 2. Как правило, конструируемая поверхность ориентирована своими осями симметрии параллельно координатным осям, поэтому ее ортографическая проекция на координатную плоскость выглядит невыразительно (рис. 3.2, я). Для большей наглядности поверхность рекомендуется повернуть в пространстве так, чтобы были видны характерные детали ее рельефа, а выпуклости как можно меньше заслоняли впадины. Такой ракурс характеризуется углами разворота ф^, и наклона фу, модули которых рекомендуется выбирать в интервале 20° -г 60° (триметрическая проекция). Большинство иллюстраций в книге выполнено в стандартных проекциях, хорошо передающих глубину объекта в пространстве: диметрической с углами (ру.» -20°, фЛ к 20° (рис. 3.2, б) и изометрической с углами <р, а -45°, фЛ.» 35° (рис. 3.2, в). Углы наклона фч, близкие к 0° и 90°, делают изображение плоским, со скрытыми важными деталями рельефа (рис. 3.2, г). Наиболее правдоподобно выглядит центральная проекция объекта, предварительно развернутого в пространстве на диметрические или изометрические углы. Это более сложное, чем параллельное проецирование, преобразование содержит дополнительную операцию (2.85) приведения расширенных векторов к декартовой форме. Близость наблюдателя, собственно, и создает эффект перспективы. Он заметен при фокусном расстоянии, сравнимом с размерами объекта. Удаленный от сцены наблюдатель видит все ее объекты в параллельных лучах. Из-за этого размеры проекций не зависят от приближения или удаления объектов, а смысл и эффект центрального проецирования здесь теряется. Таким образом, перспективная проекция рекомендуется для изображения протяженных в глубину сцены статических объектов, а также динамичных сцен, в которых наблюдатель и объекты перемещаются по глубине пространства. Переходим к выбору метода отображения рельефа поверхности. Не принимая всерьез совершенно не информативное решение выводить поверхность моно-
264 Глава 3 хромно закрашенным внешним контуром (рис. 3.2, д) (это годится лишь для плоских полигонов и построения теней), выделим два наиболее распространенных в компьютерной графике способа изображения неплоских поверхностей: каркасный (рис. 3.2, е, ж) и точечный (рис. 3.2, а—г). Возможна также комбинация этих методов (рис. 3.2, з). ч Ф, = 0° <р=20° <Pv=35° <Pv = 35° а б в г Рис. 3.2 3.1.1.2. Каркасные поверхности Многие прикладные программы Зё-графики для быстрого эскизного изображения поверхности выводят на экран дисплея не все ее точки, а лишь то их небольшое количество, которое достаточно реалистично передает характер искривления поверхности в пространстве. Совокупность таких точек образует каркас — систему линий на поверхности. Эти условные линии разбивают ее на ячейки, граничащие друг с другом по ребрам, которые соединяются в вершинах (узлах). В зависимости от способа описания поверхности строятся соответствующие каркасные линии. □ Параметрическая поверхность p(t, т) изображается параметрическими линиями p(th т) np(t, ij) (см. рис. 3.2, е), которые рассчитываются следующим образом: • задаются целые числа п и т, определяющие индексную сетку {i,j}, в которой i = 0, п, j = 0, т ; • выполняется дискретизация параметров l - to, t\,... ,t„,x- то,Tl, ..., т,„
Математические модели поверхностей и объектов 265 и создается параметрическая сетка {г„ т,}. В простейшем случае она может быть равномерной с интервалами дискретности: At, = tj -t,-\ = const V/, At,- = xj-x—i = const V/; • вычисляются узлы p(th Zj) и циклически строится каркасная сетка из проекций отрезков между узлами /4,TyV7=6T^)v/ = M, /4V'=M, Tj)vj =0^J. П Неявная поверхность f(x, у, z) = 0 изображается семействами пиний уровня или изолиний (рис. 3.2, ж) х - ху„ у - yyj, z - zyk, расчет которых на примере изолиний х = ху„ параллельных координатной плоскости yz, следующий: • задается и значений уровней хУ1 Vi = 1, п; • рассчитываются сечения поверхности плоскостями, параллельными плоскости yz, путем я-кратного решения нелинейного уравнения f(xyhy,z) = 0 Vi = l,n. Если поверхность допускает явное описание, например, у(х, z), то изолиния xyi превращается в аналитическую однопараметрическую функцию При существовании явного описания z(x, у) для построения используется однопараметрическая функция p(y)=Pyi У г^упУ)1 В [36] описан эффективный численный "метод маркированных квадратов", строящий линии уровня поверхности, описываемой явной функцией z(x, у). Метод основан на пространственной интерполяции функции двух переменных между узловыми значениями zfJ на прямоугольной сетке (л„ yj). Важный момент при построении каркасных моделей — разумный выбор числа интервалов дискретизации, определяющего размер ячеек и расстояние между чаркасными линиями. Малое число крупных ячеек делает изображение криволинейной поверхности грубым и угловатым (рис. 3.2, з). Наоборот, при большой плотности каркасных линий они сливаются друг с другом и скрывают под собой форму и цвет поверхности. Некоторым компромиссом может быть построение :амих кусочно-линейных линий с малым шагом дискретизации одного параметра, а выбор расстояния между ними — с /г-кратным шагом дискретизации другого параметра: p\fhТуV/ = 0,km) Vi = 0,к,...,кп, р\(,,Vi = 0,кп, т)\fj =0,к,...,кт .
266 Глава 3 При этом ячейки выглядят крупными и объемными, а ребра — криволинейными. Реальные же ячейки, построенные на всех узлах рф в к раз мельче и лучше аппроксимируют криволинейную поверхность. Ячейки каркасных поверхностей могут быть: □ прозрачными и непрозрачными; □ объемными и плоскими, которые называются гранями; □ полигональными и криволинейными. Для изображения прозрачной каркасной поверхности (см. рис. 2.58) достаточно вывести на экран все ее ребра в произвольном порядке. Такая картинка часто выглядит как набор линий, неоднозначно передающих глубину поверхности, воспринимаемую каждым человеком по-своему. Изображение непрозрачного каркаса (см. рис. 2.60) включает только ячейки, видимые наблюдателем. Для их определения необходимо выполнить процедур} удаления невидимых ячеек или их фрагментов, заслоненных другими ячейками. Рассмотрим два простейших алгоритма, решающих эту задачу визуализации путем упорядочения вывода экранных проекций ячеек. □ Алгоритм Робертса, предназначенный для построения выпуклых замкнутых поверхностей с плоскими гранями, выводит на экран только лицевые грани, обращенные внешней стороной к наблюдателю. Идентификация /'-ой грани заключается в оценке угла видимости у, = ZN,- S, между векторами наблюдателя S,- и внешней нормали N, (рис. 3.3, а). Ячейка является лицевой при остром угле видимости, и это быстро определяется из условия N, о 5, > 0 без вычисления самого угла. Порядок вывода лицевых граней произволен. Рис. 3.3
Математические модели поверхностей и объектов 267 Модификация алгоритма Робертса для невыпуклых поверхностей заключается в присвоении каждой грани определенного приоритета вывода по правилу: чем внутреннее находится грань, тем выше у нее приоритет (рис. 3.3, б). По- прежнему, выводятся только лицевые грани, но теперь в порядке уменьшения приоритетов. Порядок вывода граней с равными приоритетами произволен. Данный метод обеспечивает корректное экранирование внутренних ячеек внешними при наложении их экранных проекций. Незамкнутая выпуклая каркасная поверхность (см. рис. 2.60) также может быть изображена модифицированным методом Робертса, если внутренним сторонам ячеек присвоить высший приоритет и определять их видимость по правилу TV, о S, < 0, где N, — внешняя нормаль к плоскости /-ой ячейки. D Алгоритм художника предназначен для изображения произвольных поверхностей и выводит на экран все ячейки целиком по мере их приближения к наблюдателю. Проекции ближних граней могут частично или полностью нало- житься на ранее построенные проекции дальних граней подобно тому, как художник наносит на холст один мазок поверх ранее нанесенного мазка, тем самым скрывая последний от зрителя. Метод основан на вычислении удаленности (глубины) d, центров ячеек с, (в разных вариантах алгоритма используются и другие опорные точки ячеек) от наблюдателя, сортировке и выводе ячеек в порядке уменьшения элементов вектора d. При наблюдателе, находящемся в конечной точке 5, глубина точки с, равна расстоянию d, = \c,-S[, (3.1. я) а в вычислительном аспекте более эффективно использовать квадрат расстояния (3.1, а) как скалярное произведение rf?=(C|-S)o(C/-S). (3.1,6) В случае наблюдателя, бесконечно удаленного в направлении вектора S, расстояния от него до всех точек также бесконечны. Впрочем, для сортировки можно использовать и относительные глубины, отсчитываемые вдоль любой оси d, противоположной направлению вектора S (рис. 3.4). Запишем проекцию точки с, на вектор S: prsc,=?,S, где ti =-1--. Рис. 3.4
268 Глава 3 Увеличение значения t, означает приближение точки с, к наблюдателю. Следовательно, в качестве эквивалента глубины, который должен уменьшаться с ростом /,, можно принять легко вычислимое скалярное произведение d, = -c,oS. (3.1, в) Алгоритм художника отличается высоким быстродействием, но, к сожалению, имеет серьезный недостаток: ячейки каркаса должны быть примерно одинакового и достаточно малого размера по сравнению с габаритами поверхности. При определенном ракурсе разновеликие ячейки могут вывестись на экран в неверном порядке, что иллюстрируется на рис. 3.5 изображениями боковой поверхности цилиндрической призмы с прямоугольными гранями. Ориентация поверхности на рис. 3.5, а выбрана так, что центр первой грани с\ расположен к наблюдателю чуть-чуть ближе, чем центр второй грани с;. Вращение объекта всего лишь на угол <ру — 2° из-за большой протяженности первой грани расположило точку с\ немного дальше точки сг, из-за чего вторая грань была выведена на экран позже первой и неестественно перекрыла ее (рис. 3.5, б). Рис. 3.5 Общим недостатком рассмотренных алгоритмов, выводящих грани целиком, является невозможность правильного изображения двух пересекающихся ячеек, каждая из которых видна лишь частично (см. рис. 2.68). Более совершенные методы удаления невидимых элементов рассматриваются в гл. 4. 3.1.1.3. Точечные поверхности Каркасные линии как средство передачи рельефа поверхности в действительности не существуют. К тому же, будучи искусственно нанесенными на поверхность, они занимают часть ее площади, иногда значительную. Наиболее реалистичным является точечное изображение криволинейной поверхности с индивидуальной закраской каждой ее видимой точки. Эффект объемности достигается благодаря игре цвета, света и тени в исполнении искусного программиста-художника. Некоторые методы реалистичного закрашивания поверхностей рассматриваются е следующем разделе. А здесь сосредоточимся на конструктивной задаче определения порядка вывода точек криволинейной поверхности на экран.
Математические модели поверхностей и объектов 269 _амым распространенным алгоритмом визуализации произвольных поверхно- :тей является простой и достаточно эффективный метод z-буфера, аппаратно теализованный во всех современных графических ускорителях. Сущность метода "включается в переборе точек поверхности и записи в видеопамять цветовых ко- юв ближайших к наблюдателю точек. Для реализации процесса сортировки то- -ек по глубине сцены в памяти ЭВМ создаются две матрицы: 3 буфер глубины Z, хранящий параметры удаления точек сцены, ближайших к наблюдателю и видимых им. Объем z-буфера равен width х height слов, где width = right - left + I, height - down -up + 1 есть размеры прямоугольного окна вывода на экране дисплея (см. рис. 2.10), а разрядность слова Nz определяется числом уровней 2 z квантования удаленности точек от наблюдателя; 3 буфер кадра F, хранящий цвета точек окна вывода. Объем буфера кадра равен width х height слов, разрядность которых NF определяется числом уровней iNr 2 ' квантования цветовых оттенков. Алгоритм работы метода z-буфера поясняется блок-схемой, приведенной на г.1С 3.6. Перед началом обработки поверхностей объектов сцены выполняется щиализация буферов глубины и кадра фоновыми значениями дальности и цве- ~а. Фон — это любая картинка, заполняющая окно вывода в отсутствие объектов. Дальность фона задается числом, большим удаленности самой дальней точ- «•f сцены от наблюдателя. Например, это может быть максимальное число тазрядной сетки процессора ЭВМ, условно говоря, оо. Л >верхности или их отдельные ячейки проецируются на экран, отсекаются ~оаницей окна вывода, после чего начинается сканирование точек каждой прочини, которые можно перебирать в произвольном порядке. Эта процедура назы- 1зется разложением проекции в растр — двумерную матрицу пикселов, закрашиваемых независимо друг от друга. Для каждой точки растра рэ = [хэ уэ 0] -еобходимо найти образ р = [х у г] на соответствующей поверхности, ис- "ользуя ее уравнение. Физически это означает, что из точек растра проводятся :<анирующие лучи в направлении наблюдателя и производится расчет точек пе- т^гсечения этих лучей с поверхностями. Понятно, что из нескольких точек, нани- мнных на (/,_/)-ый луч, наблюдатель увидит лишь самую ближайшую. Именно ■ту точку и следует изобразить на экране путем записи ее цвета cv в (;,/)-ый пиксел ">фера кадра. Если на луче нет ни одной точки, то цвет пиксела остается фоновым. Метод вычисления глубины d точки р к наблюдателю S зависит от используемой проекции изображения поверхности: ~3 при ортографическом фронтальном проецировании система координат сцены остается неподвижной, вектор наблюдателя, ортогональный картинной плоскости, равен S = z°, а в качестве эквивалента глубины точки можно с помощью (3.1, в) принять число d - -z;
270 Глава 3 (z-Ыфг) Инициализация буферов Z и F . Выбор точки ^ Р,=Р J 0] Расчет точки р Расчет глубины d Расчетцвета с Вывод буфера F в окно ( Выход ) Рис. 3.6 □ при аксонометрическом проецировании на фронтальную плоскость МСК все объекты описываются в СК сцены, развернутой в пространстве матрицей jR; . из (2.61) на углы <ру, <pv и фг. Нормированный вектор наблюдателя в системе координат сцены находится по (2.72, я) и одинаков при любых углах вращения ф.: S = [0 0 l]/fjc=[-cosfajsin^) sinfaj cosfajcos^)]. В стандартных аксонометрических проекциях удобнее использовать ненормированные формы этого вектора, приведенные в (2.74) и (2.75): Ядам =4 ! Л\> 5ИЗО=[1 1 1]- Преобразование pf = pRyxz = [xf )>{ Z{ ] дает аппликату точки в МСК, равную zr. Тогда вычисленная по формуле d- -zr
Математические модели поверхностей и объектов 271 глубина точкир будет уменьшаться по мере ее приближения к наблюдателю. Другой более быстрый способ заключается в вычислении по (3.1, в) эквивалента глубины точки d = -p ° S относительно бесконечно удаленного наблюдателя, связанного с координатой zt соотношением d = -z\ \S\; П при центральном проецировании на фронтальную плоскость МСК расчет глубины по формуле (3.1, а) как d = \р - S\ (расстояние от точки р до наблюдателя S) требует вычисления квадратного корня. В вычислительном аспекте выгоднее ассоциировать глубину с квадратом расстояния (3.1, б) d=(p-S)°{p-S), вычисляемым всего за восемь арифметических операций. После нахождения величины d проверяется состояние (i,j)-ro элемента z-буфера Z,v. При d < Zti точка р находится к наблюдателю ближе, чем другие точки поверхности (или фон), имеющие такие же экранные координаты [/' у]. В z-буфер записывается новое состояние Z,-, = d. а в элемент буфера кадра Ftj — код цвета точки с, вычисленный с помощью излагаемых чуть ниже моделей освещенности и формул закрашивания. По окончании перебора точек поверхностей всех объектов содержимое буфера кадра копируется в окно вывода на экране дисплея, начиная со строки up и :толбца left. 3.1.1.4. Модели освещенности и закрашивание поверхностей При решении задачи закрашивания сконструированной поверхности программист оказывается один на один со сложной дилеммой: 3 с одной стороны, ему нужна модель взаимодействия света и материала, которая бы максимально соответствовала реальным физическим процессам; 3 с другой стороны, реализация этой модели в графической системе не должна сильно перегружать компьютер. Понятно, что никакая программа на самом мощном компьютере не в состоянии проследить пути всех лучей, пронизывающих пространство сцены (см. рис. 1.61), чтобы рассчитать энергетические и спектральные характеристики света, приходящего к наблюдателю из всех видимых им точек. Следовательно, нужна такая модель расчета освещенности, которая была бы достаточно простой, не отслеживала путь каждого луча, но создавала на экране распределение цветового поля, визуально близкое к реальной действительности. Цвет закраски непрозрачной поверхности определяется множеством факторов, важнейшими из которых являются: 3 физико-механические и оптические свойства поверхности, определяющие ее собственный цвет;
272 Глава 3 □ освещение поверхности внешними источниками света; □ ориентация поверхности относительно источников и наблюдателя; П цветовая палитра используемого графического режима. Цвет и свет неразрывно связаны. Нельзя говорить о цвете того или иного предмета, не указав, каким светом его освещают. В повседневной жизни мы рассматриваем цвет как свойство материалов. Спелый помидор— красный, весенняя трава— зеленая, небо — голубое, сера— желтая, снег— белый, а сажа— черная. Естественно, мы оцениваем цвет предметов и материалов при дневном свете. Более того, привычные цвета знакомых вещей кажутся нам таковыми и при иных условиях освещения: ночью снег и при освещении красной лампой продолжает казаться нам белым. Мы также говорим о цвете световых потоков и считаем цвет свойством света, как, например, цвет лучей светофора, прошедших через красный, желтый или зеленый светофильтр. Являются ли эти бытовые определения цвета правильными? Очевидно, нет. Ведь окраска незнакомого предмета в сумерках и при люминесцентном освещении различна, а световой луч в темноте вообще невидим (не проявляет своего цвета), если он не попадает непосредственно в глаз, ни с чем не пересекается и в воздухе нет пыли. Цветовые свойства света и объектов проявляются лишь тогда, когда прямые или косвенные лучи попадают в глаз наблюдателя. Объективные наблюдения показывают, что материалы и свет не являются цветными. Великий Исаак Ньютон, изучая свет в своей книге "Оптика" (1704), четко установил: "В действительности явно выраженные лучи ... не являются цветными В них нет ничего, кроме определенной способности и предрасположения вызывать у нас ощущение того или иного цвета" [1]. Таким образом, вместо того, чтобы говорить: "Этот свет красный", более правильно было бы сказать: "Цвет, вызываемый этим светом, красный". В психофизическом аспекте цвет есть характеристика светового стимула или просто цветовой стимул, который вызывает определенное ощущение у стандартного наблюдателя, имеющего нормальное цветовое зрение. Построение реалистических изображений включает как физические, так и психологические аспекты. Свет после взаимодействия с окружающей средой попадает в глаз, где в результате физических и химических процессов вырабатываются электромагнитные импульсы, которые далее идут по нервным волокнам в мозг Восприятие света мозгом в виде цвета — приобретаемое свойство, и во всем видимом диапазоне оно доступно лишь человеку и высшим животным —приматам. Зрительная система воспринимает электромагнитную энергию в диапазоне волн Л = [380 нм, 780 нм] как видимый свет. Он попадает в приемник (глаз) двумя путями (см. рис. 1.59). Во-первых, непосредственно от излучателя— тогда свет имеет цвет излучателя. Во-вторых, косвенно в результате отражения или преломления на поверхности раздела оптических сред. При распространении он испытывает поглощение, рассеяние на частицах среды и поляризацию составляющих электромагнитной волны. Эти факторы изменяют исходные параметры излученного света — его спектральный состав и интенсивность.
Математические модели поверхностей и объектов 273 Таким образом, цвет отраженного света определяется как цветом излученного света, так и поглощающими, отражательными и преломляющими свойствами оптической среды, выступающей в роли косвенного источника вторичных лучей. Например, желтая поверхность желта только при освещении белым светом, т. к. она отражает красную и зеленую компоненты, которые, смешиваясь в глазу, воспринимаются как желтый цвет. При освещении красным светом поверхность будет красной, а синим — черной. В зависимости от состава спектра и распределенной по нему энергии свет бывает: □ белым, содержащим все цвета спектра от фиолетового до красного, имеющие равную и максимальную энергию; □ ахроматическим, содержащим все цвета примерно равной, но не максимальной энергии. Уровень средней энергии определяет степень серости цвета. Чем меньше энергия, тем он выглядит чернее. Ахроматический источник кажется белым, а отраженный или преломленный ахроматический свет— белым, серым или черным. Белыми выглядят объекты, отражающие более 80% белого света, черными — менее 3%. Промежуточные значения коэффициента отражения дают оттенки серого цвета; 3 хроматическим или окрашенным, содержащим комбинацию различных цветов неравной энергии. Доминирующий энергетический всплеск определяет преобладающую окраску цвета; П монохроматическим, содержащим узкополосную спектральную составляющую света, воспринимаемую как цветовой тон. Установлено [1], что нормальный человеческий глаз может различить около 200 цветовых тонов, из которых только четыре унитарных цвета (красный, желтый, зеленый и синий) не воспринимаются как смеси. Все другие цветовые тона рассматриваются как смеси унитарных тонов, например, оранжевый как смесь красного и желтого. Из существующих теорий цветного зрения лучше других объясняет его свойства трехцветная теория Ломоносова—Юнга—Гельмгольца [I, 14, 16, 17]. Согласно ей — и зто подтверждено экспериментально — сетчатка глаза содержит светочувствительные рецепторы трех типов с областями чувствительности в коротковолновой (фиолетово-синей), средневолновой (зеленой) и длинноволновой (желто-красной) областях спектра. Наличие трех независимых каналов восприятия человеком всего цветового богатства окружающего мира позволяет любой цветовой оттенок представить трехмерным вектором с = [с, cg cb] (3.2) интенсивностей красной (red), зеленой (green) и синей (blue) составляющих. Целесообразно каждую из компонент выражать в независимой от цветовой палитры относительной форме— числами в интервале от 0 до 1. Белый, черный, красный, зеленый и синий цвета описываются соответственно векторами [1 1 1], [О 0 о], [l 0 О], [о 1 О] и [о 0 l]. Все градации серого имеют равные цветовые компоненты с, = cg = сь.
274 Глава 2 Разнообразие оттенков определяется числами битов п„ ng и щ кодирования цветовых компонент. Например, в палитре "High color" 16-битовый код цвета слагается из пг = 5, пк = 6 и щ = 5 разрядов. Три байта цветового кода палитры "True color" поровну разделены между компонентами: nr = и - nb = 8. Вектору относительного цвета в {п„пк,пь} -разрядной палитре соответствуют округленные до ближайших целых чисел абсолютные цветовые коды г = ^-1^+0.5J, g=|f2"«-ljCg+0.5 ,b = \^""-\)cb+0.s\. (3.3) Например, вектор с = [0.6 1 0.8J бледно-зеленого цвета кодируется по формулам (3.3) в палитре "True color" числами г= 153, g = 255 и b = 204. Наблюдатель видит тот или иной неизлучающий объект лишь благодаря отражению его поверхностью падающих на нее лучей. Отражательные свойства поверхности не одинаковы для различных участков спектра. Это объясняет наличие у нее собственного цвета co = \pOr cog соь\ (ЗА, о) определяемого спектральным составом отраженного света при освещении это'" поверхности белым рассеянным светом. Можно считать, что цветовые компоненть, 0<сою<1 Vcoe {r,g,b} (ЗА, б) равны коэффициентам диффузного отражения красной, зеленой и синей составляющих фонового светового потока, имеющего спектр белого цвета. Падающий на поверхность луч имеет некоторый спектральный состав, которыГ мы также будем описывать вектором относительных интенсивностей J = [lr Jg ^],где0<Ую<1 Vcoe {r,g,b}. Допустим, сцена содержит т точечных источников света L,, / е [1, т]. Для вычисления видимого цвета произвольной точки р на поверхности объекта строите* следующая система векторов (рис. 3.7): Рис. 3.7
Математические модели поверхностей и объектов 275 3 внешняя нормаль N, направление которой в любой точке плоской полигональной грани Р = \p\pi ...р„р\) постоянно и равно N = norm{P) - (рг -р\) х (pi -pi), (3.5, a) а у криволинейной поверхности вычисляется в каждой ее точке как N-^Tp~ (3-5>*> при неявном описании/(р) =0 или dp{t,x)^dp(t,x) N—dTx-dT (3-5>«) при параметрическом описании p(t, т); П вектор S направления наблюдателя, составляющий с нормалью угол видимости точки y = Z(N.S),cos(}ii)=N°S; (3.6,я) 3 векторы V,, = р - L, падающих от источников £, лучей, составляющих с внешней нормалью углы падения a, = Z(N,-V,), cos(a,)=-/Vo^; (3.6,6) П векторы М, отраженных лучей источников L„ вычисляемые по (1.140) как V,°N M,=V,-2-!- N NoN и составляющие с нормалью углы а„ а с вектором наблюдателя S углы бокового отражения р, = Z(S, М#), cos(P,) = S о ~М{ . (3.6, в) Основной вклад в интенсивность отраженного поверхностью света вносят следующие факторы. 3 Отражение фонового освещения, падающего на поверхность равномерно со всех направлений. Оно аккумулирует излучение большого числа мелких и распределенных источников, окружающих объект со всех сторон, включая небо, облака, многократные отражения от соседних объектов, рассеяние в мутной среде и т. д. Замена всего этого множества излучателей одним условным источником фонового света позволяет избежать вычислений бесчисленного количества трасс третьестепенных лучей, которые не позволяют графической системе формировать изображение в реальном масштабе времени. Теперь при моделировании можно просто считать, что каждая точка поверхности объектов сцены освещена одинаково с интенсивностью -¾ = l-V -Ate J$b 1 гДе 0 < Уфю < 1 Vo e {г, g, b).
276 Глава 3 Энергия этого света частично поглощается материалом поверхности, а частично отражается в виде вторичного излучения. Коэффициент диффузною отражения зависит от длины волны падающего света. Как указывалось выше совокупность трех таких коэффициентов составляет вектор со собственного цвета с элементами (3.4, б). Поскольку фоновое освещение не является направленным, то его отражение имеет диффузный характер, а интенсивность отражения одинакова во все^ направлениях. У реальных поверхностей диффузное отражение не идеальное — диаграмма направленности вторичного излучения поверхности (J wz рис. 3.7) зависит от угла видимости vj; в (3.6, о). При \\i —> 90° наблюдатель видит некоторое потемнение поверхности из-за уменьшения охватывающего ее телесного угла и заключенной в этом угле световой энергии. Смоделировать эту закономерность можно с помощью коэффициента, равного cosv(y), гле v < 1 — показатель равномерности диффузного рассеяния. Задание v — 0 моделирует идеальное диффузное отражение, одинаковое во всех направлениях и отсутствие потемнения поверхности при скользящем взгляде. Таким образом, интенсивность отражения фонового освещения равна сФш = сою cosv(y) Уфю Vco е {г. g, b}. (3.7. a ■ □ Отражение направленных лучей, приходящих в точку/? от источников L,. Освещенность, создаваемая идеальным точечным источником L, ослабляется п. мере его удаления от анализируемой точки р по закону обратных квадратов т. е. пропорционально числу у = сГ2, где d - \L -р\. Применение этого теоретически правильного закона дает слишком резкое bi - зуальное почернение изображения поверхности при ее удалении от источник в отсутствие других источников света, в том числе и фонового. В задаче построения тени объекта от точечного источника света она имеет очень резк!*" контраст с освещенной зоной. Большая маневренность в регулировании освещенности и смягчении светотеневого контраста в компьютерной графив- достигается с помощью обратно-квадратичного множителя [36] м=— г k0+k{d + k2d с экспериментально подбираемыми коэффициентами А:о, к\ и ki. Достигнув поверхности, направленный луч претерпевает поглощение, отражение и, возможно, преломление. Нас интересует отраженный свет. Он состоит из двух составляющих, отличающихся по механизму возникновения. • Диффузное отражение направленного луча обусловлено шероховатость» поверхности, т. е. наличием на ней микрограней, отражающих луч примерно одинаково во все стороны. Поверхность с идеальным диффузные отражением называется ламбертовой, а характер отражения описываете» законом Ламберта— пропорциональностью интенсивности отражена :* энергии косинусу угла падения (3.6, б). Физически этот закон объясняет:! уменьшением световой энергии, попадающей на единицу площади п-
Математические модели поверхностей и объектов 277 верхности, при увеличении угла падения от 0° до 90°. Диффузное же рассеяние этой энергии как и фоновой происходит равномерно во все стороны поверхности, а ее видимый цвет определяется избирательным отражением (коэффициенты отражения есть компоненты собственного цвета со,, cog и со/) направленных лучей с интенсивностями J;. m cm = c0w cosv (\|/)Х vk )cos(a/ У,ш V«e е {г, g, b). (3.7, б) /=i • Зеркальное отражение направленного луча возникает на достаточно гладкой поверхности и обусловлено концентрацией отраженных лучей преимущественно вдоль вектора идеального отражения М. Чем зеркальнее поверхность, тем более острой является диаграмма направленности отраженного излучения (2 на рис. 3.7). Эта диаграмма хорошо моделируется зависимостью cosM(P,) интенсивности зеркальных лучей от угла бокового отражения (3.6, в). Ее действие проявляется в появлении на поверхности ярких бликов в тех точках, где углы Р, » 0. 0 Коэффициент резкости бликов |и » 1 регулирует ширину диаграммы направленности. Идеальному зеркалу соответствует значение |и = оо. При построении отражения от металлов рекомендуется выбирать 100 < (I < 500. Малые значения ц < 100 соответствуют наиболее распространенным материалам с обычными оптическими свойствами — неметаллам и окрашенным поверхностям. Идеальная ламбертова поверхность характеризуется коэффициентом ц = 0. 0 Важное свойство зеркального отражения— слабая зависимость его спектра от собственного цвета поверхности. Будем считать, что блики имеют цвет падающих лучей, а доля зеркально отраженной энергии регулируется коэффициентом 0 < fo < 1. Таким образом, интенсивность зеркального отражения по каждой цветовой компоненте рассчитывается следующим образом: т сзш = кз 1д(^/ )cosii (Р/ )Jioi Va) е {г, g, Ь). (3.7, в) ы Закон вычисления компонент вектора интенсивности отраженного от поверхности света называется функцией закраски. В [5, 11, 23, 25, 33 - 36] рассматривается множество функций закраски. В (3.7) мы получили основные факторы, влияющие на формирование цвета поверхности согласно модели отражения Фонга '15, 36]. По принципу суперпозиции результирующая функция закраски точки р, имеющей вектор собственного цвета со и освещенной фоновым светом интенсивности Уф и т источниками с интенсивностями Jh расположенными в точках Lt, принимает следующий вид: -,. ,™v/llf\, , v<c0Mcosv(\|/)cos(a,)+/:3CosM(P/) , Cco-c0a)cos №1/фш + 2,— — ., —2 •'«о (3.8, a) /=i k0+k\\p-I>i\ + k2\p-L,\ Vcoe {/-, g, b}.
278 Глава 5 Подставив в (3.8, а) выражения (3.7) косинусов углов ц>, а, и (3, через их скалярные произведения, получим расчетный вариант функции закраски Фонга ,=1 kQ+kl\p-Li\ + k2\p-Ll\ Vcoe{r,g,*}. Cto\N ° s) J№ + 7, . 7 . ГГ~^«о (3.8, б) У криволинейной поверхности нет постоянного направления нормали, из-за чег^ каждая ее точка имеет на экране индивидуальную закраску. Кроме того, эта поверхность может сама себя экранировать. Большую сложность представляет отбор таких точек, которые в совокупности образуют экранное изображение без проколов и наложений пикселов друг на друга. Перечисленные факторы превращают вывод криволинейных поверхностей в наиболее сложную задачу визуализации, решаемую, как правило, на последнем этапе. Наиболее просто выполняется закрашивание параллельной проекции плоской грани, которая не может самоэкранироваться (см. рис. 3.3). Благодаря неизменности угла между векторами нормали N и бесконечно удаленного наблюдателя S цвет закраски плоской грани постоянен во всех ее точках. Верх примитивизма — заливка экранной проекции грани цветом го. Более реалистично выглядит грань, цвет закраски которой вычислен по упрощенному по сравнению с (3.8, б) закон\ *ш =coJp°s)\ Ли -£CvoFf-)/«o v«e {г, g,b}, (3.8,6) I '=' J учитывающему только диффузные составляющие отражения и ориентацию поверхности относительно источников света и наблюдателя. Разбиение поверхности на плоские полигональные ячейки, вершины которы* удовлетворяют условиям планарности (1.81), выполняется несколькими способами. Один из них состоит в разрезании объемных ячеек на треугольники — всегда плоские полигоны. Второй метод заключается в выборе узлов дискретизации поверхности (сферы, цилиндра, конуса, тора и т. п.) с учетом ее симметрии так чтобы все ячейки стали плоскими (см. рис. 1.50). 3.1.2. Кинематические поверхности Кинематические поверхности формируются непрерывным движением в пространстве некоторой линии по определенной траектории. Параметрически; уравнения кинематической поверхности имеют вид p(t,i)=Po(x)A{[,x)+pH(t) (3.9, о» или в расширенном пространстве ~A(t,x) 03х," рЬ> т) = А> (Т)С(/, т), где C(t, т)= А. СО ! (3.9,с
Математические модели поверхностей и объектов 279 Математическая модель (3.9) включает следующие кинематические элементы (рис. 3.8): 3 /?о(т) — исходное состояние образующей линии с центром (базовой точкой) в начале координат; 3 pH(i) — направляющую линию, вдоль которой переносится центр образующей линии; 3 A(t, т) — матрицу преобразования линии /?о(т), согласованного с траекторией МО; 3 интервалы изменения параметров t е [to, (Jhte [тс, т,„]. Рис. 3.8 Фиксация центра образующей линии в точках pn(tj) дает поперечные каркасные линии p(th т). Фиксированные точки /?о(т,) в процессе движения образуют продольные каркасные линии p(t, т,). Правильный выбор кинематических элементов имеет важнейшее значение при конструировании поверхностей. Для любой пары значений параметров {/, т} функция p(t, т) должна быть: 3 вычислимой. Примером поверхности, не вычислимой в некоторых точках, служит модель (1.133, б) гиперболического параболоида (см. рис. 1.50, е). Вычислимая модель той же поверхности на рис. 1.50, д задается параметрической функцией (1.133, о); П однозначной— это важно при расчете пересечений поверхности с другими геометрическими объектами (отрезками, лучами, плоскостями и т. д.) для исключения нескольких решений этой задачи. Уж на что проста кинематическая модель сферы p(t,x) =\s'm(x) cos(t) 0]/f (f)=[sin(x)cos(r) cos(t) -sin(T)sin(/)] (ЗЛО)
280 Глава 3 как поверхности вращения окружности sin\j)x0 + cos(x)y° G ху вокруг оси ) так и для нее часто задают интервалы параметров / е [0, 2л] и т е [0, 2л], исходя только из свойств периодичности тригонометрических функций sin и cos Тем самым каждая точка такой поверхности имеет минимум двойное параметрическое описание. Например, точке [1 0 0] соответствуют две napi параметрических координат {t - 0, т = л / 2} и {t = л, т = Зл / 2}. Гарантией правильного выбора интервалов изменения параметров функци. p(t, т) является учет кинематики формирования поверхности, а именно, прохождение образующей линии не более одного раза по одному и тому же участку пространства. Например, сферу (3.10) с однозначным описанием точе- можно получить либо вращением полной окружности (т е [0, 2л]) на угол 180: (t е [0, л]), либо вращением полуокружности (т е [0, л]) на угол 36(,: (/ е [0, 2л]). Второй вариант предпочтительнее, т. к. он дает на поверхности одну линию склейки вместо двух; П дифференцируемой— это необходимо в алгоритмах визуализации, использующих нормаль для расчета видимости и освещенности точек поверхности В каждой точке p(t, т) должны существовать направляющие векторы касательной плоскости at at at от ax ox (3.111 и образующий с ними правую тройку вектор нормали N(t, т) = V(t, т) х W{t, т). (3.12. с Для того чтобы нормаль была ненулевой и вычислимой во всех точках поверхности, векторы V(t, т) и W(t, т) не должны быть нулевыми или параллет*- ными. Это принципиальное условие работоспособности многих алгоритм § удаления, например, Робертса, и моделей закрашивания, например, (3.8). Неудачная модель эллипсоида с невычислимыми по (3.11) на полюсах (t -- векторами V(t, х) приведена в (1.129, б). В то же время не следует идеализирован модель (1.129, а), поскольку ее векторы K(/,t)=[flcos(/)sin(T) ~bsin(t) ccos(/)cos(t)], w(t,x)= [a s\n(t)cos(x) 0 -csin(/)sin(T)] дают по (3.12, о) нормаль jV(/,T)=|c6sin2(/)sin(T) acsin(r)cos(/) a£sin2(/)cos(T)J нулевой длины на полюсах эллипсоида при / = 0 и / = л. В остальных точках - •>- верхности нормали имеют переменную длину (рис. 3.9,я). В алгоритмах визуализации важно направление вектора нормали, а не его длина. Например ш
Математические модели поверхностей и объектов 281 (3.8, б, в) используется вектор /V единичной длины. Поэтому вместо (3.12, а) лучше сразу вычислять нормированную нормаль N(t,x)^v{t,T)xw(t,x), (3.12,6) а при получении N(t, т) = Оз в особых точках, например, в полюсах эллипсоида, следует отдельно задавать нужное направление единичного вектора нормали (рис. 3.9, б): N{t,0)=y°,N{t,n)=-yo. Рис. 3.9 На любом локальном участке поверхность является двухсторонней, причем стороны могут различаться собственным цветом и освещенностью. В случае непрозрачной замкнутой поверхности нет смысла тратить машинные ресурсы на изображение ее заведомо невидимой внутренней стороны. У незамкнутых или полупрозрачных поверхностей деление сторон на внешнюю и внутреннюю по принципу видимости наблюдателем условно. Назовем внешней ту сторону поверхности, которая обращена к вектору нормали (3.12). Алгоритмы визуализации, использующие нормаль, отображают именно внешнюю сторону. Противоположная сторона поверхности является внутренней и для ее визуализации используется вектор антинормали, равный -N(t, т). Неудачный выбор кинематических элементов модели (3.9) может привести к неожиданному эффекту инверсии внешней стороны. Например, в модели сферы (3.10) с интервалами изменения параметров t е [0, тг] и те [0, 2л] половина поверхности при 0 < т < л обращена нормалями внутрь, а другая половина — наружу сферы (рис. 3.9, в). Причина этого явления — инверсия направления вектора V(t, т) вдоль оси у при переходе параметра т через значение тг, в результате чего изменилось на противоположное и направление вектора N(t, т). Итак, синтез кинематической модели поверхности заключается в корректном выборе всех ее элементов. Расчет точек р(1, т) производится непосредственно в векторной форме (3.9). Тем не менее, иногда мы будем приводить и координатные выражения x(t, т), y(t, т) и z(t, т) для тех читателей, которые, мягко говоря, не любят векторы, матрицы и операции с ними.
282 Глава 3 3.1.2.1. Поверхности вращения, переноса и комбинированные В зависимости от характера движения образующей линии /?о(т) поверхность можно получить ее вращением, переносом вдоль направляющей линии p„(t) или комбинированием различных аффинных преобразований. Простейшая кинематическая поверхность вращения вокруг координатной оси ш е {х, у, z} описывается функциями pit, т) = />о(т)A{t), p{t,i)= p0(x)c(t) с матрицами АП A(t) = RJt), С(/)=4(0- Плоскости, проходящие через ось вращения, пересекают поверхность по меридианам. Главный меридиан лежит в плоскости, параллельной картинной плоскости, и проецируется на нее без искажений (см. пример 2.9). Плоскости, ортогональные оси вращения, пересекают поверхность по параллелям. Параллель с наибольшим диаметром называется экватором, с наименьшим — горлом, с нулевым — полюсом (рис. 3.10, а). У поверхности переноса p(t,x)=po(T)+pH(t) образующая движется без вращения и масштабирования (А = Ез.) вдоль направляющей линии (рис. 3.10, б). Во избежание получения вырожденных в линию участков поверхности кинематические элементы модели (3.9) нигде не должны быть параллельны: Фо(т)^Рн(0 di d/ Рис. 3.10
Математические модели поверхностей и объектов 283 В вырожденных точках поверхность имеет параллельные векторы V(t, т) ]) W(t, т) и по (3.12, а) нулевую нормаль, что неприемлемо для работы алгоритмов визуализации. Многие поверхности могут быть получены как вращением, так и переносом. Например, круговой цилиндр формируется вращением прямой линии вокруг параллельной ей оси либо переносом окружности вдоль прямой, ортогональной плоскости окружности. Наибольшее разнообразие поверхностей достигается комбинированием преобразований образующей линии при ее движении вдоль направляющей. Так, масштабированием /?о(т), зависящим от угла вращения т, на поверхности можно создать различные волны (рис. 3.10, в), лепестки (см. рис. 3.2) и другие формообразования. Перенос масштабируемой образующей ортогонально направляющему вектору фн(0 / d/ формирует разнообразные каналы и трубопроводы переменного сечения. Последовательность преобразований отражена в структуре матрицы C(t, т). Например, масштабирование образующей линии /?о(т) матрицей M(t), вращение вокруг оси ш и движение по направляющей траектории /?н(0 дает комбинированную поверхность, изображенную на рис. 3.10, в, с матрицей сложного преобразования с(0=м(/)4('Мл,('))- Рассмотрим задачу восстановления кинематических элементов модели (3.9) по координатным функциям x(t, т), y(t, т) и z(t, т) поверхности вращения образующей линии /?o(T)=Uo(T) >о(т) zo(T)j вокруг какой-нибудь одной координатной оси со е {х,у, z]. Ее решение необходимо, например, для правильного задания интервалов изменения параметров t и т. Выполнив преобразование вращения |х(/,т) y(t,x) г(г,т)]=А>(тко('). сведем его результаты в табл. 3.1. Таблица 3.1 Ось Ш - X ы= у (£> = Z x(t, т) Хо(т) x0(t)cos(/) + z0(T)sin(f) xo(t)cos(0 - >>o(T)sin(/) УО, т) j>o(t)cos(/) - zo(T)sin(0 yo(x) Xo(T)sin(?) + >>o(t)cos(/) zO, t) >'o(T)sin(/) + zo(t)cos(0 -;to(T)sin(f) + z0(t)cos(/) Zo(T) Анализ координатных функций параметрической поверхности начинается с поиска в них выражения, не содержащего функций cos(0 и sin(/). Это дает имя оси _>, вокруг которой вращается образующая, и первую координатную функцию ~ (т). Сравнивая оставшиеся координатные функции в ш-ой строке табл. 3.1, определяем вторую и третью координаты в /?о(т). Если образующую линию задать в <акой-либо координатной плоскости, то вторая координата будет содержать
284 Глава 3 cos(0, а третья — sin(/). После восстановления вида образующей задаем интервалы изменения параметров / и т с учетом соображений об однозначности поверхности и направлении ее нормали, высказанных выше. Возможно, что согласование исходной функции p(t, т) с табл. 3.1 потребует обмена в ней параметров / <-> т так, что образующая станет p0(t) — функцией параметра /, а матрица вращения Ra(t) — параметра т. В этом случае формула расчета нормали (3.12, а) принимает вид N(t,x)= ГФоСО d/ *ш(0 £} Пример 3.1. Построить кинематическую модель верхней полости кругового конуса (см. рис. 1.50,г), заданной функцией (1.132) с параметрами а = с- 1, как поверхности вращения. Решение. Сопоставив координаты x(t, т) = /sin(x), y(t, т) = bt, z(t, т) = fcos(t) с табл. 3.1, заключаем, что вращение образующей p0(t) с элементами yo(t) = Ы, А'о(0 = 0, Zo(0 = I выполняется вокруг оси у с помощью матрицы А(х) = ад. В итоге поверхность конуса формируется следующим образом (рис. 3.11): пряма» линия Ро(f)=[0 Ы t]eyz Ч р.» Щ/ w v W hlb Рис. 3.11
Математические модели поверхностей и объектов 285 вращается вокруг оси у в положительном направлении. Для получения верхней полости конуса высотой Л следует задать интервалы изменения параметров /е[0,Л/£]ите[0, 2л]. Построив в любой точке поверхности векторы cos(x) 0 -sin(x) О 1 О sin(x) 0 cos(x) -sin(x) 0 -cos(x) 0 0 0 cos(x) 0 -sin(x) F(,,x)=M)^(x)=[o b 1] at И^)=Ро(0^=[о bt t] ax [sin(x) b cos(x)], = [/cos(x) 0 -/sin(x)], касательные к поперечной и продольной каркасным линиям, получим вектор нормали N(t,x)=[-btsin(x) t -fc/cos(x)] переменной длины, направленный во внутреннее полупространство конуса. В вершине конуса при / = 0 получим нулевой вектор N(0, т). Нормировка нормали приводит к существующему во всех точках внутренне!/ поверхности конуса вектору 1 ЛГ„ну(/,т)= Л Ъ1+\ r[-fcsin(x) 1 -6cos(x)]. Нормаль внешней поверхности конуса имеет вид 1 ЛГвне(',х)=-ЛГВну(?,т) = I [fcsin(x) -1 bcos(x)].CJ Ьг+\ & Пример 3.2. Построить внешнюю половину трех четвертей эллиптического тора с полуосями образующего эллипса а, Ъ и радиусом направляющей окружности г. Решение. Выберем образующую и направляющую окружности /?0(x)=/X-(-x)=[sin(x) cos(x) 0]еху, pH(t)=rx°Ry{t)=r[cos(t) 0 -sin(f)]e xz , а также интервалы изменения параметров / е [0, Зл / 2] и т е [0, я], обеспечивающие формирование нужной части тора (рис. 3.12). Масштабируя линию р0(х) по осям х и у матрицей М =diag[a Ъ 0] и вращая ее вокруг оси у, получим матрицу преобразования acos(t) 0 -asin(/) A(t)=MRy(t)= 0 Ъ 0 0 0 0
286 Глава 3 />.<'> 4*" • - I t Л f Рис. 3.12 Подставив найденные кинематические элементы в (3.9), получим модель поверхности эллиптического тора p(t,x)=[(asin(x)+r)cos(t) bcos(x) -(osin(x)+/-)sin(/)] V/e[0,3Ji/2l те[0,я]. (313) Возможна и другая последовательность преобразований образующей /?о(т): сначала она масштабируется матрицей М, затем переносится вдоль оси х на расстояние г, наконец, вращается вокруг оси у. Матрица сложного преобразования дает модель /?(/, т) = р0 (x)c(t), в точности совпадающую с (3.13). □ & Пример 3.3. Полоска бумаги длиной / = 2пг и шириной 2Л сворачивается в кольцо и перед склеиванием один из ее концов перекручивается п раз. Получить математическое описание образованной при этом ленты Мебиуса. Решение. Зададим образующий отрезок прямой p0(x) = hvc°ex Vie [-1, I] и последовательность таких преобразований, чтобы за один оборот по направляющей траектории /?„(/) = r[cos{t) О -sin(f)o]e xz V/ е [0, 2л] он повернулся вокруг своего центра на угол /яг: П первое преобразование — вращение вокруг оси z на угол nt 12; П второе преобразование — вращение вокруг оси у на угол /; П третье преобразование — перенос в точку pH{t).
Математические модели поверхностей и объектов 287 nt Подставив в (3.9) матрицу получим модель поверхности ленты Мебиуса A(t)=Rz^RJt) Жл)= ( r + frzco. nt )) cos(f) At sin fnt^ ( r-Jrtcos fnt^ )) sin(/) V/efO. 27iJ tg[-1, lj. На рис. 3.13 построена лента Мебиуса (я) при п - 1 и (б) при и = 6. />.('> V '| рр) -г ТТЛ"; . ^•-,1 П=1 г и=6 s*-**d ч Рис. 3.13 Другая последовательность преобразований образующего отрезка ро(т): сначала он вращается матрицей R:(nt I 2), затем переносится вдоль оси х на расстояние г, наконец, вращается матрицей Ry{t). Матрица полного преобразования с(0=*,(у)ФоК(') дает модель p(t,x)= p0{t)c(t), совпадающую с приведенной выше. □ & Пример 3.4. Построить модель объекта "шапочка с помпоном" (рис. 3.14). Решение. Сформируем направляющую линию, по которой будет двигаться центр образующей фигуры. Ее первый участок (ось шапочки) есть четверть окружности радиуса л; второй участок (ось помпона)— прямая линия длиной 2п (рис. 3.15, а): fr,[cos(/) sin(f) О] npn0<f<7i/2, |[-/-2(l + cos(2/)) г, 0] при 7i/2 </<71. Сконструируем образующую линию из окружности /?0(t)=[cos(t) 0 sin(t)]ejtz,
288 Глава 3 изменяя ее форму и размер следующими параметрическими коэффициентами: П функцией масштабирования ш(т) = 1 + 0.25|sin(4T)|, создающей на поверхности продольные выпуклости; □ функцией радиуса при 0<f<7i/2, п) -/•2sin(2/) прил/2</<71, *н создающей на первом участке коническое от п до 0, а на втором — сферическое от 0 до гг и опять до 0 изменения радиуса поперечного сечения поверхности (рис. 3.15, б). Рис. 3.14 Рис. 3.15 Далее кривая ш(т) r(t) /?о(т) вращается вокруг оси z на угол гпри 0</<я/2, ф(0= п/2 при n/2<t<n
Математические модели поверхностей и объектов 289 (рис. 3.15, б), а затем ее центр переносится в точку pH(t). Совокупность окружности /7о(т), матрицы полного преобразования С(/,т) = ш(т)г(0Я;(ф(0) и интервалов изменения параметров (е[0,л]ите [0, 2л] составляет модель искомой поверхности, которая благодаря своему рельефу выглядит вполне реалистично и без каркасных линий (см. рис. 3.14). □ 3.1.2.2. Линейчатые поверхности и их развертки По типу образующей линии поверхности делятся на линейчатые и нелинейчатые (см. классификацию на рис. 3.1). Линейчатые поверхности формируются движением прямой образующей линии. Развертываемые линейчатые поверхности могут быть разложены на плоскость без разрывов, складок и искажений длин линий и площадей фигур. П Цилиндрическая поверхность образуется движением прямой по направляющей линии/7Н(0 параллельно заданному вектору W(рис. 3.16): />(/,т)=/7„(0+ Wt. (3.14) Рис. 3.16 Условие невырожденности цилиндрической поверхности в линию (оно же есть условие существования нормали) — непараллельность вектора W вектору V{t)=^>, w At касательному к направляющей линии. 3 Коническая поверхность образуется движением прямой, проходящей через неподвижную точку ро и направляющую линию pH(t) (рис. 3.17). Составим два варианта моделей конической поверхности, отличающихся направлением изменения параметра т: p(t, т)=ро + (рн(0 -ро)т,р(1,0) = po,p(t, 1) = МО; (3-15'а) p(t,t) = p„(t) + (po-pH(t))t,p(t,0) = pH(t),p(t, 1)=/70. (3.15,6)
290 Глава 3 Рис. 3.17 Условие невырожденности конической поверхности — непараллельность векторов У(!,-с)=^^т, W{t)=P»(i)-po. At П Торсовая поверхность образуется движением прямой по касательной к направляющей линии рн(1) (рис. 3.18): р('л)=рн(0+^- (3.16) Рис. 3.18 Условие невырожденности торсовой поверхности — непараллельность векторов At At2 At На направляющей линии (при т = 0) эти векторы равны, следовательно, нормаль к поверхности вырождается в нулевой вектор. Если/?н(/) — плоская кривая, то векторы VwWm компланарны, нормаль имеет постоянное направление, а поверхность торса является плоскостью, хотя и не с самой простой кинематической моделью. Если/?н(0 — прямая с нулевой кривизной A2pH{t) At' = Оз. то V(t) - W(t), а торсовая поверхность вырождается в прямую линию.
Математические модели поверхностей и объектов 291 Указание в моделях (3.14)—(3.16) интервалов изменения параметров делает линейчатую поверхность ограниченной линиями g(t) и h(t). Например, при т е [то, т,„] получим g(i)=p(t,To),h(t)=p(t,zJ. Границы могут быть также результатом пересечения образующих прямых с другими поверхностями (точка пересечения прямой с плоскостью находится по (1.102)). В этом случае границы интервала параметра т становятся зависимыми от параметра /: т е [то(0, т,„(0] => g(0 = P(t, МО), КО = Р(1, т,„(0)- Рассмотрим задачу построения развертки линейчатой поверхности— плоской замкнутой фигуры, вырезав которую из листа упругого материала (бумаги, целлулоида, жести и т. п.) и свернув, можно получить исходную поверхность без складок, разрывов и искажений длин линий. В разд. 2.2.5 мы уже строили развертки простейших линейчатых поверхностей — круглых прямых цилиндра и конуса— вместе со спроецированными на них изображениями контуров материков. Аналитические методы развертывания таких поверхностей основаны на преобразовании декартовых координат точки р = [х у z] в криволинейные координаты, соответствующие типу поверхности. П Положение точки на поверхности круглого прямого цилиндра радиуса р описывается в цилиндрической СК ординатой по оси у и углом азимута <р е [0, 2л], отсчитываемым, например, от оси z декартовой СК (см. рис. 1.1,6). Не аффинное преобразование (1.3, а) декартовых координат точки р = [х у г] в цилиндрические координаты рц = [р у <р] устанавливается нелинейными функциями ( _ Л p(/?)=Vx2+z2 , <р(р) = arccos vP4 при х > 0, г \ (3.17) 2я - arccos pMJ при х < 0. Заметим, что декартовы координаты точки х = psin(q>), z = pcos(q>) получаются из цилиндрических за одно аффинное преобразование вращения: [* у z]=[0 у р]лу(Ф). (3.18) Допустим, поверхность круглого прямого цилиндра (3.14) с кинематическими элементами />„(/)= a[sin(0 0 cos(/)] V/ g [to, /„], W=y° ограничена линиями g(i) и /?(/), а отрезки go Ло и g„ h„ лежат на меридианах. На основе точки Ло вычислим по (3.17) радиус цилиндра р и начальный меридиан фо.
292 Глава 3 Расположим плоскость развертывания х'у' касательно к цилиндру по отрезку go Ло с у' (рис. 3.19, а). Так как длина дуги параллели между меридианами фо и Ф равна р- (ф-фо), то развертка точки р = [х у z] с найденным по (3.17) меридианом ф имеет координаты х' = р ■ (ф - фо), у' = у. Для того чтобы развертка была непрерывной вдоль оси л', перед ее вычислением повернем цилиндр вокруг оси у на угол -фо, после чего отрезок go Ло будет иметь угол ф = 0, а остальные точки поверхности — углы азимута в интервале (0,2л]. В итоге мы получили следующий алгоритм развертывания точки р круглого прямого цилиндра на плоскость х'у': я = р(Ло),фо = ф(Ло),;р' = [аф(/Л(,(-фо)) у]. (3.19) Вычислим по этому алгоритму развертки точек граничных линий g, и Л,'. Фигура, заключенная между ними и отрезками g^ и g'nh'n, является разверткой ограниченной цилиндрической поверхности (рис. 3.19, б). У h'o 0 go i ■> ' h\t) ■ • * •■: • . * g'(t) 4* ■ - • v-v "'••■ ../fi о g'n w x' Рис. 3.19 □ Положение точки на поверхности круглого прямого конуса с углом раствора Ц1 е [0, п] описывается в сферической СК расстоянием г до вершины конуса и углом азимута ф е [0, 2л] (см. рис. 1.1,6). Преобразование (1.3, 6) декартовых координат точки р = [х у z] в сферические координаты рк=[г ф \|/] устанавливается нелинейными функциями (3.17) и r(p) = ]p\, v(p) = arccos 'у^ ,лу (3 20) Декартовы координаты точки х = rsin^)sin(v)/), у = /-cos(v)/), z = rcos^)sin(i|y)
Математические модели поверхностей и объектов 293 можно получить из сферических за два преобразования вращения: [х у z]=[0 г 0K(vK,(q>). (3.21) Допустим, поверхность круглого прямого конуса (3.15, а) с кинематическими элементами ро = Оз, /?„(/)= [asin(/) Ъ acos(/)] V/ е [to, t„] ограничена линиями g(t) и h(t), а отрезки go Ло и g„ h„ лежат на меридианах. На основе точки Ло (или go при Ло = Оз) вычислим по (3.20) угол раствора конуса у и начальный меридиан фо. Расположим плоскость развертывания х'у' касательно к конусу по отрезку go Ло с у' (рис. 3.20, а). Дуга параллели между меридианами фо и ф имеет длину rsin(v)(<p-<Po) и развертывается на плоскость х'у' в виде дуги с радиусом г и углом Y = _(9_9o)sin(v), отсчитываемым от оси у'. Для того чтобы развертка была непрерывной в направлении вращения у, перед ее вычислением повернем конус вокруг оси у на угол -фо, после чего отрезок go Ло будет иметь угол ф = 0, а остальные точки поверхности — углы азимута в интервале (0, 2л]. В результате мы получили следующий алгоритм развертывания точки р круглого прямого конуса на плоскость х'у': Фо = фЫ, 5 = ч/feo). Y = -sin(6) ф(рЯ,(-фо)), р = [о \р\]я(у). (3.22) :.t go -'h\0 g\t) V- i g„ Рис. 3.20
294 Глава 3 По этому алгоритму вычислим развертки точек граничных линий g\ и А,'. Фигура, заключенная между ними и отрезками g'0h'0 и g'nh'n, является разверткой ограниченной конической поверхности (рис. 3.20, б). Точное построение развертки произвольной линейчатой поверхности — не круглых или не прямых цилиндров и конусов, а также торсов, — сопряжено с трудоемким исчислением длин дуг кривых линий в криволинейных системах координат. Рассмотрим приближенный и понятный даже ребенку метод развертывания путем отрезания от поверхности узких полосок и укладывания их на плоскости плотно друг к другу. Выполним дискретизацию параметра направляющей линии: t = th i = \,n. В результате гладкие граничные линии заменяются кусочно-линейными аппроксимациями с узлами gj = g(t,) и hj- h(t,), а поверхность— последовательностью п соединенных друг с другом четырехугольных полосок g,g1+1 hl+l Л, (рис. 3.21,«). При вырождении какой-либо ограничивающей линии в точку (например, вершины конуса) полоски будут треугольными. Увеличение числа п приближает полигональную аппроксимацию развертки к истинной криволинейной. Сформируем (2л + 3) х 3-матрицу S, в строках которой будем сохранять векторы sk е R3 Ук = 0,2п + 2 разверток узлов в следующем порядке: go -> g\ -> ... -> g„ -> hn -> ... ho -> go. Начнем строить развертку на плоскости х'у' с фиксации точек so = S2K+2 = Оз, s2„+1 = \h0 - g0\y° e у . Рис. 3.21 Последовательно при каждом / = 0, п - \ отрезая от поверхности и укладывая на плоскость развертки очередной полигон {g,g,+l /?,+, «,£,}, совмещаем пары точек {gh Sj) и {hh S2n+]i}, а точку gi+] — с плоскостью х'у' (рис. 3.21, б). Расчет матрицы такого преобразования методом парных точек (2.13) требует две четверки не-
Математические модели поверхностей и объектов 295 компланарных точек образа и прообраза. Две пары точек {gh И,) и {sh «„+,-,} уже известны. Построим векторы нормалей и бинормалей, на концах которых получим еще по две пары точек: Nt = (g,+i -g,)x(А,- -gi\ bt = (ht -gi)xN„ Hi = \N,\z° 1 x'y', p, = (*2„+1_, -Si)xH,e x'y'. Вычислим матрицу присоединения /-ой полоски поверхности к ребру s,S2„+]-j построенной части развертки: Q = а hi gi+Ni gi+bj Г ] ] 1 -I s2n+\-i 5,+Н, *,-+Р,- 1 (3.24) Это позволяет дополнить строки матрицы S двумя точками si+j и S2„~j — развертками точек gl+1 и /?,+,: S/+1 = g,+\C„ ?2/i-i = hi+xCiOf . (3-25) По окончании отрезания и укладывания полосок первые два столбца матрицы S содержат абсциссы х\ и ординаты у\ вершин полигона развертки, третий же столбец аппликат z\ остается нулевым. Источниками погрешностей изложенного алгоритма развертывания являются: П конечное число полосок л, на которые разрезается линейчатая поверхность; П проективный метод получения точки «в+1-, с координатой ^2«+l-/ = ^ ■ Если /-ой полигон поверхности {g,gi+l hi+, hjgj) не планарный, то после фиксации трех точек gh ht и gi+l четвертая точка hi+] останется вне плоскости х'у'. Ортогональное проецирование в (3.25) искажает размеры и форму i-ro полигона развертки. Последовательное накопление искажений приводит к тому, что построенная развертка является не точной, а приближенной. Таким образом, алгоритм приближенного построения развертки линейчатой ограниченной поверхности на плоскости имеет следующий вид. & Шаг 1. Вычисляются концы go и ho начального положения образующего отрезка и соответствующие им точки развертки so = sin+1 = Оз и Sin+\ = го ~go\y°- Шаг 2. В цикле / = 0, п -1 вычисляются: П концы образующего отрезка^, и й/+1; П по (3.23) нормали Nh Н, и бинормали £>,, р,; П по (3.24) матрица преобразования С,; П по (3.25) точки развертки si+] и sin_r Шаг 3. Вывод ребер развертки функцией Uriels^, sk+l) VA: = 0,2n +1. □
296 Глава 3 Условия работоспособности алгоритма есть условия существования нормалей Nt и бинормалей Ь( в (3.23): П узлы ограничивающих линий h(t) и g(t) не должны совпадать во избежание равенства gt = Л,-; П линия g(t) не должна быть вырожденной в точку во избежание равенства 8i~8i+i- Для развертывания конусной поверхности от точки ро до направляющей линииpH(t) нужно выбрать/?(;) = pH(t) и h(t) -ро. & Пример 3.5. Получить модель и построить развертку боковой поверхности усеченного эллиптического конуса (рис. 3.22, а), заданного точкой Ро = [2 4 2J, направляющим эллипсом нижнего основания в плоскости xz с полуосями я= 1, Ь= 2 и секущей плоскостью верхнего основания, проходящей через точку рп = [0 2 о] перпендикулярно оси эллипса. Решение. Примем уравнение эллипса нижнего основания конуса g(t)=[asii\{t) 0 bcos(t)] Vt е [0, 2л] с таким расчетом, чтобы начало развертки приходилось на образующую линию между точками ро и [0 0 b]. Найдем нижнюю границу интервала параметра т и уравнение верхней границы h(t) путем решения задачи (1.102, о) пересечения образующей линии ро + (g(t) -po)i поверхности (3.15, а) с плоскостью, описываемой уравнением Nn°p = Nn°pnc нормалью TVn =ро: ро°(роН8(')-роУ>ро°р^ч(<)=Ро°^:Ро\=п .,;, ,у Ро°т)-Ро) 12-sin(f)-2cos(0 h(t)=po + {g(.t)-po)i„(t). Рис. 3.22
Математические модели поверхностей и объектов 297 Таким образом, боковая поверхность усеченного конуса описывается векторной функцией с зависимыми интервалами параметров: p(f,T)=[l + (0.5sin(/)-l)c 2(1-т) l + (cos(/)-l)c] 8 V/e[o, 2л], те 12-sin(r)-2cos(/) , 1 На рис. 3.22. б по алгоритму (3.23) - (3.25) построена развертка усеченного конуса. □ & Пример 3.6. Получить уравнения и построить развертку торсовой поверхности, образованной движением отрезка длиной / = 3 по касательной к первому витку цилиндрической винтовой линии с радиусом г = 1 и шагом d - 1.5 (рис. 3.23, а). Решение. Направляющая винтовая линия описывается параметрической функцией Рн(>) = rsin(r) — rcos(t) w 2л w V/ е [0, 2л]. Необходимый в уравнении (3.16) вектор производной Фн('). rcosfn — -rs\n(t) w 2л w имеет независимую от параметра t длину Фн(') At = Vr2+62, где 6 = —. 2л Это дает постоянные границы интервала изменения параметра т в модели торсовой поверхности: p(t,x)=[r(sir\(t)+xcos(t)) б(г + т) r(cos(/r)-xsin(f))] / V/e[0,2n], tg[0,tJ, xh лРТо1 = 2.92. i i-2 j 0 j-Л^. l? .-2-4— fV* '±L* --2-] m. j ...—-L^w~: h\ Д -\--f"\ x' Рис. 3.23
298 Глава 3 Данная поверхность имеет постоянный угол Л наклона нормали к горизонтальной плоскости во всех точках: ^(/,T) = Mil)xMil) = /-T[6cos(,) _, -6sin(/)], N г sin(A)=-j-4 = —, = -0.97 => X = -76.6°. Свойство равнонаклонности торсовой поверхности используется при сооружении поворотов на скоростных автодорогах, велотреках, водостоках и т. п. Приняв g{t)=pn(t) и h(t)=p(t,i,), строим развертку торсовой поверхности (рис. 3.23, б). Вырезав ее по всему контуру и подняв за левый верхний угол на высоту d- 1.5, получим исходную торсовую поверхность. □ Косые (неразвертываемые) линейчатые поверхности согласно классификации, приведенной на рис. 3.1, образуются при движении прямой по двум или трем направляющим линиям. В случае двух направляющих образующие прямые должны удовлетворять одному дополнительному условию. Например, они должны быть ориентированы под определенным углом к некоторой плоскости П. В зависимости от вида направляющих косые поверхности делятся на: П цилиндроиды, у которых обе направляющие кривые; П коноиды с кривой и прямой направляющими; П косые плоскости с двумя прямыми направляющими. Методика получения модели косой поверхности с двумя направляющими g(t), h(t) и образующими, параллельными плоскости H(V, W) (рис. 3.24), следующая. 1. Фиксируем параметр t и точку на линии g(t). 2. Через точку g(t) проводим плоскость g(t) + Vtf, + W\n параллельно плоскости П. 3. Находим параметр ;„ и точку h(t,) пересечения этой плоскости со второй направляющей: g(t) + Vtn + Wvn = /7(/,,) => ф) => h(th(t)). (3.26) 4. Составляем модель косой поверхности: PC, т) = g(t) + (/)(/,,(0) - g(')h- (3-27) Рис. 3.24
Математические модели поверхностей и объектов 299 Требования к направляющим линиям g(t) и h(l): 3 плоские направляющие не должны быть компланарны или параллельны плоскости П, иначе уравнение (3.26) либо не имеет решений, либо имеет их бесконечное множество; П направляющие не должны пересекаться, иначе в (3.27) при h(t,,(t)) = g(t) функция p(t, т) не будет иметь две степени свободы. & Припер 3.7. Получить модель цилиндроида, образованного движением концов отрезка с постоянным фазовым сдвигом <р по двум направляющим окружностям радиусами г\ и гг, расположенным соосно в горизонтальных параллельных плоскостях на расстоянии d (рис. 3.25, а). Решение. Запишем уравнения направляющих окружностей с учетом фазового сдвига вращения концов образующего отрезка: g(t) = i)[cos(t) 0 sin(0], h(t)= r2[cos(t + у) d sin(f + <p)]. Модель искомой поверхности между направляющими линиями имеет вид >Ы=*г(г)+(А(г)-*К0)т = = [r2 cos(r + ф)г + /j cos(/)(l - т) dz r2 sin(/ + ф)г + ^ sin(/)(l - т)] V/e [О, 2л], те [о, |]. Условие постоянного фазового сдвига равносильно условию постоянного угпа X между образующими прямыми и плоскостью xz: Рис. 3.25 Например, при ф * 0 и ф ф я изучаемая линейчатая поверхность одновременно является квадратичной поверхностью однополостного гиперболоида (см. рис. 1.50, в).
300 Глава 3 При ф * 0 получим боковую поверхность усеченного конуса (рис. 3.25, 6) с углом наклона образующих прямых d sin w= ^2+(n-r2f При r\ — n это поверхность цилиндра. Наконец, при <р = п все образующие прямые имеют общую точку О dn П+г2 О и образуют поверхность двуполостного конуса (см. рис. 1.50, г). Рис. 3.26 Метод формирования криволинейной поверхности из отрезков прямых имеет практическое применение при разработке очень прочных, но легких, ажурных и красивых конструкций башен, телевышек, опор и т. п. На рис. 3.26 построена четырехступенчатая модель известной "башни Шухова". Каждая следующая ступень строится преобразованиями масштабирования и переноса предыдущей ступени. □ & Пример 3.8. Получить модель поверхности винтового коноида, образованной при горизонтальном движении отрезка прямой по оси у и N виткам цилиндрической винтовой линии с радиусом г и шагом ^(рис. 3.27). Решение. Зададим уравнения направляющих линий g(t) = [rsm(t) 67 rcostf)], Л(0 = [0 / О],
Математические модели поверхностей и объектов 301 где 5 = dl 2я, а также направляющие векторы горизонтальной плоскости V = х° и W = z°. Подставив эти исходные данные в (3.26), получим векторное уравнение [rsir\(t) + tn 67 a-cos(0 + T/7]=[o th О], из которого следует /„(/) = Ы и модель поверхности винтового коноида (3.27): р(/,т)= [/-(l-x)sin(r) 8t r(\ -x)cos(0] v' e [°, 2nN]>T e [°, ']• Рис. 3.27 Практическое применение данная поверхность находит в конструкциях различных винтовых движителей, перемещающих материалы (снег, песок, вязкие жидкости, воду, мясо) и несущие их транспортные средства (снегоходы) вдоль оси винта. О & Пример 3.9. Получить модель поверхности косой плоскости, образованной скольжением прямой образующей по скрещивающимся прямым направляющим линиям: первая линия проходит через точки /4 = [о 0 |]и В = [-1 1 о], вторая— через точки С = [о 0 -l] и D = [l 1 0]. Во время движения образующая должна быть параллельна плоскости с направляющими векторами V = [О 1 О] и W = [-1 0 l] (рис. 3.28). Решение. Подставив в (3.26) уравнения направляющих прямых g(t)=A + {B-A)t = [-t t \-t], h(t)=C + (D-C)t = [t t t~\\, получим векторное уравнение [-t-%n t + tn l-t + xn]=[th th th-\], (3.29)
302 Глава 5 из которого следуют зависимость '„(О = 1 - ' и модель косой плоскости (3.27): p(t,t)=[x-t t + x-2n l-f-т]. (3.30) Рис. 3.28 Уточним характер движения образующей прямой по направляющим отрезкам АВ и CD. Подставив в (3.30) т = 0 и т = 1, получим с учетом (3.28) p(t,0)=g(t), p{t,l)=[\-t \-t -t\=h{\-t). Это означает, что образующая движется по направлению g(t) и против направления h(t). В частности, при l - 0 она проходит через точки А и D, а при t = 1 — через В и С, оставаясь все время параллельной плоскости {V,W]. Выразив из координатных функций x{t,i) = т - t,y{t,t) = t + т - 2/т, z(M) = \-t-x параметры t = 0.5(1 -x-z) и т = 0.5(1 + x-z), получим неявное уравнение косой плоскости х2 - z2 - 2у + 1 =0 — поверхности второго порядка со следующег матрицей (1.124) и инвариантами 1\ ■* /»: 10 0 0" 0 0 0 0 0 -1 0 -1 0 -1 0 1 ,/| = 0,/2 = 1 0 0 0 + 0 0 0 -1 + -1 0 0 1 =-1, h = 1 0 0 0 0 0 0 0 -1 = 0, h = 1 > 0.
Математические модели поверхностей и объектов 303 По классификации табл. 1.3 это гиперболический параболоид. Его сечения координатными плоскостями следующие (рис. 3.29, а): П х = 0 => у = 0.5(1 - z2) — парабола (7) в плоскости yz\ П y = 0=$x2 = z2-\ — гипербола (2) в плоскости xz; П z = 0 => у = 0.5(1 + х2) — парабола (3) в плоскости ху. Что касается названия поверхности, то оно объясняется просто. Возьмем плоский квадратный лист бумаги ABCD за противоположные края и повернем их в разные стороны, воспроизводя преобразование кручения (см. рис. 2.7, а). Скрученная из плоскости фигура получила название "косая плоскость". Поверхность (3.30) получена по (3.27) как линейная интерполяция между направляющими g(t) и h(\ - t). Однако, если строить ее без учета условия параллельности образующей линии плоскости {V, W], то при образующих прямых (3.28) получим косую плоскость p{t,x)=g{f){\~T)+h{f)x = \t{2x-\) t (г-1)(2т-1)]. (3-31) 3.29 Это тоже гиперболический параболоид, имеющий в отличие от (3.30) иную ориентацию в пространстве. Как видно из рис. 3.29, б, при построении поверхности (3.31) образующая линия все равно остается всегда параллельной, но теперь уже к плоскости xz. СЗ В зависимости от вида трех направляющих, которые не должны друг с другом попарно пересекаться, среди косых поверхностей выделяются: П однополостные гиперболоиды, у которых все направляющие — прямые; П косые цилиндры с двумя прямыми и третьей кривой направляющими; П конусоиды, имеющие две кривые направляющие и одну прямую. Рис.
304 Глава 3 Методика получения уравнения p(t, т) косой поверхности с тремя направляющими g(t), h{t) и u(t) (рис. 3.30) имеет следующий вид. 1. Фиксируем параметр t и точку на линии g(t). Рис. 3.30 2. По (3.15, а) строим конусы на направляющих h(i) и u(t) с общей вершиной g(t): \ h{th, ih ) = g(t) + (h(th )- g(t))zh, I "('«,T») = g(f)+ («(f« )- gftfr» ■ 3. Находим прямую пересечения этих конусов, которая является образующей косой поверхности: (Kh) -g(t))t„ = (iKQ-g(t))T„ =>kh(t,)-u(tj = (k- l)g(t), (3.32) где к-ih I т„. Решая векторное уравнение (3.32) относительно переменных k(t), t,,{i) и /„(О, получим модель искомой поверхности в любой из двух форм: P(t^)=g(t) + (h(t„(t))-g(t))x, P(t, т) = g(t) + (и(ф)) - git))x. (333) & Пример 3.10. Классифицировать и построить модель поверхности, образованной движением прямой линии по трем скрещивающимся прямым направляющим g{t) = [l t О], h(t)=[0 1 /], u(t)=[t 0 l] (рис. 3.31). Решение. Уравнение (3.32) имеет вид [-*„ к kth-\\=[k-\ {k-\)t о], откуда находим и параметрические функции поверхности: x{t,z)=\ + ~-,y(t, т) = г(1 - т), z(t, т) = т. (3.34)
Математические модели поверхностей и объектов 305 Рис. 3.31 Исключив параметры t = - \-z ,t = z, получим неявное координатное уравнение ху + xz + yz - х - у - z + I = 0. Эта поверхность второго порядка имеет следующие матрицу (l. 124) и инварианты: О 1 I -1~ 0 I 1 I 0 -I -1 -1 2 , /, = 0, h = -3, h = 2 * 0, h = 1 > 0. (3.35) По классификации табл. 1.3 получили однополостный гиперболоид. \нализируя координатную функцию x(t, т) в (3.34), приходим к выводу, что она имеет разрыв при t = I. Следовательно, построение непрерывной поверхности по модели (3.34) возможно в два приема. На рис. 3.31 приведена лишь часть поверхности в интервале изменения параметра t е [-10,0.99]. Другая часть при : е [1.01, 12] построена на рис. 3.32, а. В обоих случаях интервал изменения второго параметра т е [-5, 5]. Каждое из этих двух изображений в диметрическои проекции мало похоже на однополостный гиперболоид из-за неудачного сочетания его ориентации в пространстве и выбранного ракурса. Совместное изображение двух поверхностей в произвольной триметрической проекции (рис. 3.32, б) убеждает в том, что это именно однополостный гиперболоид, аналогичный изображенному на рис. 1.50, б. На его поверхности есть две линии разрыва, незаметные благодаря специально подобранному ракурсу. Одна из них соответствует неопределенности поверхности при t = I, другая получается из-за конечных пределов интервала параметра t вместо теоретически бесконечных пределов. □
306 Глава 5 Рис. 3.32 & Пример 3.11. Получить модель поверхности усеченного конусоида, основаниями которого являются окружность радиуса г и квадрат а ха,а высота равна </(рис. 3.33). Рис. 3.33 Решение. В силу симметрии объекта построим модель p°(t, т) поверхности его передней грани, образованной движением прямой по следующим направляющим: П четверти дуги окружности g{t) = r[cos(t) О sin(/)] V/е [0, 2я];
Математические модели поверхностей и объектов 307 3 отрезку прямой линии между точками [q d OJ и [О d q] при q = a/v2 : h{t)=[q{\-t) d qt] V/ e [0, 1]; П прямой и(/)=[о t OJ || >°. Составив уравнение (3.32) [kq(\-th) kd-tu kqth]=[(k-l)rcos{t) 0 (k -l)rsin(t)], определим th(f)=- sin(/) sin(/) + cos(/) .i первую в (3.33) модель передней грани: >°ы= л \ / \ axcoslt) . . \ ■ I \ axsin(t) HI-t)cosU)+ т—^—т di r(l-T)sin(n+ -. Ц-^ ' w 2sin(/ + 7i/4) v ' w 2sin(/ + 7i/4) Поверхности остальных трех граней конусоида получаются с помощью вращения поверхности p°(i, т) вокруг оси у: р'(1,г) = р°(1,г)Ку{-п/2) Vi = l3,ts [0,я/2],т е [0, I]. □ 3.1.2.3. Нелинейчатые поверхности Нелинейчатые поверхности формируются по формуле (3.9) только кривыми образующими po(i), которые в процессе движения вдоль направляющей pH{i) могут трансформироваться матрицей A(t, т), что дает большое разнообразие поверхно- ггей. В частности, циклическая поверхность создается движением окружности или ее дуги (см. рис. 3.8). Если плоскость образующей окружности постоянно поддерживается ортогональной направляющей кривой, т. е. нормаль к плоскости лараллельна направляющему вектору v{t)= p'„(f), то такая циклическая поверхность называется каналовой. Толщина канала определяется функцией изменения радиуса образующей окружности r{t), входящей сомножителем в состав матрицы A(t, т). Поверхность канала постоянного радиуса г называется трубчатой. Рассмотрим вычислительные аспекты построения каналовой поверхности. Прежде всего необходимо задать кинематические элементы модели (3.9). В целях унификации в большинстве задач будем использовать образующую окружность единичного радиуса с нормалью z° и центром в начале координат: p0(x)=cos(T)x0+sin(T)>'0 = [cos(t) sin(r) OJexy. (3.36) Эднако для исключения дополнительных вращений на углы ±90° иногда более лелесообразным может оказаться выбор окружности /?0(т)=cos(t)j° +sin(r)z0 е yz
308 Глава 3 с нормалью х° или Ро(х)= cos(t)z° + sin(r)r0 е xz с нормалью у0. Задание интервала изменения параметра т, имеющего геометрический смысл угла дуги окружности, определяет степень замкнутости каналовой поверхности. При т е [0, 2я] получим замкнутый канал. Выбор меньшего интервала позволяет построить разрез поверхности вдоль меридианов и увидеть ее изнутри (см. рис. 3.8). Важным элементом модели каналовой поверхности является скалярная функция r(t) изменения радиуса окружности поперечного сечения канала вдоль направляющей траектории. Аналитическое представление этой зависимости конкретной формулой во многих отношениях предпочтительнее. Его преимущества — это точность, компактность записи, простота вычисления при любых допустимых значениях параметра, возможность аналитического, т. е. точного, дифференцирования. К сожалению, это представление возможно лишь в самых простых случаях (рис. 3.34). Например, у трубчатой поверхности (1) r(t) = го, канал конусного типа (2) получим при r(t) = /•& + r\t, а чуть более сложный гофрированный канал может быть сформирован равномерным переносом окружности переменного радиуса r(i) - ro + nsin(at) (3) или /■(/) = го + ri|sin((or)| (4)- Рис. 3.34 Аналитическая форма функции часто бывает чрезмерно сложной в записи, вычислении и дифференцировании. Выгоднее становится задание и + 1 узловых точек {/,,/",} Vi' = 0, п и восстановление аналитической зависимости /•(/) в классе функций, сочетающем хорошее приближение к узлам и малые межузловые уклонения с небольшим числом варьируемых параметров и простотой вычислений К таким функциям относятся степенные, полиномиальные и кусочно-полиномиальные (сплайновые), экспоненциальные и гармонические. В вычислительной математике разработано много интерполяционных и приближающих формул [13]. Наиболее востребованы методы полиномиальной интерполяции и приближения Лагранжа и наименьших квадратов. Напомним кратко их суть. П Интерполяционный полином Лагранжа и его производная ,=о j-o'i-'j i=Q J=o1' 4 *=o '< f* j*i j*i k*i, k*j
Математические модели поверхностей и объектов 309 не нуждаются в каких-либо дополнительных, кроме узлов и параметра /, данных, т.е. являются формулами прямого действия. Недостаток метода — сложность программирования и малое быстродействие интерполирования в реальном времени. 3 Интерполяционный МНК-полином и его производная К')= 5>,". ''(')=5>/ (3.38) требуют предварительного расчета вектора коэффициентов полинома С = 1С0 с1 ■•■ сп \ с помощью матрицы Вандермонда W — [w,7] и вектора узлов U = [r0 г, ... г„\. Wy=tj V i = 0,n,j-0,n =>с- U- W~[. (3.39) Необходимость обращения (и + 1)х(л+ 1)-матрицы W компенсируется малой трудоемкостью интерполирования по формулам (3.38). 3 Аппроксимационный МНК-полином и его производная т т '(0=2V. ''(')= 5>,'м (3.40) i=0 /=1 отличаются от интерполяционных полиномов (3.37) и (3.38) способностью сглаживать погрешности узловых данных за счет степени т < п. Вектор с~[с0 ci — ст\ находится с помощью матрицы Грома G- 0»,у] и вектора узлов £/ = 1м0 щ ... ит\: п п Sij = 5Х+7 V i = 0. «, у = 0. и, щ = £/£/> v' = 0. т => с = U ■ GK (3.41) *=0 *=0 При т-п векторы с в (3.39) и (3.41) совпадают. Аппроксимация полиномами степени т, меньшей числа интервалов п, используется для устранения межузловых осцилляции, которыми грешат интерполяционные полиномы высоких степеней при большом числе узлов. Следующий важный элемент кинематической модели в целом и каналовои поверхности в частности — направляющая линия pH(t) движения центра образующей. Она должна быть гладкой, т. е. непрерывно дифференцируемой по t, иначе з точках излома или разрыва вектор направления V(t) - upH{i) I ut будет не определен. Второе интуитивно понятное требование к направляющей состоит в том, чтобы при каждом значении г радиус ее кривизны [13, 29] „b)__t«L
310 Глава 3 был не меньше радиуса образующей окружности /■(/). В противном случае образующие точки с вогнутой стороны направляющей линии будут совершать попятное движение, а поверхность p(t, т) окажется не гладкой, а смятой. Как и в случае скалярной функции радиуса, применяется аналитическое и узловое задание векторной функции pH(t). Преимущества первого метода описань выше. Однако очень часто выражения координатных функций линии рМ), дающих ей желаемое расположение в пространстве, либо слишком громоздки, либо их получение превращается в непосильную задачу. Тогда становится целесообразным применение численных методов восстановления направляющей линии пс конечному числу узлов pHj V/ = 0, я. Полиномиальное приближение векторной функции pH(t) е R3 выполняется пс алгоритмам (3.37)—(3.41) индивидуально для каждой координаты лн(0, ,1'н(/) v zH(t). Интерполяционные методы обеспечивают точное прохождение направляющей кривой через заданные в пространстве узлы, но при большом числе узлов возможны большие межузловые осцилляции решения. Аппроксимация пс МНК целесообразна для понижения степени векторного полинома и уменьшени* осцилляции за счет появления ошибок сглаживания. Направляющая траектория может быть неплоской и неаналитической, может не иметь ни одного прямолинейного или постоянной кривизны участка, т. е. може~ представлять собой произвольную кривую. Для отслеживания ее направлени» необходим вектор производной V(t)= р'н(1)- Его можно получить дифференцированием координатных функций Ан(0, J'h(') и zH(t) либо аналитически, в tow числе по (3.37), (3.38) и (3.40), либо численно, например, по трехточечным формулам [13] для схем с равноотстоящими узлами при ^,+, - f, = At: у _~3РнО+4Рн1-А|2 у _ Рш+1~Р,„-\ у = ЗРнп - 4Рня-1 + Рня-2 (3 4: 0 2М ' ' 2Д/ ' " 2Д/ Наибольшую сложность при синтезе каналовой поверхности представляет расче- матриц преобразований A(t) или C(t), обеспечивающих ортогональность плоское- образующей окружности р0(т) r{t) A(t) вектору V(t), касательному к кривой р„{: движения центра окружности. Конечно, если эта кривая полностью аналитически определена и состоит из простейших участков (отрезков прямых или дуг окружностей с известными радиусами и координатами центров), то можно и без знани! касательного вектора нужным образом сориентировать образующую окружность в начале координат, изменить ее радиус согласно зависимости r(t) и перенеси центр в точку рн(1). Именно такой подход к формированию кинематических поверхностей был применен при решении примеров 3.2—3.4. Здесь читателю рекомендуется освежить в памяти подходы (рекуррентный и итеративный на рис. 2.28) и методы (два варианта разложения на рис. 2.30, 2.31 парных точек на рис. 2.32) решения кинематической задачи, подробнейшим ос- разом рассмотренные в разд. 2.1.3.3. Анализируя представленные алгоритмы ж результаты их моделирования (см. рис. 2.34), заключаем, что расчет матриц ас- финных преобразований следует выполнять по экономичным рекуррентным алг -
Математические модели поверхностей и объектов 311 ритмам (2.53) и (2.54), из которых предпочтительнее второй вариант, основанный на методе парных точек. Обобщая изложенное, сформулируем рекуррентный алгоритм построения сечений каналовой поверхности p(th т) V/ = 0, и при заданной в (3.16) образующей окружности р<>(т) е ху, функции изменения радиуса r(t) и произвольной направляющей кривой pH(t) с касательным вектором ^(0: С0 = МАР2(р3, z°, pH(t0), r(t0)v{t0)) => p(t0,z) = p0(z)C0 , i - — x (3.43) С,=МАР2\рн^\ r{ti)v{ti), p„{tM\ r(f,-+1)K(f/+1)J=> ^Ж.т)=Ж^.т)С,- Работоспособность алгоритма иллюстрируется на рис. 3.35, а, где построен каркас трубчатой поверхности с радиусом трубки г = 0.3 и направляющей траекторией [-1 sin(/) cos(f)]v 0</<7i, [cos(/) sin(/) -]]V n<t<2n, [l sin(r) -cos(f)]V 27i</<37T, [-COs(/) Sin(f) l]\/ 371</<471 Pjf)=- v(t)= : производной — вектором направления [О cos(/) - sin (t)1 V 0 < t < 7i, [-Sin(f) COs(f) 0]V 71</<27t, [0 cos(/) sin(r)] V27t</<37t, [sin(f) cos(/) O] V37i</<47i. Осевая линияp„(t) интересна тем, что на ней есть восемь точек, где вектор V(f) становится параллельным одной из координатных осей, и в их окрестностях возможно скручивание поверхности, построенной по неэкономичному алгоритму. Не трудно убедиться, что алгоритм (3.43) строит каналовую поверхность верно. Итеративный алгоритм, основанный на методе парных точек С(/) = МАР2(о3,z°,p„ {t\ r{t)v(t)) ^ p(t,z) = p0(z)c(t), (3.44) позволяет получить сечение каналовой поверхности при любом значении параметра t экономичным преобразованием примитива />о(т) из начала координат в точку pn{t). Однако переходы между соседними сечениями не являются экономичными, что подтверждается скручиванием продольных линий поверхности на рис. 3.35, б и делает алгоритм (3.44) не самым лучшим для построения каналовых поверхностей. Наконец, худший алгоритм построения каналовой поверхности — итеративный зариант неэкономичного метода разложения (2.49) с матрицей сложного АП A(t), вычисляемой по (2.30), (2.31): т = А~х (F(r)) =>/>(г, т) = r(t) /40 A(t) + pH(t). (3.45)
312 Глава с Рис. 3.35 Методические ошибки алгоритма очевидны (рис. 3.35, в). Перекручивание соседних сечений на угол вплоть до 180° происходит на тех участках, где К(0 « 0, а функция Vx(t) меняет знак. При этом вычисляемый по (2.31) угол а скачком изменяется с ±90° на +90° при почти неизменном угле р к ±90°. Матрица сложного АП обратная к матрице (2.30), выполняет вращение почти горизонтальной окружности р0{х) ЛЛ(-Р) вокруг оси у на угол а последним — отсюда понятна причина перекручивания поверхности на вертикальных участках. Тем не менее, мы будеу использовать алгоритм (3.45) для получения аналитических моделей каналовых поверхностей. & Пример 3.12. Из проволоки длиной / = 100 и радиусом г = I изготовлена пр\- жина путем навивки с шагом h = 6 на боковую поверхность цилиндра радиусо« ги - 3 (рис. 3.36, а). Затем пружина была поставлена вертикально на плоскость и под действием собственного веса и упругости сжалась так, что два нижних витк- соприкоснулись (рис. 3.36, б). Построить модели и изображения поверхностей свободной и сжатой пружин. Решение. Выберем образующую окружность (3.36), а направляющую кривую свободной пружины в виде цилиндрической винтовой линии с равномерным шагом h и числом витков пв=—. =3.87: ^4n2{ru+rf+h2 />«(')= Ik +'М') *св' {rn+r)cos(t)]vte[0,2iwB]. (3.46» Благодаря постоянному коэффициенту наклона Агсв = h I In = 0.955 ординаты направляющей ^св(0 = k^t (график 1 на рис. 3.37) касательный вектор ^('Hta+'MO kCB -(ru+r)sin(f)] (3.47 >
Математические модели поверхностей и объектов 313 всюду составляет с плоскостью xz равный угол PCB=arctg "-ев rn+r = 13.43°. lr 2г.. v4 $* ы .Л IlLfr^> i> .:. т Рис. 3.36 Рис. 3.37 Построение изображения трубчатой поверхности свободной пружины на рис. 3.36, а выполнено по алгоритму (3.43). Так как направление винтовой линии (3.46) нигде не приближается к вертикальному, то получение аналитической модели поверхности свободной пру-
314 Глава 2 жины возможно по формуле (3.45). Подставив в нее кинематические элементь /?о(т),/?св(0, Ав(0 = Ду(-Рсв) Ry(t + л / 2) и выполнив необходимые преобразования, получим координатные функции поверхности: x(t,x) = (ru +r-rcos(x))sin(t)- (hnBr/l)cos(t)sin(x), y(t, х) = (2л«в (гц + r)r//)sin(x)+ ht/2n, z(/,t)= (гц + г - г cos(x))cos(t)+ (hnBr/l)s'm(t)sin(x), Усе [О, 2тшв],те [о, 2л] (3.4S У сжатой пружины (рис. 3.36,6) каждый виток нагружен весом лежащих выше него витков. Не углубляясь в дебри теоретической механики, будем считать, чтс направляющая кривая р<ж(() имеет ординату )'сж(1) с линейно возрастающим наклоном &сж(0 = at+b (график 2 на рис. 3.37): pc>K(/)=[(ru+r)sin(f) 0.5at2+bt + c (гц +r)cos(/)J. (3.4^) Касательный вектор Vcx(t) также увеличивает угол своего наклона рсж(0 с ростом с. Га, + Ь^ Рсж(0=1&ц+',)СО8(/) at + b -fa + 'Osinfr)], Зсж (0 = arctg Подставив в алгоритм (3.45) кинематические элементы р0(х),рак(1) и /МО = ДЛ.(-Рсж) Ry(t + п/2), получим координатные функции поверхности сжатой пружины: r(at + b) (3.5( » *сж('>т) = fa +r -rcos(r))sin(/)- Jfa+rf+iat + bf s\n(x)+0.5at2 +bt + c, ■cosi .(г)ап(т) (rU+r) „:„^,л<„,2 гсж(г,т)= (rlx+r-rcos(x))cos(t)+ . ^ ' =sin(r)sin(t), (3.51) ^е[0,2ялсж], те[о,2л] yji^+rf+iac + bf Для практического построения этой поверхности необходимо определить неизвестные величины а, Ь, с и Нсж. Не учитывая достаточно сложной зависимости числа витков пружины от степени ее сжатия (в действительности оно немного
Математические модели поверхностей и объектов 315 увеличивается при сжатии) и полагая исж = Ив, запишем исходные требования к сжатой пружине в виде трех соотношений относительно неизвестных a,b и с: "3 верхний конец сжатой пружины ненагружен, следовательно, он имеет значение наклона /Сеж (2лив) как у свободной ПруЖИНЫ лев- и 2nnBa +Ь = 2л (3.52) 3 начальная ордината направляющей vo = ^сж(О) с учетом упора сжатой пружины о плоскость XI и наклона ее нижнего торца на угол Ро равна rcos(Po) (рис. 3.38): г(гц+г) (3.53) с = v^-F + bA Рис. 3.38 □ ордината направляющей у\ - усж(2т() в конце первого витка, касающегося своего начала с углом наклона Pi > Ро, равна Уо + cos(P0) cos(Pi)' 4л a + 2nb = - д/(гц + г)2 + Ъ1 + д/(гц + г)2+ (2ла + b): (3.54) Численное решение системы уравнений (3.52)—(3.54) при /= 100, г— 1, ru = 3 и И = 6 дало значения коэффициентов а = 0.03, Ь = 0.224, с = 0.998 и изображение сжатой пружины на рис. 3.36, б. СЗ & Пример 3.13. Построить поверхность топологического объекта, называемого "бутылка Клейна" (рис. 3.39, а). Эта объемная фигура интересна тем, что ее корпус плавно переходит в ручку, которая, входя в корпус у горлышка, внутри соединяется с ним, образуя замкнутую одностороннюю поверхность (рис. 3.39, б).
316 Глава 3 Удалив фрагмент корпуса в месте входа в него ручки, можно показывать фокус: налитая вода при наклоне бутылки не выливается, а скапливается внутри у горлышка. ;s!K Рис. 3.39 Решение. Построение весьма замысловатой поверхности бутылки Клейна — хорошая иллюстрация богатых возможностей, гибкости, но и капризной непредсказуемости метода параметрической интерполяции (3.38), (3.39). Именно отсутствие простых аналитических выражений координат направляющей линии pH(i) и функции изменения радиуса r(t) вынуждает строить их как интерполяционные кривые. Расположим на плоскости ху десять узловых точек рт,= [xHi vH/ о] V/ = 0,9 направляющей pH{t) в наиболее характерных местах изменения направления и толщины канала (рис. 3.40, а). В каждом узле рн, зададим радиус г, образующей окружности, переносимой ортогонально направляющей линии. Для изображения поверхности каркасом с равномерной плотностью поперечных сечений зададим приращения параметра At, пропорционально округленным до целых чисел расстояниям между узловыми точками р„ j+i -рж • Все необходимые для интерполяции данные сведены в табл. 3.2. Таблица 3.2 I ', Лн/ Ущ п 0 0 0 50 2 1 2 0 48 4 2 20 0 30 6 3 35 0 15 13 4 53 10 0 8 5 63 20 0 5 6 88 20 25 3 7 109 1 35 2 8 119 0 45 2 9 124 0 50 2
Математические модели поверхностей и объектов 317 Ручное вычисление по (3.39) векторов коэффициентов интерполяционных полиномов девятой степени с„ су, сг является непреодолимо сложным, в чем убеждает значение определителя матрицы Вандермонда \Щ — 2 - 1073. Полученные с помощью MathCAD методом (3.38) интерполянты xK{t), yK(t) и /*(/) (рис. 3.40, б) использовались для построения каналовой поверхности бутылки Клейна по алгоритму (3.43). ▲ 50 А-—j—1—| \ -О—[-- 40 30 20 10 V4 ! ! ! /1 ! l Ь'АЛ /■;/\\1/ 1 \i | >-oLAXL-iSS—!_► 50 100 Решение задачи интерполяции крайне чувствительно к выбору числа и расположения узловых точек, причем рост числа узлов увеличивает степень полинома и межузловые осцилляции. Похожий эффект наблюдается и при недостаточном числе узлов. Например, исключив как будто бы лишний узел рИ2, лежащий на прямой /?н1 рнз, получим направляющую линию с сильной осцилляцией, изображенную пунктиром на рис. 3.40, a. СЗ Квадратичные поверхности описываются алгебраическими неявными уравнениями/О?) = 0 типа (1.124). Параметрические формы поверхностей второго порядка уже изучались нами в разд. 1.2.3, однако там шла речь об их получении не движением линий в пространстве, а подбором подходящих функций подстановки x(t, т) -s- z(t, т), удовлетворяющих уравнению/(л, у, г) - 0. Но именно кинематический метод с целенаправленным выбором элементов движения позволяет получить поверхность с желаемым расположением каркасных линий, внешней (если она необходима) ориентацией нормалей и корректными интервалами изменений параметров. При наличии кинематических элементов pjf) и /?о(т) построение векторов V(t, т), W(t, т) и N(t, т) выполняется буквально "на пальцах", а не путем трудоемких вычислений по (1.61, б) и (1.62). Изучая линейчатые поверхности, мы убедились, что некоторые квадратичные объекты — цилиндры, конусы, однополостные гиперболоиды и гиперболические
318 Глава 3 параболоиды — могут быть сформированы движением прямой линии. Поверхности с осевой симметрией можно строить либо вращением специально выбранной образующей линии вокруг этой оси, либо переносом вдоль нее окружности переменного радиуса. Составим, например, модель кругового эллипсоида .\2 + у2 +z2-l=0 двумя способами: □ вращением половины эллипса р0{х)=[аcos(t) sin(x) 0]е ху Ух е [0, л] вокруг оси х матрицей A(t) = /?д(0 V7 е [0, 2л] при pH(t) - Оз (рис. 3.41, а). Тогда по табл. 3.1 получим модель p(t,x)= [a cos(x) cos(/-)sin(T) sin(r)sin(r)]. (3.55) Проведя в любой точке поверхности касательные векторы V и W в направлении увеличения параметров t и х, построим нормаль N = Vx W, которая для модели (3.55) является внутренней; Рис. 3.41 □ переносом образующей окружности р0(х) = [О cos(t) sin(x)]e yz Ух е [0, 2л] вдоль направляющей прямой pH(t)=[acos(t) О 0] |! jc° У1 е [0, л] с одновременным ее масштабированием матрицей A(t) = sin(t)Ei (рис. 3.41, б). Подставляя эти кинематические элементы в (3.9), получим параметрическую модель эллипсоида p(t,x)=[acos(t) sin(f)cos(t) sin(f)sin(r)], (3.56)
Математические модели поверхностей и объектов 319 формально совпадающую с (3.55) с точностью до имен параметров. Модель (3.56) имеет внешнюю ориентацию нормалей, что видно по расположению векторов Vv\W. Второй способ ближе к универсальному кинематическому методу формирования произвольной квадратичной поверхности сложным АП образующей окружности единичного радиуса. Процесс синтеза целесообразно разделить на два этапа. □ Строится модель нормированной канонической поверхности с масштабными коэффициентами а = Ь — с- 1 в координатных функциях (1.129)—(1.136): pK(t, т) = л(0ро(х) + рн(0- (3-57) Ниже приведены возможные варианты кинематических элементов для построения нормированных поверхностей, изображенных на рис. 1.50: r(t)— функции изменения радиуса окружности р0(х) в процессе ее переноса вдоль направляющей прямой/7Н(0- По умолчанию выбрана образующая окружность p0(x)=\s'm(x) 0 cos(t)]g xz Vt е [0, 2л] (лишь при построении параболического цилиндра используется другая кривая): • для действительной сферы (1.129, а) r(t) = sin(0, Рн(')= [О cos(/) О] Mt е [0, л]; (3.58, а) • для однополостного гиперболоида (1.130) lit) = ch(0, p„(f)= [О sh(/) О] V/ g (-да, oo); (3.58, б) • для двуполостного гиперболоида (1.131) с верхней (+) и нижней (-) полостями /■(/) = sh(0, pjf)= [О ±ch(r) О] Vt е (-«, оо); (3.58, в) • для круглого конуса (1.132) КО = t, pH(t)= [О Ы 0] \/t е (-«>, оо); (3.58, г) • для построения гиперболического параболоида (1.133, а) переносное движение точек образующей окружности должно зависеть от параметра т: КО = t, рн (г,т)= |р t1 cos(2t) о] Vt е [0, оо), т е [0, 2л]; (3.58, д) • для круглого параболоида (1.134) КО = t, рн (г)= р г2 о] V? g [0, оо); (3.58, е) • для круглого цилиндра (1.135) КО = 1, Рн if) = [О t О] Vf g (-«>, со); (3.58, ж) • для построения параболического цилиндра (1.136) используется отличная от предыдущих вариантов образующая кривая в виде параболы: Ро(т)=[х 0 4*0=1. (358з) рн (?) = [0 t О] Vf G (-оо, со), т G (-оо, со).
320 Глава 3 □ Построение произвольной квадратичной поверхности выполняется последовательностью аффинных преобразований канонической модели (3.57) с кинематическими элементами (3.58), соответствующими типу поверхности. В общей сложности достаточно четырех аффинных преобразований — масштабирования, двух вращений и переноса: pit, т) = М', т) М(а, Ъ, с) Лд(ч/) Д,(Ф) + Рп, (3.59) где а, Ь и с — желаемые коэффициенты масштабирования по осям х, у и z; \р и Ф — углы ориентации (см. рис. 1.1,6) той оси симметрии квадратичного объекта, которая в канонической форме является вертикальной; ри— центр квадратичного объекта. Сложное преобразование p(t, т) = рк (t, х)С с матрицей устанавливает между матрицами FK и F неявной формы (1.124) соотношения, аналогичные (2.12): Р FpT =ркС FCT рТк=рк FKpTK=0 => FK=C FCT, F = C~l FK(c~l]. (3-60) Нас интересует обратная задача нахождения параметров а, Ь, с, \у, ф и ри преобразования (3.59) по известным матрицам F и FK. Так как все матрицы к ■ F при любом к Ф 0 описывают одну и ту же поверхность, то матрицы НФ FK и F являются конгруэнтными с точностью до еще одного неизвестного скалярного множителя к: F=kCFC\ (3-61) & Пример 3.14. Построить нелинейчатую кинематическую модель однополост- ного гиперболоида (см. рис. 3.32, б), заданного матрицей неявной формы (3.35). Решение. Анализируя линейчатый метод получения гиперболоиднои поверхности, заключаем, что ее центр расположен в точке ри=[0.5 0.5 0.5], а ось симметрии имеет направление V = [\ 1 1J и углы ориентации V = arctg(>/2 )= 54.7е, <р = 45°. В модели (3.59) осталось определить коэффициенты масштабирования а, Ъ и с Вычислим по (3.60) матрицу FKi канонической поверхности при а = Ъ- с- 1: 0 1 1 1 1 0 1 -1 1 1 0 -1 -1 -1 -1 2 , с,=яхММф)г(/>ц)= 1/72 0 -1/У2 о i/л/з 1/7з i/л/з о l/л/б -2/7б l/л/б 0 0.5 0.5 0.5 1
Математические модели поверхностей и объектов 321 откуда -1 0 0 2 0 0 0 0 0 0 -1 0 0 0 0 0.5 FKi = Построенная по каноническому уравнению однополостного гиперболоида (табл. 1.3) матрица FK=diag[l -1 1 -l] связана с матрицей Fki и масштабными коэффициентами соотношением FK=kdiag[a2 Ъ2 с2 i]fkI . Отсюда получаем k = -2, a = c = l/V2 =0.707,6 = 0.5. В результате матрица сложного преобразования принимает вид C = A4A/2,l/2,lA/2,l)c, = 1/2 0 -1/2 0 л/з/б л/з/б л/з/6 0 л/з/б -л/з/з л/з/б 0 0.5 0.5 0.5 1 а координатные функции искомой поверхности однополостного гиперболоида (рис. 3.42) получаются на основе канонических элементов (3.58, б) модели (3.57) следующим образом: [x(t,x) y(t,x) z(t,x) \h(r(t)p0(-c)+pMc = = [ch(t)sm(x) sh(t) ch(f)cos(t) ljc,
322 Глава 3 x(t,x) = 0.5(1 +ch(t)sm(x))+y3/6)(sh(t) + ch(t)cos(x)), y(t, x) = 0.5 + (л/з/б^Ь^)- 2ch(r)cos(t)). z(t, x) = 0.5(1 - ch(r)sin(t))+ (л/з/б)(БЬ(г)+ ch(f )cos(t)). Весьма трудоемкая проверка убеждает, что полученные параметрические функции координат удовлетворяют неявному уравнению ху + xz + yz-x-y- 1 + 1 = 0, соответствующему матрице неявной формы (3.35). СЗ Поверхности высших порядков описываются алгебраическими неявными уравнениями/^) = 0 или параметрическими функциями p(t, т) со степенями координат или параметров выше второй. Высокие степени полиномов координатных функций могут быть лишь формальным признаком высокого порядка поверхности. Например, поверхность p(t,x)=[ft{2 +*3) '4+т-' '4+t + l] четвертого порядка относительно параметра / и третьего порядка относительно т описывает плоскость — поверхность первого порядка. Действительно, вычислив по (1.62) направляющие векторы и нормаль У = \1л12с 4/3 4/3], W = |W2t2 1 l], N=2^\6t2x2-\) [О 1 -l], обнаруживаем постоянное направление последней для всех значений t и т, что является доказательством того, что поверхность с такой нормалью является плоскостью. Трансцендентные поверхности имеют трансцендентные координатные функции в неявных уравнениях f(p) = 0 или описаниях кинематических элементов— образующих и направляющих кривых. Наибольшую трудность представляет изображение неявных поверхностей f(x, у, z) = 0, не допускающих параметризацию, либо с взаимно не выражаемыми координатами. В разд. 3.1.1.2 в общих чертах описан метод построения линий уровня — сечений поверхности плоскостями, параллельными координатным плоскостям. Изображение сложной неявной поверхности облегчается, если: □ уравнение/(х,у, z) = 0 разрешимо относительно некоторой координаты, например,^ = ф(х, г). Параметризация P(x,z) = [x <p(x,z) z] позволяет построить каркас из линий уровня р(х„ z) и р(х, zy); П сложная функция/(х, у, z) факторизуема, т. е. представляется произведением более простых функций/ (х,у, z). Тогда поверхность/(х,у, z) = 0 объединяет все поверхности ft{x,y,z) = 0, которые могут строиться независимо друг от друга. & Пример 3.15. Построим следующие поверхности. 1. Аналог гауссовской функции плотности вероятности двух переменных ФМ=е-(*2И
Математические модели поверхностей и объектов 323 как параметрическую поверхность p(x,z)=[x q(x,z) z] колоколообразного вида (рис. 3.43, а) и на ее основе "холмистый рельеф" как сумму масштабируемых по осям координат гауссовских поверхностей: N Я*,-)=1>,ф(У*,(*-Сг-,) Y„-(z-c„-)). (3.62) /=1 Параметры /-го холма (впадины) задаются следующими числами: • Л, — высотой (глубиной при hj < 0); • с„ и е., — координатами вершины; • Ул/и Y:/ — коэффициентами крутизны склонов в направлении осей х и г. Рис. 3.43 Рельеф на рис. 3.43, б построен суммированием четырех холмов и одной впадины с векторами параметров v, = [Л, cxi czi yxi yzi],i = l,5: v, =[l.5 -1 -1.5 2 2],v2=[l 0 0 1.4 2], v3=[l.2 1.5 -0.5 2 0.7], v4=[l -1.5 1 2 1.2], v5 =|-0.8 0.5 1 0.5 1.2]. 2. Поверхность четвертого порядка, описываемая неявным уравнением / (х, у, г) = 36х4 - 16j4 + 36z4 - 140х2>-2 + 153x2z2 - 20y2z2 - 216х3 + 864xj2 - - 864xz2 + 144x2 - 1168/2 + 1116z2 + 864x - 1152 = 0. С помощью символической функции Factor программы MathCAD разложим функцию/(х, у, z) на два множителя: /i (х, у, z) = x2- 4у2 + 4z2 - 4, /2 (х, у, i) = 36х2 + 4у2 + 9z2 - 216х + 288. Следовательно, искомая поверхность является объединением двух квадратичных поверхностей (рис. 3.44): ( • /,(x,v,z)=4 луосями а = 2,Ь = с= 1; v2+z2-l J = 0 — однополостного гиперболоида с по-
324 Глава 3 • fii.x,y,z) = 26 (х-1?+[^ 2 ( \2 ♦ffl -. = 0 — эллипсоида с полуосями ) а- I, Ь = 3, с = 2 и центром в точке [3 О О]. □ Рис. 3.44 3.1.3. Кусочно-определенные поверхности В предыдущих разделах обсуждались вопросы создания и свойства поверхностей, для которых известны глобальные неявные или параметрические описания Однако на практике сложная поверхность часто формируется как совокупность сегментов с индивидуальными геометрическими моделями. Типичными примерами являются автомобильные кузова, фюзеляжи и крылья самолетов, корпуса кораблей, лопасти турбин и вентиляторов, скульптуры, фигуры людей и животных, оболочки с отверстиями и другие поверхности, отдельные части которых представляются в кусочном виде, подобно лоскутному одеялу. Кусочное представление бывает также необходимо для описания нерегулярных поверхностей с нарушениями непрерывности (разрывами) или гладкости (изломами). Часто исходная информация о поверхности является неполной, т. е. отсутствует аналитическое выражение, позволяющее вычислить координаты любой точки внутри любого имеющегося сегмента. Кусочная модель сегмента поверхности восстанавливает это описание по ограниченному набору данных. В зависимости от объема этих данных рассмотрим три кусочно-интерполяционные модели. Полагаем, что сегмент имеет форму объемного четырехугольника. Треугольный сегмент является частным случаем четырехугольного при вырождении одной из его граничных линий в точку, что никак не ограничивает работоспособность алгоритмов интерполяции. П Одной из самых простых является билинейная кусочная поверхность, заданная четырьмя узловыми точками woo, woi, wio и г/и (рис. 3.45). Такой минимальный объем исходных данных встречается, например, в машиностроительных САПР, в которых специальными щупами измеряются координаты отдельных
Математические модели поверхностей и объектов 325 точек поверхности сложной детали и по ним строятся кусочные модели всех сегментов. Рис. 3.45 Если к поверхности сегмента не предъявляется никаких других требований, кроме прохождения через заданные узлы, то наиболее оптимальным является вычисление ее произвольной точки как линейной интерполяции между противоположными границами uooim и hoi мм. Зададим в параметрической плоскости квадрат {t е {0, 1}, т е {0, 1}}, четыре вершины которого [t т] соответствуют узловым точкам объектного пространства uir. Линейно интерполированные граничные линии м,о(0 = моо + (wio - uoo)t = woo( I - t) + mot, u,\(f) - woi + (ми -uo\)t = woi(l -t) + uut являются отрезками прямых. Зафиксируем значение первого параметра в интервале / е [О, I] и построим линейную интерполяцию граничных точек сегмента w,o(0 и m,i(/) по второму непрерывному параметру 0 < т < 1: Р('.т) = "*0 (f)0 - т)+ "Я (')^ = "00 0 -')0 - т)+ «Ю'О - т)+ «010-^)^ + "11«. (3-63) что также является отрезком прямой. Идентичный результат получим при интерполяции граничных точек wot(t) = г/оо(1 - т) + Moit, wit(t) = мю(1 - т) + uut при фиксированном значении т е [0, 1] по непрерывному параметру 0 < t < I: p(t, т) = м0х(т)0 - 0+ "1х(т> = «00О - 00 - т)+ "010 - ')* + «ю'О - т)+ "11 "■ В соответствии с классификацией на рис. 3.1 билинейная поверхность является косой плоскостью, а согласно примеру 3.9, где рассматривалось движение прямой образующей по двум скрещивающимся прямым направляющим, она же представляет собой квадратичную поверхность — гиперболический параболоид. Таким образом, при узловом задании кусочной поверхности она представляется набором независимых четырехугольных "сегментов косых плоскостей с
326 Глава 3 прямолинейными каркасными линиями. Если четверка узлов сегмента компланарна, то интерполяционная поверхность между ними — обычная плоскость. Также плоскую форму принимает билинейная поверхность, заданная тремя узлами. Например, подставив в (3.63) точки ш\ = ш\, получим билинейную поверхность p(t, т) = woo(l - 0(1 - *) + «ю/(1 - т) + та с направляющими векторами V(t, т) = (wio - woo)(l - т), W(t, т) = (woo - uio)t + woi - woo и нормалью N(t, т) = (1 - t)(mio - woo) х (woi - woo) постоянного направления, что доказывает планарность поверхности трехуз- ловой линейной интерполяции. П Далее рассмотрим построение гранично-линейной кусочной поверхности, заданной двумя граничными линиями g(t) и h(t) (рис. 3.46), причем их параметр в границах сегмента изменяется в интервале / е [0, 1]. Здесь требуется больший объем исходных данных: аналитические описания указанных граничных линий или возможность их получения методами полиномиальной (3.37)—(3.41) или иной интерполяции. Рис. 3.46 Поскольку поведение сегмента между граничными линиями не регламентировано, то для вычисления его произвольной точки выбираем линейную интерполяцию по параметру 0 < т < 1 между граничными точками g(t) и h(t) с равными значениями параметра /: p(t,T) = g(t)(l-x) + h(t)T. (3.64 ■ Согласно классификации, приведенной на рис. 3.1, это линейчатая поверхность с двумя направляющими, причем в качестве дополнительного условия ее построения выступает общий параметр t согласованного движения прямой обра-
Математические модели поверхностей и объектов 327 зующей по граничным линиям. Каркасные линии p{th т) являются отрезками прямых, а линии p(t, Ту) образуют систему полиморфных кривых, переходящих от одной формы к другой, а именно — от линии p(t, 0) = g(t) к линии p(t, 1) = h(t). Небольшую сложность при подготовке исходных данных для интерполирования кусочной поверхности представляет нормализация отрезков граничных линий— приведение параметра / в интервал [0, 1]. Допустим, граничный участок сегмента находится на линии l(t) в интервале изменения ее параметра t е [ta, t„] с любым соотношением между числами ta и th. Тогда нормализованная граничная линия сегмента имеет параметрическое описание g(t) = l(ta + (tl,-tl,)t)Vte[0, I]. (3.65) П Наиболее сложным в построении линейно интерполяционным объектом является граничная кусочная поверхность, называемая в [26, 29] линейной поверхностью Кунса. Она задается четырьмя граничными линиями g{t), h(i), /(т) и г(т), образующими объемный четырехугольник с угловыми точками (рис. 3.47) Moo = g(0) = /(0), w.o = g(l) = /-(О), wo. = Л(0) = /(1), wi. = /г(1) = г(1). Рис. 3.47 Как и в предыдущем случае, все граничные линии сегмента должны иметь параметрическое описание в интервалах t е [0, 1] и т е [0, 1], иначе к ним необходимо применить операцию нормализации (3.65). Выберем следующие краевые условия фиксации параметров t и т: • t — 0 на линии /(т); • t - 1 на линии г(т); • т = 0 на линии g(t); • т = I на линии h(t). Первоначально кажется, что для вычисления произвольной точки гранично определенного сегмента можно использовать двухпараметрическую линейную интерполяцию по методу (3.64): Pit, т) = g(0(l - т) + Л(г)т + /(т)(1 - 0 + r(i)t.
328 Глава 3 Однако эта формула дает несовпадение с исходными данными во всех угловых и граничных точках. Например, вместо угловой точки woo получим />(0,0) = g(0) + /(0) = 2ггоо * иоо, а граничная линия g(t) интерполируется искаженной кривой p(t, 0) = g(0 + моо(1 - /) + mot*g(t). Причина ошибок — двойное вхождение угловых точек в формулу интерполяции. Скорректируем ее вычитанием лишних слагаемых: p(t, т) = g(r)(l - т)+ Л(г)т + /(т)(1 - 0+г(т> - -moo(i-')0-t)-«io'(i-t)-woi(i-Ot-«ii"- Теперь не трудно убедиться, что правильность интерполяции восстановлена: рф, 0) = gф) + 1ф) - woo = woo Pit, 0) = g(t) + /(0)(1 - i) + гф)1 - моо(1 - 0 - иш = g(t). В кинематическом аспекте поверхность (3.66) формируется движением полиморфной образующей по двум направляющим. Ее каркасные линии составляют две системы полиморфных кривых: • P(t„ т) — от рф, т) = /(т) к р( I, т) = г(т); • p{t, ij) — от p(t, 0) = g(0 к p{t, I) = h(t). Сложная поверхность, состоящая из множества сегментов, конструируется как система кусочных поверхностей, соединенных друг с другом по граничным линиям. Общий недостаток рассмотренных методов кусочной интерполяции — негладкость поверхности в точках и на линиях стыковки сегментов, поскольку модели поверхностей сегментов строятся индивидуально без учета взаимного влияния. Испытаем алгоритмы (3.63), (3.64) и (3.66) на примере построения кусочной поверхности зуба. Зададим в пространстве 17 узловых точек, образующих каркас полигональных сегментов, организованных по схеме 2x8 (рис. 3.48): Рис. 3.48
Математические модели поверхностей и объектов 329 • билинейная кусочная поверхность, изображенная на рис. 3.49, а, состоит из восьми плоских треугольников и восьми косых четырехугольников; • продольные граничные линии сегментов гранично-линейной поверхности, построенной на рис. 3.49, б, получены полиномиальной трехточечной интерполяцией по (3.38) и (3.39), при этом линейчатые поверхности всех сегментов неплоские; • наиболее эстетично в сравнении с предыдущими моделями выглядит поверхность зуба с гранично-кусочными сегментами, все граничные линии которых являются интерполяционными полиномами (рис. 3.49, в). Рис. 3.49 3.1.4. Сплайны Кусочно-линейная интерполяция кривых линий отрезками прямых и поверхностей плоскими сегментами дает нулевой порядок непрерывности. Негладкость полученного решения выражается в изломах, т. е. разрывах производных в узловых точках. Для повышения порядка непрерывности используются более глад^ кие функции интерполяции, чем линейные. Широко распространенные в практике интерполирования полиномы Лагранжа (3.37) или Ньютона имеют степени, зависящие от числа узлов. Их главный недостаток— большие межузловые осцилляции, появляющиеся уже при степенях полиномов, равных 6 н- 8. При числе узловых точек кривой, большем десяти, интерполяция глобальным полиномом становится непрактичной. Более предпочтителен другой подход— использование кусочной интерполяции гладкими полиномами невысоких степеней (сплайнами). Подробное изложение теории и практики сплайн-интерполяции приведено в [20, 26, 29]. Из богатого многообразия сплайновых методов приближений кривых и поверхностей мы рассмотрим построение интерполяционных сплайн-функций по оригинальному
330 Глава 3 алгоритму, вычисляющему сразу все параметры кусочных полиномов решением системы линейных алгебраических уравнений (СЛАУ) высокого порядка, и его рекуррентной модификации, требующей обращения матриц только четвертого порядка независимо от числа узлов. Для обеспечения непрерывности сопряжения кусочных полиномов в узловых точках линии или поверхности по нулевой, первой и второй производным достаточно использовать кубические сплайны, дающие минимум интегральной кривизны сплайнового объекта. Интерполяционным кубическим сплайном называется кусочно-определенная функция, обладающая следующими свойствами: П она проходит через все узлы интерполяции; П на каждом интервале интерполяции описывается кубическим (линия pit)) или бикубическим (поверхность p^t, т)) полиномом; П кусочные полиномы гладко, т. е. с непрерывными первой и второй производными, сопрягаются друг с другом в узлах интерполяции. Механический аналог кубического сплайна— гибкий упругий стержень, проходящий в пространстве через заданные узловые точки при определенных краевых условиях. Повинуясь физическим законам, стержень занимает положение с минимумом потенциальной энергии изгиба, пропорциональной интегральной кривизне It Я?*- (=1 Аналитическое решение этой экстремальной задачи имеет вид кусочно- кубической параметрической функции. Рассмотрим методы получения кубических сплайнов и их использование. 3.1.4.1. Сплайновые кривые Даны узловые точки Mi=k }>i z,-]V/ = 0, п, пронумерованные в порядке их соединения в конструируемой сплайновой кривой (рис. 3.50). Рис. 3.50
Математические модели поверхностей и объектов 331 Число интервалов интерполяции равно п. Координатные xi(l)=s0xi+ s\xi' + s2xi' + sixi' > У* (0 = s0yi + s\yi{ + s2yit2 + S3yit3, 4 (0 = s0zi + S\zit + S2zit2 + S3z/ и векторная \p,(f)=[ , f2_^k [vfe[o, dt], 1 = 1,/1 где St = s0xi s0yi s0zi s\xi slyi s\zi s2xi s2yi s2zi s3xi s3yi s3zi (3.67) функции сплайна содержат \2n неизвестных коэффициентов— элементов матриц Sh Их однозначное определение требует составления и решения совместной системы 12н скалярных или 4« векторных уравнений, исходя из перечисленных свойств сплайна. U Условия фиксации сплайна в узловых точках р,(0) = г/,, и p,(d,) — и, дают 2л векторных уравнений [10 0 01^=1^,,11 dj df df\s,,= и,;V/ = bw. <3-68> U Условия двойной гладкости сплайна во внутренних узлах Р'М ) = Pi+l (°) > Р"М ) = а'+i (°)- т. е. непрерывности двух производных Л'(г)=[о 1 2/ 3^^,^(0=10 0 2 6t]S„ дают 2(/г - 1) уравнений [ [о 1 2dj 3^2j5( =[0 1 0 0]S,+I, [0 0 1 3rf,]S,=[0 0 1 0]5(+1 V; = l, и-1. (3.69) U Оставшиеся 4и-2и-2(и- 1) = 2 векторные уравнения составляют краевые условия, налагаемые на параметры сплайна в крайних узлах г/о и ип. Они могут варьироваться в зависимости от специфики строящейся кривой: • свободные концы с нулевой кривизной Pi(0)= P"n(dn)=03 дают уравнения [0 0 1 0]5,=O3,[0 0 1 Зс?„]5„=03; (3.70,0)
332 Глава 3 замкнутый сплайн должен кроме совпадения узлов мо = и„ удовлетворять условиям гладкого сопряжения концов Pi(0)= P„(dn), Pi(0)= p'„(dn): [О 1 О 0]S,=[0 I 2dn 3d*]S„, , [0 0 1 0]Sj =[0 0 I 3dn]Sn; закрепленные концы с направлениями дают уравнения [О 1 0 0]Sl=VQ, [0 1 2dn 3d2n]Sn=Vn. (3.70, 6) (3.70, в) Могут быть и смешанные краевые условия с соответствующими уравнениями (3.70). Например, для сплайна со свободным концом в узле мо и заданным направлением V„ в узле и„ уравнения краевых условий примут вид [0 0 1 0]S, =03, [0 1 2dn 3d%]Sn=Vn. Совокупность уравнений (3.68) - (3.70) дает СЛАУ QS=U=>S=Q~lU (3.71) с матрицами (верхние буквенные индексы в блоках Qj и Q* соответствуют вариантам краевых условий в (3.70)) Q = fill 62 ^4x4 С>4х4 °4х4 ©4x4 Ql.n-l С>4х4 О 4x4 е2 е4 eR 4ях4и S = fil,= "1 0 1 </,. 0 1 0 0 0 df Id, 1 Idf 3d: fi2 = 0 0 ef = 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 cf =&. er = 0 -1 о 0 ,(B)_ eR 0 0 0 4nx3 \u = u. u„ eR 4nx3. fif 0 0 0 "я 0 1 3d„ U4 - Uln> e4B) = 0 0 0 0 1 1 0 0 0 0 1 0 0 dn 0 1 0 0 0 0 0 0 0 0 0 dn 0 2d„ 3di
Математические модели поверхностей и объектов 333 U,= ui-\ щ о3 L°3 J R4x3 £/(в) = un-\ un Vn Поясним принцип формирования матричных блоков Q\h Qi, Qi, Q* и U,. Выполнив блочное умножение в (3.71), получим развернутую запись СЛАУ в виде QuSi+Q2S2=Ui, Ql,n~l^n-l+Q2^n =Un-b 6^1+¾¾ =un. (3.72) Отсюда видно, что уравнениям (3.68) соответствуют первые две строки всех блоков, уравнениям (3.69)— третья и четвертая строки всех блоков, кроме Qj, Qn и Uj. Оставшиеся две строки заполняются согласно краевым условиям (3.70). Особенности обращаемой в (3.71) матрицы Q: 3 высокая размерность 4и х 4и, что все-таки меньше размерности 12и х 12и, которая бы получилась при группировке неизвестных в виде вектора, а не блочной матрицы S; 3 сильная разреженность, т. е. большое относительное содержание нулей, из-за чего при решении СЛАУ выполняется много бесполезных арифметических операций с нулем; 3 блочно-ленточная структура. Это свойство вкупе с невырожденностью блоков Qu позволяет свести задачу одновременного нахождения всех матриц Si -г- S„ к их последовательному вычислению при меньшей размерности обращаемых матриц. Подставляя цепочкой матрицы Si=Qu{Vi-QiSM) в последнее уравнение (3.72), получим рекуррентный алгоритм расчета параметров кубического сплайна: и-1/ < к - QiQu к - Q2&2 к - - - QiQi'n-Pn-i )••)]. Si=Qti{ut-QiSM) V/ = ^Ti. (3.73)
334 Глава j Знание параметров сплайна позволяет провести гладкую кривую через узловые точки, используя координатные или векторное уравнения (3.67). Для получешн промежуточных точек между узлами /-ый интервал [ы,-_1, и,-] дробится на N, равных частей A?, = dj N,. Вычисленные точки Pi (kAli) = [l АД/, (kAtj f (kAtj f \Si \/k = 0, Nt соединяются отрезками прямых. Отрезки на разных интервалах будут примерн-: равной длины h, если принять значения пропорциональными длинам хорд, соединяющих узлы. При h = 1 и задании координат узлов в пикселах сплайновая кривая будет выглядеть на экране дисплее почти предельно гладкой. До сих пор предполагалось, что известны интервалы [0, d] изменения параметр* l на каждом из i = \,n интервалов интерполяции. Поскольку узловые точки и могут располагаться в пространстве неравномерно, то значения d,- должны быт* пропорциональны длинам дуг p,(t). Пока сплайн не построен, эти длины неизвестны. Учитывая, что сплайновая кривая является наиболее гладкой, можно п методу хордовой аппроксимации [26] принять значения ^ = \и,-ин\\ равными расстояниям между соседними узлами. Можно, конечно, задать равные параметрические длины всех интервалов d, = 1 у строить так называемый нормализованный сплайн, параметры которого рассчитаны по алгоритму (3.73) с постоянными числовыми матрицами Q\ и Q*. Пол>- ченное решение отличается от сплайна с хордовой аппроксимацией чисел dt ка» формой, так и меньшей гладкостью, а при равномерной дискретизации параметра t еще и разной плотностью промежуточных точек p,{ti) на коротких и длинных интервалах. & Пример 3.16. Построить параметрическое семейство нормализованных кубических сплайнов в плоскости ху по трем узлам «0 = [2 0], и,=[0 1], и2=[0 0] с направлениями концов V0=X[] 1], К2=[-1 1] для различных значений параметра К.
Математические модели поверхностей и объектов 335 Решение. Отбросив координату z, рассчитаем семейство матриц параметров плоского сплайна на и = 2 интервалах при d\ = di = 1 и краевых условиях (3.70, в): а 1 1 0 0 0 0 0 1 1 1 1 2 3 0 1 3 >& = и. 0 0 1 0 0 0 0 0 0" 0 0 0 .а = 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 >е» = 10 0 0 1111 0 0 0 0 0 12 3 "1 0" 0 1 0 0 0 0 , t/2(X)= "о Г 0 0 X X -1 1 Si(^hQ;l(ul-Q2S2(X)), aer'a^Wbaer1^ ), откуда 5,(А)= 2 0 X X -4.75-1.75А 3.25-1.75Х 2.75 + 0.75А -2.25 + 0.75Л S2(X)= 0 1 -1.25-0.25А -0.25-0.25Л 3.5 + 0.5А -3.5 + 0.5А -2.25-0.25А. 2.75-0.25А Уравнения семейства сплайновых кривых на каждом из двух интервалов интерполяции и общее уравнение сплайна со сквозным параметром / имеют следующий вид: р,(/,А)=[2 + А/-0.25(19 + 7А>2 + 0.25(11 + ЗА>3 Xt + 0.25(13-lX)t2 + 0.75(^-3)/3 ], = [-0.25(5 + A> + 0.5(A-7>2+0.25(ll-A>3 l-0.25(l + A>+0.5(A-7>2+0.25(ll-A>3], px{t,X) при0</<1, it,x)= р2('-1Д) при 1</<2. На рис. 3.51, о построены сплайновые кривые для значений параметра к е {-], 1,3}, изменяющего вектор Vo направления сплайна в узле ко. Отличие графиков друг от друга свидетельствует о зависимости параметров и формы сплайна как от направлений, так и от модулей концевых векторов Vo и V„. Другими словами, эти векторы характеризуют скорости изменения точек сплайно- вой кривой в концевых узлах. Для сравнения пунктиром построен нормализованный сплайн со свободными концами.
336 Глава 3 Рис. 3.51 На рис. 3.51, б приведены графики координат x(t. I) и y{t, I), состоящие из отрезков кубических парабол, гладко сопрягающихся на границах интервалов интерполяции. СЗ & Пример 3.17. Построить трубчатую поверхность топологического объекта известного как "узел Эшера" (рис. 3.52). Рис. 3.52 Решение. Согласно (3.9) для построения каналовой, в том числе и трубчатой поверхности, необходимо иметь уравнение ее направляющей кривой p»(t). Ввид> отсутствия аналитических выражений для координат xH(t) -=- zH(0 построим эт> замкнутую линию методом сплайн-интерполяции. Выберем семь узлов интерполяции в наиболее характерных точках пространства (рис. 3.53,о) при а- \& 6= 10, с = 4: м0=м6=1° с ~Ь\,щ=\а -с b\, и2=[-Ь а с\, м3=[* а -с], м4=[с ~b a]>u5=l~c b а\-
Математические модели поверхностей и объектов 337 Длины интервалов изменения параметра зададим по методу хордовой аппроксимации: dx = d3=d5=2^b2+c2 =21.54, d2=d4=de=^(a + bf +{a + cf +(b-cf =33.35. Рассчитав по (3.73) при условиях (3.70, б) матрицы параметров сплайна 5,= 53 = 16 0.54 -0.019 -0.0003 -10 0.284 0.067 -0.002 4 -0.627 0.0019 0.0005 4 -0.627 0.0019 0.0005 16 0.54 -0.019 -0.0003 -10 0.284 0.067 -0.002 -10 0.284 0.067 -0.002 4 -0.627 0.0019 0.0005 16 0.54 -0.019 -0.0003 ,52 = , S4 = ,s6 = 16 -0.679 -0.038 0.001 10 0.777 -0.044 0.0005 -4 0.1 0.032 -0.0005 -4 0.1 0.032 -0.0005 16 -0.679 -0.038 0.001 10 0.777 -0.044 0.0005 10 0.777 -0.044 0.0005 -4 0.1 0.032 -0.0005 16 -0.68 -0.038 0.0011 получим направляющую кривую Рт (0 = [l ' '2 '3 К V/ 6 [0, d], / = Гб , ^ X © Л, © d\ к——*\ У © U <->| © <—► г © Id, © d\ к——* t Рис. 3.53 координаты которой xH{i) + zH(i) в сквозном времени t е [0,164.7] изображены на рис. 3.53, б. Каркас трубчатой поверхности узла Эшера на рис. 3.52 построен по алгоритму (3.43) при r(i) = 3 и направляющих векторах Vt(t) = [о 1 2t 3t р,. □
338 Глава I & Пример 3.18. Построить каналовую поверхность бутылки Клейна (приме: 3.13), используя узловые данные табл. 3.2 для сплайн-интерполяции направлям> щей линии и радиуса образующей окружности. Решение. Число интервалов интерполяции, судя по табл. 3.2, равно девяти, a v параметрические длины d, = f, - /ы варьируются от d\ - 2 до db - 25. С учето» различия в длинах более чем на порядок будем строить ненормализованно, сплайновые функции. Выберем краевые условия сплайнов: П для линии p»(t) е R3 — закрепленные концы с направлениями К0=[0 -1 0], К9=[0 1 0]; □ для функции радиуса r(t) е R1 — свободно закрепленные концы. Результаты расчетов представлены на рис. 3.54 параметрическим /?н(/), декартовыми xH(t), yH(t) и /■(/) графиками, а на рис. 3.55, о— изображением каналово* поверхности p{t, т). В сравнении с глобальной полиномиальной интерполяции" (см. рис. 3.39, 3.40) сплайн-интерполяция дает более гладкие решения на тех - узловых точках (эстетические свойства объектов здесь не обсуждаются). 1 so 40 30 20 10 к У ! 1 уЛ \ \ \ \ \L/i i —IV r f \ Lf-i—-П£§—L_w 50 100 Рис. 3.54 На рис. 3.54, a пунктиром изображена нормализованная сплайновая кривая р*л. а соответствующая каналовая поверхность построена на рис. 3.55, б. Налит ухудшение гладкости решений из-за неравномерного расположения узлов инт-т- поляции. □
Математические модели поверхностей и объектов 339 ::ssJ' ,;«•■•►, ,-.,-. 1» Рис. 3.55 3.1.4.2. Сплайновые поверхности Дано (и + 1)(/и + 1) точек — узлов интерполяции uij = ky J7// zi/J Vi = 0,n, j = 0,m 3 порядке их соединения в каркасе конструируемой сплайновой поверхности. Индексы узлов / и j составляют сетку из nm прямоугольных ячеек (рис. 3.56). Каждая (|,/)-ая четырехугольная (при совпадении соседних узлов некоторые ячейки могут оказаться и треугольными) криволинейная ячейка поверхности описывается бикубическим полиномом >v(?,t)=[\ ' '2 '3К GRJ (3.74) V/e[o, d,\, те [о, б J, / = 1,и, j = \, : трехслойными (по одному слою на каждую координату х,у uz) матрицами ко- ффициентов Sy е К/»*-»":?, содержащими в сумме 48«/« неизвестных параметров. Их однозначное определение требует составления и решения системы из \6пт векторных уравнений, исходя из условий, которым должен удовлетворять бикубический сплайн. 3 Условия фиксации поверхности в узлах: А>{0, °) = "ы.у-мД/О, 5,) = ui4,pp0{dh 0) = uhJ-up£dh 5,) = щ. (3.75)
340 Рис. 3.56 П Условия двойной гладкости сплайна во внутренних узлах 4W)=41M' p^(d„x)=pM.(0)t) VTeь*Л /#W,)=/>&+,M. pf>K )= ph+i(</H>0) с производными n 4}(лт)=[о 1 2/ 3/2]¾ рИ(г,т)=[0 0 2 6¾. и частными производными ,4г)(<дь[1 / ^2 t3h ,4tt)m=[i ' '2 <3К Го 1 2Т 'О О 2 l6tj 4П)('.т)=[о 1 Ъ а2]*,. 1 2г Зт2 (3.76) П Краевые условия, налагаемые на производные сплайна в граничньгх узлах ufi, ;V uoj и и„7, Они могут варьироваться в зависимости от специфики решаемой задачи свободные границы дают условия нулевой кривизны поверхности на краях ' ^^)=^^)=^)(,0)^^,5.)=03 , • 4°И= р£\ 8 J= pffto, т)= p(«)(dn, г)=03 (3.77. с
Математические модели поверхностей и объектов 341 замкнутый сплайн должен кроме условии совпадения узлов ко,- = ищ щ - uim удовлетворять условиям гладкого сопряжения границ: ' /#М= Р%МЛ /#М= pf{d„x) Vte fe 5,}, рРМ-P8<f-*m\ р№.°)= Р&Ш V/efei/,.}, /^(0.0)= pHU fc. буч l P^K )= /#+1 k. o), pP(0,0)= />&>м. «Л pfrXtfl)- P$j0, 5 J. (3.77,6) Могут быть и другие комбинации краевых условий. Например, возможен сплайн цилиндрического типа с замкнутыми границами в узлах щ\ = и,,„ и свободными границами в щ и unJ. Здесь не рассматриваются закрепленные границы с заданными направлениями касательных векторов V\}, VnJ, Vt\ и Vim, т. к. эти краевые условия требуют задания большого объема неочевидных исходных данных. Совокупность уравнений (3.75) - (3.77) составляет линейную систему QSe=U^S=&4J©~l : матрицами '01 Qi о 4x4 о, '4x4 о, '4x4 о, а о. '4x4 '4x4 0\,п- о, '4x4 Qi Ол GR4"X4", 5: 511 Jnl (3.78) >1/и 6R 4их4/ихЗ е = © и Ог о 4x4 04x4 ®1,/и-1 04x4 04x4 04х4 03 04Х4 5локи которых представляют собой матрицы Qi ©4 6R 4/пх4/и а,- = о о 1 о 1 о о 1 о 2dt 3d? 3d, 6, 1 о £/: и. и, п\ 1 5; 8f 5? О 1 25, 35^ О 0 1 35; Й2 t/ lm £/» О о О О О -1 eR 4их4/ихЗ О О О О О О 0 0-10 #>= 0 0 0 0 0 0 0 0 1 0 0 0 0" 0 0 0 о(а)- > И4 _ 1 о 1 d„ о о о о о о 0 о 1 3d„ ©4а) = 1 о 1 6„, о о о о о о 1 о 36,
342 Глава 2 fif^ft.fif =0-.6^=6,,, ug = ui-[,j-l ui,j-\ 03 O3 "'-1,7 o3 O3 O3 O3 O3 O3 O3 O3 03 O3 4x4x3 e R Блоки Qs и Qt матрицы Q реализуют краевые условия в узлах u\f и иф а блок Qj и ©J матрицы © — в узлах щ и и„„. Вычисление по (3.78) выполняется отдельно для каждого координатного сло§ трехмерных матриц U и 5. Из-за непреодоленной автором сложности матричны» преобразований не удалось вывести рекуррентный алгоритм расчета параметров бикубического сплайна, аналогичный алгоритму (3.73). Каркасное изображение сплайновой поверхности благодаря криволинейных каркасным линиям является гладким в отличие от полигонального каркаса, построенного на тех же узловых точках. Возможность расчета по (3.74) любьи промежуточных точек позволяет строить сплайновую поверхность с более мелкими ячейками без нового расчета параметров сплайна. Для этого межузловь.* интервалы k-lj-l' "1,7-lJ' Pi-\J-\' ui-\,j\ дробятся соответственно на /V,- и М, равных частей A/, = d,- IN, и Дт, = 8; / М-г В;; ячейки будут примерно равновеликими h х n-параллелограммами, если принять Nt = max hj-i " ",-1,7-11 М j = max J 'e[l,n |",-1,7 ~ui-lj-\\ При неравномерном распределении узловых точек в пространстве рекомендуете» задавать параметрические длины интервалов d, и т, на основе метода хордово»" аппроксимации, усредняя расстояния между противоположными парами узловых точек: di = \uiJ-\ ~ »1-1,7-11 + 1ыУ ~"'-',7| 5J=- -1,7 " "«-1,7-1 + К-"«,7-1 Задавая все значения dt = &j- 1, получим нормализованную сплайновую поверхность, параметры которой рассчитаны по алгоритму (3.74)—(3.78) с постоянными числовыми матрицами Q\, ©1, Q4 и ©4. Полученное решение отличаете! от сплайна с хордовой аппроксимацией чисел dt и 8, как формой, так и \\z- шей гладкостью, а при равномерной дискретизации параметров / и т еще i разной плотностью промежуточных каркасных линий на коротких и длиннь интервалах.
Математические модели поверхностей и объектов 343 Сплайновое описание поверхностей, приходя на смену полигональному, начинает широко применяться в промышленных САПР для изображения корпусов автомобилей, судов, самолетов, в медицине (компьютерная томография), картографии (отображение рельефа местности), компьютерных играх (изображение трехмерных объектов, в том числе и людей) благодаря возможности получения аналитической формулы p(t, т) гладкой оболочки по ее экспериментальным узловым точкам u,j. Имея уравнение поверхности, мы получаем возможность доступа к любой ее точке, преобразования, изображения в желаемой проекции, расчета пересечений с другими поверхностями, изготовления натурной модели, программирования станка с числовым управлением и т. д. .17 Пример 3.19. Построить нормализованную сплайновую поверхность со свободными границами по девяти точкам аоо = И 0 -l],»oi=[0 -1 -1]. «02 =[1 0 -1]; :/,0 = И 1 0], «,,=[0 0 0],и12=[1 1 0]; азо = [-1 0 lj, „21=[о -1 1], ii22=[l 0 1], принадлежащим гиперболическому параболоиду х2 - у - z2 = 0. Решение. В (3.78) матрицы Q = ©т и координатные слои матриц U и S имеют вид -1 -1 0 0 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 о 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0" 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 2 1 0 0 1 0 0 1 3 3 0 0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0 1 0 0 0 0 0 -1 0 1 0 1 о" 0 0 0 0 1 0 3 -1 0 0 0 0 1 0 0 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 1 0 0 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0" 0 0 0 0 0 0 0 "0 1 0 0 1 0 0 0 -1 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 о 0 0 0 0 -1 0 0 0 0 -1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 о" 0 0 0 0 0 0 0
344 Глава 5 -1 0 0 0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 > "V — 0 1.5 0 -0.5 1 0 -1.5 0.5 -1.5 0 0 0 -1.5 0 0 0 0 0 0 0 0 0 0 0 0.5 0 0 о 0.5 0 0 0 -1 1.5 0 -0.5 0 0 -1.5 0.5 0 0 0 0 0 0 0 0 1.5 0 0 0 1.5 0 0 0 -0.5 0 0 0 -0.5 0 0 0 Я = -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Подставив матрицы параметров в модель бикубического сплайна (3.74), по-т чим координатные функции поверхностей четырех ячеек />пМ=[т-1 1.5(г-т)+0.5(т3-^3) t-l], Pl2(f'T)=lT -1 +1-5^+ т2)-0.5(г3+т3) t-l],
Ыатематические модели поверхностей и объектов 345 />2lM=[x-l 1-1.5(2 +т)+0.5(3+т3) t], р22(г,т)=[с 1.5(т2-/2)+0.5(3-т3) t], каждая из которых локально определена в интервалах изменения параметров / е [0, 1] и т е [0, 1]. Полное изображение сплайновой поверхности с узлами интерполяции приведено на рис. 3.57. Каркасные линии построены через интервалы дискретности At - Ат = 0.2. CD & Пример 3.20. Допустим, необходимо построить достоверное изображение некоторого рельефа по измерениям высоту множества точек его плана {xhZj). В качестве источника координат используем модель поверхности (3.62). Наложим на план местности (карту линий равных высот) регулярную сетку с размерами ячеек Ах = Az = 0.5 и координатами узлов х, = -2 + 0.5/ V/ = 08, Zj = -2 + 0.5/ V/ = ОД после чего построим на этой 81-узловой сетке нормализованную сплаиновую поверхность со свободными границами (рис. 3.58). Налицо практически полная идентичность этого изображения с образцом (см. рис. 3.43, б) благодаря выбору частой сетки и совпадению ее узлов с вершинами и впадиной рельефа. Рис. 3.58 Однако вдвое более редкое размещение 25 узловых точек с координатами х, = -2 + / V/ = ОД zj = -2+7 У/ = ОН дает сплаиновую поверхность (рис. 3.59), существенно отличающуюся от образца. Это объясняется выбором слишком редкой пространственной дискретизации 1х = 1 и Az = 1, при которой почти все пиковые точки поверхности (кроме обозначенной цифрой 2) не совпали с узлами интерполяции и оказались "не замеченными" алгоритмом построения сплайна.
346 Глава с Рис. 3.59 Целенаправленным смещением всего лишь четырех узлов удалось на нерегулярной 25-узловой сетке получить сплайновую поверхность (рис. 3.60), весьма бли> кую к регулярной 81-узловой поверхности. Однако данный искусственный способ минимизации числа узлов интерполяции не отменяет изложенного ни _ правила. СЗ Рис. 3.60 Вывод (пространственный аналог теоремы Шеннона—Котельникова): при построении сплайновой поверхности выбор интервалов дискретизации ограничен св^- ху минимальными размерами элементов интерполируемого объекта. Для получеша достоверного изображения значение интервала дискретности по некоторой коорш- нате должно быть хотя бы вдвое меньше длины минимального элемента. В разд. 3.1.3 рассматривались три метода построения кусочно-определенных поверхностей. Сплайн-интерполяция— это еще один метод, дающий, возмож--
Математические модели поверхностей и объектов 347 наиболее гладкие решения. Для иллюстрации сказанного построим сплайновую поверхность зуба по семнадцати узлам щ V/ = 0, 2, у = 0,8, изображенным на рис. 3.48. Наиболее подходящими краевыми условиями сплайна являются замкнутость по границам «,о ■*- up и свободные границы ш, и щ. Поверхность зуба, построенная по алгоритму (3.74)—(3.78) и изображенная на рис. 3.61, является, несомненно, более гладкой и эстетически привлекательной по сравнению с результатами работы других методов интерполяции (см. рис. 3.49). Рис. 3.61 3.1.5. Фрактальные множества Многие объекты окружающего мира обладают свойством "самоподобия" или геометрической инвариантности к пространственному масштабу. Если рассматривать эти объекты в разном масштабе, то постоянно обнаруживаются подобные фундаментальные элементы. Так, строение Вселенной от Метагалактики до атома описывается сходными моделями типа "ядро—спутники"; строение гористой поверхности или изрезанность морского берега выглядят примерно одинаково и с космической высоты, и с высоты птичьего полета, и с уровня человеческого роста. Все отличие лишь в разрешающей способности восприятия изображения. Вообразим съемку береговой линии кинокамерой с трансфокатором, имеющим регулируемое, но конечное угловое разрешение. При "наезде" камеры на объект взору открываются неразличимые ранее фрагменты, сходные по структуре с фрагментами предыдущего уровня разрешения. Такой процесс укрупнения масштаба изображения принципиально отличается от увеличения фотографии по ее негативу или от растяжения выделенного фрагмента растровой картинки, при которых усиливается зернистость без появления новых более мелких фрагментов. Математическое описание бесконечно дробимых объектов уравнениями линий или поверхностей чрезвычайно громоздко из-за необъятного количества мель-
348 Глава 3 чайших фрагментов. Для преодоления этой трудности математиком Исследовательского центра корпорации IBM Бенуа Мандельбротом в 1975 г. был введен термин "фрактал" (от nar.fracius — раздробленный, разбитый), а в 1982 г опубликована основополагающая книга "Фрактальная геометрия природы", где описаны фрактальные множества, их свойства, методы получения и изображения. 3.1.5.1. Фрактал Мандельброта и алгоритмические фракталы Мандельброт исследовал предельное (при к -> со) поведение последовательности комплексных чисел zk+l=zk+c,k = 0, 1,2,... ,zo-c (3.79,я) при различных значениях комплексных чисел с. Вместо арифметических операций с комплексными числами можно моделировать на плоскости ху движение точек zk = [хк ук\, задаваемое двумя рекуррентными уравнениями координат: хк+\ = хк~Ук + сх* Л*' ~ 1хкУк + су„ & = 0, 1, 2,..., А-о = с„ уо - су. (3.79, б) Последовательность zk с ростом числа итераций демонстрирует поведение двух типов (рис. 3.62) в зависимости от выбора начальной точки с = |сх су\. Ее элементы, эволюционируя по плоскости, либо постепенно уходят в бесконечность (У), либо всегда остаются в определенной замкнутой области, совершая циклическое движение (2) или сходясь в точку (5). Математиками строго доказано, что если при некотором к модуль \zk\ > гт\п, где /mm = 2 — минимальный радиус расходимости множества Мандельброта, то далее последовательность расходится и я—»<*> Множество точек с, для которых последовательность (3.79) не расходится, называется множеством Мандельброта. Весьма сложно доказывается [21], что это множество связно. Графическая интерпретация множества Мандельброта удивительно красива и бесконечно разнообразна (рис. 3.63, 3.64). Для ее получения зададим исходные данные итерационного процесса (3.79): П прямоугольное окно С с разрешением п х т точек; □ значение/mm = 2; □ максимальное число итераций ктах. Условимся, что если точка zk вышла за пределы круга радиуса Гтт, то расходимость достигнута за к < ктт итераций и процесс (3.79) останавливается. При \zk\ < /min вплоть до к - ктлх расходимость отсутствует.
Математические модели поверхностей и объектов 349 Рис. 3.62 Для каждой точки q, е С, i = \,n, j = \,m запустим итерационный процесс и сформируем матрицу Л/, элемент которой mtj е [1, kmdx] равен номеру итерации к, на которой процесс был остановлен. Далее возможны варианты изображения фрактального множества на плоскости или в пространстве. U В плоском варианте визуализации выведем матрицу М на экран как растр, сопоставив элементам ш^ некоторую палитру из fcmax цветов. Например, можно выбрать радужную палитру, у которой цвета и оттенки от фиолетового до красного (или градации серого цвета) распределены по диапазону чисел матрицы либо линейно (чем быстрее расходится последовательность в некоторой точке cip тем темнее ее цвет), либо по другому закону. Яркие изображения дают палитры с чередующимися контрастными цветами. На рис. 3.63 приведены примеры использования различных палитр. В центре черным цветом изображена область комплексной плоскости, содержащая все множество Мандельброта. Окружающие центральный рисунок изображения представляют масштабированные области в соответствующих квадратах. Все фрактальные множества рассчитаны с разрешением 600 х 600 точек при kmax = 50-5- 200 (чем сильнее увеличение, тем больше максимальное число итераций). Картинки верхнего ряда окрашены с помощью радужной палитры со случайным порядком цветов. 3 Полагая числа mi} высотами некоторой поверхности в точках cv, можно построить объемное изображение множества Мандельброта или его части (рис. 3.64), которое при специально подобранном освещении может выглядеть и как скала с плоской вершиной (рис. 3.64, а), и как водопад (рис. 3.64, б), и как горная пещера (рис. 3.64, в).
350 Глава 3 т <rf.i. ч< "*Ш£ Ц ^ 'К. -1.5 -1 -0.5 0 0.5 I V* Рис. 3.63 N. 1-1:- * tt ЧЧ! ,щ ■,. Рис. 3.64
Математические модели поверхностей и объектов 351 Типичный фрактал, каким является множество Мандельброта, представляет собой иерархический объект, состоящий из родительского тела в форме кардиоиды и многочисленных потомков, повторяющих форму предков, от которых они ответвляются. Самоподобие элементов фрактала хорошо прослеживается на рис. 3.63. Связность множества означает, что его элементы, даже самого малого размера, которые Мандельброт назвал "фрактальной пылью", не обособлены, а соединены тончайшими нитями в одно целое. Продолжая процесс увеличения пограничных областей, мы всюду видим бесконечное разнообразие форм, поражающих гармонией, великолепием и поразительным сходством с изображениями регулярно-хаотических явлений природы — молний, снежинок, ледяного узора, инея на ветвях деревьев, кораллов, паутины, солнечных протуберанцев, звездных скоплений, космических снимков поверхности Земли, колючей проволоки и т. п. И все это неожиданное разнообразие порождено казалось бы несложным детерминированным алгоритмом (3.79) и небольшим объемом исходных данных для его моделирования — границ области С, ее размеров п и т, параметров остановки /Vnin И ftmax. Поневоле хочется считать, что фрактальная геометрия описывает природные формы, по-видимому, изящнее и точнее, чем евклидова. "Почему геометрию часто называют холодной и сухой? Одна из причин заключается в ее неспособности описать форму облака, горы, дерева или берега моря. Облака— это не сферы, горы— не конусы, линии берега— не окружности, и кора не является гладкой, и молния не распространяется по прямой <...> Природа демонстрирует нам не просто более высокую степень, а совсем другой уровень сложности. Математики <...> предпочли все больше и больше отдаляться от природы, изобретая теории, которые не соответствуют ничему из того, что можно увидеть или почувствовать ..." (Б. Мандельброт, [21]). Фрактальное множество Мандельброта принадлежит к классу алгоритмических фракталов. При наличии достаточно развитой фантазии можно придумать множество других итерационных процедур общего вида zk+i=F(zk, с), k = 0,1, 2,-, (3.80) порождающих различные изображения. Например, если в (3.80) подставить функцию F{zk,c)=znk+c с целым числом п > 2, то получим симметричное фрактальное множество, объединяющее п - 1 множество Мандельброта. На рис. 3.65, а построена почти реальная шестилучевая фрактальная снежинка, соответствующая значению n = 7. Еще один алгоритмический фрактал получается на основе знаменитой формулы (3.79). Ее модификация заключается в том, что комплексное число с фиксируется, а элемент т^ матрицы М задает начальное значение zo, перебираемое дискретно в области С. Результат моделирования этого алгоритма в области С е [-1, 1] + +[-1, 1] i при с = 0.36 + 0.36 i, называется фракталом Жюлиа (рис. 3.65, б). Естественно, возможны теоретически бесконечно глубокие погружения внутрь этого фрактального множества, изображение которого напоминает фотографии спи-
352 Глава 3 ральных галактик, и всегда будут проявляться важнейшие свойства фракталов — симметрия и самоподобие. Практическая глубина погружения ограничена различимостью точек с1р т. е. разрядностью процессора. -J^S.- *Wi*4i, **i w*' "■"'-■°Г, ' 'к a L ;Ш > ' "■-"Зт- „Ca" V Рис. 3.65 6 ^ГШЧИТ1^ - i * "•■-.-. &#■■' \ ■$$<£, Реализация третьего фрактального алгоритма Ч+i з4+1 названного в [23] "Ньютон", показана на рис. 3.65, е. Итерационный процесс (3.80) останавливается при Р*+1 -1 </- где /-mm « 1 — радиус кругов сходимости с центрами в точках (1, 0), (0, i), (-1, 0) И (0, -i), Либо При ДОСТИЖеНИИ к = АГтах. Фрактальные свойства можно обнаружить в самых, казалось бы, обычных алгоритмах. Например, при расчете корней функции/(z) в комплексном пространстве итерационным методом zk+] - F(zk) обычно полагают, что области сходимости начальных приближений zo к корням z<°) ■*- z<"> имеют фиксированные и гладкие границы. Моделирование, однако, показало, что они, в действительности, фрак- тальны. Для доказательства этого факта на рис. 3.66 построены области сходимости к восьми корням полинома (=1 четыре из которых z<'> = -2, z<2) = 0, z<3> = 1 и z<4> = 3 — действительные числа, а четыре образуют две комплексно-сопряженные пары z<56) = -3 ± i и z<7'8> = 1 ± 3 i. Для вычисления корней, обозначенных на плоскости ху белыми точками, использовался итерационный метод Ньютона /(¾ ) Ч+\ - Ч /-(¾)
Математические модели поверхностей и объектов 353 с условием остановки |/(zi+i )| < 0.01. Принадлежность начальной точки zo к области сходимости корня zW определялась по минимальному расстоянию Рис. 3.66 При внимательном рассмотрении изображения на рис. 3.66, а можно увидеть восемь главных областей и множество маленьких "островков" вблизи их границ. Масштабные увеличения приграничных областей выявляют новые элементы фрактального множества, неразличимые при меньших разрешениях (рис. 3.66, б, в). Таким образом, моделирование работы итерационных алгоритмов вычислительной математики практически доказало фрактальность областей сходимости корней нелинейных уравнений. 3.1.5.2. Геометрические фракталы В отличие от алгоритмических фракталов представители другого класса — геометрических фракталов — реально осязаемы и могут быть до некоторого разрешения, позволяемого остротой зрения мастера, умением и твердостью его рук, изготовлены из проволоки (линейные объекты), тонкого листа фольги (площадные объекты) или в объеме. Геометрические фракталы строятся на основе исходной фигуры — линии, полигона, полиэдра — путем ее дробления и выполнения аффинных и логических преобразований (объединения или исключения) полученных фрагментов. Метод построения фрактального объекта может быть как итерационный, так и рекурсивный, причем последний чаще бывает богаче возможностями и проще в программировании. Рассмотрим, например, процесс формирования плоской линии Коха — линейного фрактального объекта, строящегося на отрезке прямой ab путем разбиения его на три равные части ас, cd и db, построения на средней части равностороннего треугольника с вершиной е и удаления отрезка cd. В результате отрезок ab превращается в ломаную линию acedb (рис. 3.67, а). Эта простая процедура повторя- ч-^ > min V/ = 1,8. Г I • ' ■* . ,т Л \
354 Глава 3 ется многократно для каждого отрезка полученной линии (рис. 3.67, б, в) до тех пор, пока длины разбиваемых отрезков не станут меньше заданного значения 5. Так как после первого же разбиения отрезок становится полилинией, то способ построения фрактала Коха на отрезке естественно обобщается на ломаную линию, заданную списком вершин Р= {р\рг ...р„) (рис. 3.67, г), в том числе и линию, замкнутую в полигон (рис. 3.67, д). В частном случае полигона в виде правильного треугольника получим фрактал, называемый "снежинкой Коха" (рис. 3.67, е). Для того чтобы линия Коха, построенная на выпуклом полигоне, не имела самопересечений, она должна находиться с его внешней стороны. Это легко обеспечить, определив по (1.50) направление обхода полигона D = dir_test(P). Тогда при D — 1 точки е строятся справа, а при D = -1 — слева от отрезков. Рис. 3.67 Составим итерационный алгоритм построения линии Коха KOCHit(P, D, 5, т) на ломаной линии Р= {р\рг ...р„} с ориентацией, заданной числом D е {-1, 1}, минимальной длиной разбиваемого отрезка 5 и максимальным числом итераций т (рис. 3.68). Работа алгоритма начинается с формирования матрицы вращения Rot = R(-Da 13) на угол 60° в направлении -D. Далее в цикле итераций к = \,т определяется число звеньев ломаной линии n-size(P), формируется список L= {р\} из первой вершины полигона Р и начинается цикл обработки отрезковp,pi+i Vi = 1, п-\: П находится третья часть вектора направления г'-го отрезка v=Pi+\-Pi 3
Математические модели поверхностей и объектов 355 Если 3| V\ < 5, что означает достижение предела разбиения отрезка, то в список L добавляется очередная вершина/>,+, и цикл выполняется для следующего значения i = i+ 1; c = Pj+V,d=c+V,e=c+V-Rot {c,e,d}-^L, / = 1 Рис. 3.68 □ в противном случае в список L добавляются новые точки с=Р/+ V,e-c+ V- Rot, d - р^\ - V и вершина pt. Точку е можно найти и без использования матрицы вращения Rot. Достаточно с помощью (1.8) построить £>-стороннюю нормаль N = DYy - Vx J и получить точку как вершину правильного треугольника {cdec} (см. рис. 3.67, а). По завершении обхода всех отрезков ломаной Р= {pip2...pn} линия Коха на к-ой итерации разбиения сформирована. Список L переименовывается в Р и цикл итераций выполняется для следующего значения к-к+ 1 и нового списка Р. По достижении значения к = m алгоритм завершает работу возвращением списка Р вершин ломаной Коха в порядке их следования. В случае необходимости готовый фрактал рисуется на экране как последовательность отрезков между вершинами списка Р.
356 Глава 3 Гибкие правила прекращения разбиения отрезка позволяют управлять видом линии Коха. Например, если задать значение б = 0, то на всех отрезках ломаной независимо от их длины будет выполняться ровно т итераций разбиения. При задании достаточно большого числа итераций т отрезки будут дробиться до тех пор, пока все их длины не станут меньше значения 6. Для исключения "холостой" работы, когда все отрезки стали короче 5, а до значения к = т еще далеко, в алгоритме KOCHit используется флажок /, обнуляемый в начале итерации и устанавливаемый в единицу после первого разбиения отрезка. Если же на некоторой итерации не было ни одного разбиения, то по признаку/= 0 алгоритм прекращает работу и возвращает список Р. Рекурсивная функция построения линии Коха KOCHrec(L, b, D, 5, rec) настолько проста, что нет необходимости оформлять ее в виде блок-схемы. Получив на входе список L вершин построенной части линии Коха (последняя из них является началом следующего отрезка ab), точку Ь, параметры D, 5 и число гее разбиений отрезка ab (по одному за каждую рекурсию), функция работает следующим образом. & KOCHree(L,b,D,b,rec) {a-LsrM, V=(b-a)l3>; если {rec = 0}(j\?>V\< б}, то {b^-L; line(a, b); возврат L); c = a+V,d=c+V,e = c + V ■ R(-Dn I Ъ); L = KOCHrec(L, c, D, 5, rec - 1) L = KOCHrec(L, e, D, 5, rec - 1) L = KOCHrec(L, d, D, 5, rec - 1); возврат KOCHrec(L, b, D, 5, rec - 1); Ю Перед первым обращением к функции нужно в список L занести начальную точку отрезка или ломаной, на которой строится фрактал Коха. Например, однократное вычисление L = KOCHrec(a, b, D, 5, rec) строит /^-ориентированную линию Коха на отрезке ab и формирует в L список ее вершин. Для построения фрактала на ломаной {р\рг—рп} создается начальный список L = {pi}, а затем в цикле L = KOCHrec(L,pi, D, 5, rec) V/ = l^n рисуются линии Коха на отрезках/>,_, /?,-. // начало отрезка и треть его вектора // условия остановки разбиения отрезка // добавление в список новой точки // рисование отрезка // выход из рекурсии // точки разбиения отрезка // разбиение отрезка ас II разбиение отрезка се II разбиение отрезка ed II разбиение отрезка db
Математические модели поверхностей и объектов 357 Минимальные изменения функций KOCHit и КОСНгес позволяют итерационно либо рекурсивно строить на средней части каждого отрезка не равносторонний треугольник, а квадрат, как показано на рис. 3.69, а. В результате получаются интересные фрактальные узоры в виде непрерывных непересекающихся ломаных линий. На рис. 3.69, б, в эти линии построены на сторонах квадрата Р — {р\ргрърлpi) по рекурсивному алгоритму с параметрами 5 = 0, гее = 2, гее — 3 и с чередованием ориентации точек ей/на смежных уровнях рекурсии. А если в цикле перечисления сторон квадрата обращаться к рекурсивной функции с параметром {-Y)'D, то получится не менее красивый фрактальный узор, изображенный на рис. 3.69, г. Рис. 3.69 Обладая симметрией и завораживающей гармонией, геометрические фракталы Коха и подобные им линии имеют несомненное эстетическое значение и практическое применение как выразительные элементы оформления различных узоров и орнаментов. Пожалуй, наиболее популярным линейным геометрическим фракталом, служащим такой же визитной карточкой фрактальной темы, как и множество Ман- дельброта, является ветвь папоротника (рис. 3.70). Разработаем рекурсивный алгоритм построения изображения этого фрактального объекта. Целесообразность использования рекурсии основана на подобии всей ветви любому ее листу. Ключ к успешному решению задачи имитации объектов природы — точное соблюдение пропорций их элементов. Заключим оригинальное изображение ветви в прямоугольное окно и проведем необходимые линейные и угловые измерения между опорными точками ро +ps, лежащими на концах ветви и двух нижних ли-
358 Глава 3 стьев. Вычислим длину листа d- \po-ps\> высоту окна ho = fifcos(cpo) и коэффициенты пропорций . _\po-Pi\ ъ \г>о-Рг\ ^=1*^,^=1*^,^=1*^ (3.81) d ' """■ d d Составим следующую рекурсивную функцию построения ветви папоротника. £jfern(po, h, ц/, side, 5, rec) {если {rec = 0}U {К^Л < &}>то выход; II выход из рекурсии Pl=Po+ [° *1Л]л(\|/), /?2 = Ро + [О £2лМу); II точки ветвления line(po, pi); II рисование линии в окне О fem{p\, m\h, \\i - side(q>i + cpo), -side, 5, rec - 1); II построение листа в окне 1 fern{pi, rmh, у + side(ty2 + cpo), side, 8, rec - I); II построение листа в окне 2 fern(pi, rmh, \y - side(q>3 - cpo), side, 5, rec - 1); II построение листа в окне 3 При обращении к функции ей передаются данные, определяющие расположение ветви в окне: Е Ро=[*о Уо]— координаты начальной точки на осевой линии окна; □ Л — высота ветви; П i|/ — угол отклонения ветви от вертикали;
Математические модели поверхностей и объектов 359 П side = ±1 — направление изгиба ветви вправо (+1) или влево (-1) от оси окна; lJ 5 — минимальная длина ветвящегося отрезка; □ гее — максимальное число рекурсий ветвления. На каждом уровне рекурсии в текущем окне 0 высотой h алгоритм вычисляет точки р\ и pi, лежащие на осевой линии окна на расстояниях \pop\\ = kih и \рор2\ — kih от точки ро, затем рисует отрезок рор2 и трижды рекурсивно вызывает себя с параметрами подобных окон У, 2 и 3: П точками ветвленияр\,рг ирг, □ высотами пи h, mi h и im h; П углами отворота от осевой линии -(epi + сро), ерг + сро и -(ерз - сро); □ направлениями изгиба листьев относительно изгиба ветви согласно схеме на рис. 3.71, я; □ параметром 6; □ декрементированным значением гее - 1. Предусмотрено два альтернативных условия прекращения ветвления: □ по исчерпанию заданного числа рекурсий гее; П по достижению длины отрезка ki h, меньшей пороговой длины 8. Задание 8 = 0 позволяет построить ветвь точно за гее рекурсий. При этом общее число отрезков, составляющих изображение ветви, равно ^^=1 + 3(1+3(1 + ... + (1+3)))=^3^=0.5^-1). (3.82) (=1 Ветвь на рис. 3.71, б построена при гее = 5 и состоит согласно (3.82) из 121 отрезка, причем многие из них имеют размеры меньше пиксела и просто не видны. Задание параметра 5 > 0 при достаточно большом значении гее вынуждает алгоритм строить ветвь до тех пор, пока длина всех ее отрезков не станет меньше 5. Такой прием позволяет регулировать густоту ветви, глубину вложения рекурсий и сильно от нее зависящие необходимые машинные ресурсы. Оценка максимальной глубины рекурсии, необходимой для достижения разрешения 5, следует из соотношения откуда получаем к2тъЫ> < ^ > lnf-8-l Mo , ( Ь) (3-83) \п{тъ) 1*2/го ,
360 Глава 3 Рис. 3.71 Ветвь папоротника на рис. 3.71, в построена по угловым измерениям оригинала ветви на рис. 3.70 и коэффициентам (3.81): Фо * 14.9°, ф| * 37.7°, Ф2 * 36.8°, фз * 17,6°; (3.84) к, = 0.0483, кг = 0.162, т\ = 0.371, № = 0.336, /из = 0.849. (3.85) Высота экранного окна задана равной h = 200, минимальная длина рисуемого отрезка 5 = 0.5. Фактическая глубина рекурсии и количество цветовых оттенков изображения составили г = 30, что точно удовлетворяет оценке (3.83): 1п(0.0077) „ЛО гео—\ ^ = 29.8. 1п(0.849) Для повышения реалистичности изображения ветви можно с переходом на следующий уровень рекурсии уменьшать толщину рисуемой линии, а также изменять ее цвет. Наиболее реалистичные фрактальные изображения, лишенные строгой гармонии, так не свойственной объектам природы, строятся методом управляемой случайности. Суть метода в том, что в детерминированный процесс сознательно вносятся помехи с желаемыми стохастическими параметрами. В алгоритме построения ветви папоротника можно, например, случайно смещать точки ветвления р\ и рг вдоль осевой линии или вносить небольшие изменения в углы ветвления ф! -ьфз. На рис. 3.71, г показана реализация алгоритма со случайными воздействиями на углы ф1 ■¥ ф? из (3.84) аддитивных помех rnd(20°) - 10е, равномерно распределенных в интервале (-10°, 10°). Где-то в лесу я видел именно такую ветку папоротника! По алгоритмам, устроенным подобно рассмотренному, можно получать изображения фрактальной травы, кустарников и деревьев. Вся изюминка заключается в выборе небольшого числа параметров, определяющих форму растения. Например, функция fern использует девять глобальных параметров к\, кг, т\ + т- и фо -4- фз. В совокупности с аргументами общее число скалярных данных, необходимых для построения фрактального изображения ветви папоротника, равно 16.
Математические модели поверхностей и объектов 361 Вместе с текстом программы это не сравнимо с объемом массива, необходимого для хранения изображения ветви в любом из графических форматов, даже наиболее плотно упакованном. Вот парадокс! Такие сложные изображения создаются с помощью чрезвычайно малого числа исходных данных. Здесь кроются богатые практические возможности фрактальной геометрии: описывая объекты на фрактальном языке, мы можем значительно уменьшить объем информации, необходимой для построения изображения, хранения его в памяти компьютера или передачи по сети. А внося в алгоритм элементы управляемой случайности, можно получать такие разнообразные, неожиданные и изумительно красивые изображения, что никакой самый изощренный фантазер не сможет придумать всего того, на что способна одна простая фрактальная программа. Строительными элементами площадных (именно площадных, а не двухмерных) геометрических фракталов служат плоские полигоны, чаще всего трех- и четырехугольники. Самым знаменитым фракталом этого класса является треугольник Серпинского, строящийся путем разбиения треугольника— не обязательно равностороннего — средними линиями на четыре подобных треугольника, исключения центрального и рекурсивного разбиения угловых треугольников до получения площадных элементов желаемого или минимально видимого разрешения (рис. 3.72). Существует простой стохастический алгоритм поточечного построения треугольника Серпинского [36], работа которого иллюстрируется на рис. 3.73, а. Рис. 3.72 & Шаг 1. Внутри исходного треугольника/»/>2/>з генерируется случайная точка: / -md{\),х- rnd(\ -t),qo=pi + (pi-pi)t + (p3-pi)x. В более детерминированном варианте алгоритма точка _Р1+Р2 + Рз «70- ~ выбирается в центре треугольника. Шаг 2. Задается число т итераций генерирования случайных точек.
362 Глава 3 Шаг 3. В цикле к = \,т генерируется случайное целое число — номер п = |~>-ж/(з)]е {'. 2. 3) одной из вершин треугольника рп, с помощью которой вычисляется и рисуется точка в середине отрезка qk~, рп. СЗ Благодаря выбору точки qo внутри треугольника p\pipi центр отрезка qop, (точка ф) никогда не окажется внутри центрального треугольника, отмеченного на рис. 3.73, а пунктиром. При достаточно большом числе итераций т генерируемые точки qk образуют случайный узор, предельная форма которого стремится к треугольнику Серпинского. Результат работы алгоритма при т = 20 000 показан на рис. 3.73, б. Следует отметить, что небольшое число начальных точек qh все-таки может попасть в запретные области. В частности, это случится при выборе точки qo в центре треугольника р\ргръ. Тогда точка q\ всегда окажется в центре любого из угловых треугольников, т. е. в запретной области. Рис. 3.73 Внеся в алгоритм три изменения, а именно: П задание четырех точек в пространствер\ ■*- рп, П выбор начальной точки по формуле qo=pt +(p2-p\)t + (j?3-p\)i + (рл-р\}в е R3, где / = rnd(l). х = rnd(\ - t) и G = md(\ -t-x), D интервал генерирования случайного номера вершины и=["ли/(4)"]е{1,2.3,4}, получим стохастический алгоритм построения треугольной пирамиды Серпинского— объемного фрактального объекта, аналога одноименного треугольника Результат работы этого алгоритма за т = 5 000 итераций показан на рис. 3.73, в Р, Рг.
Математические модели поверхностей и объектов 363 В задачах компьютерной графики фрактальная технология получила наибольшее распространение при формировании объектов природного ландшафта — линии горизонта, неровных поверхностей, холмов, гор, каньонов и прочих нерегулярных образований. Построение основано на рекурсивном разбиении исходного объекта средними точками и смещении этих точек по методу управляемой случайности. Начальные объекты выбираются из простых геометрических фигур — отрезков, треугольников, прямоугольников, тетраэдров. Управление случайными параметрами алгоритма заключается в уменьшении смещения средних точек элементов по мере уменьшения их средних размеров. Изучение методов формирования объектов фрактального ландшафта начнем с построения фрактальной ломаной линии (ФЛЛ) на некотором базовом отрезке аЬ. В практических применениях она может изображать след молнии, траекторию случайного блуждания некоторой частицы (броуновское движение) или линию горизонта неровной местности. Эта хорошо заметная линия разделяет светлую область неба, где рисуются фрактальные облака, и темную область земли с фрактальными деревьями и травой. Построение ФЛЛ еще проще, чем линии Коха, особенно в рекурсивном исполнении. Обозначим за //(ст) функцию генератора центрированных (с нулевым средним) случайных чисел (ГСЧ), распределенных по некоторому закону с параметром разброса ст. Например, это может быть равномерное распределение в интервале {-о,о) или нормальное распределение со среднеквадратичным отклонением (СКО), равным ст. Нецентрированные случайные числа со средним значением ц генерируются по формуле ц + //(ст). При необходимости можно использовать и другие менее распространенные законы распределения случайных чисел. На рис. 3.74 показаны первые три шага разбиения отрезка аЬ с управляемо- случайными ортогональными смешениями средних точек разбиваемых отрезков. Величина \са] конкретного смещения средней точки отрезка с есть реализация ГСЧ rfCk\ab\). где К— коэффициент пропорциональности параметра разброса ст к длине отрезка \ab\. Например, при использовании равномерного ГСЧ //(ст) = rnd(2c) - ст е (-ст, ст) смещение средней точки будет равновероятно в интервале (-Х, X) единиц длины отрезка. Рис. 3.74 Рекурсивная функция FLLrec(L, Ъ, X, 5, гее) построения фрактальной ломаной с аргументами L (список вершин построенной части линии, последняя точка которого а является началом следующего отрезка ab), точку Ь, параметры К, 5
364 Глава 5 (минимальная длина разбиваемого отрезка) и гее (глубина рекурсии) работает следующим образом. £7 FLLrec(L, Ъ, X, 8, гее) {а — L,iz^L), V- b — a; II начало отрезка и его вектор если {/-ес = 0}и(И<8}, то // условия остановки разбиения отрезка {b -> L; II добавление в список новой точки line(a,b); II рисование отрезка возврат L); // выход из рекурсии с = а + 0.5 V, d = с + V ■ R(-n 12) ■ rf(X\ V\); II средняя точка и ее смещение L = FLLrec{L, d, А., 8, гее - 1); // разбиение отрезка ad возврат FLLrec(L, b, К, 6, гее - 1); // разбиение отрезка db }П Построение ФЛЛ на отрезке ab осуществляется однократным вычислением списка ее вершин L = FLLree(a, b, К, 8, гее). Для генерирования фрактала на базово" ломаной линии {р\р2...р„} инициализируется начальный список L- {р\}, послг чего в цикле L - FLLrec(L,ph А., 6, гее) V/ = 2, п строятся ФЛЛ на базовых отрезках pri pt. На рис. 3.75 показаны три реализации алгоритма FLLrec на базовом отрезк. единичной длины с применением равномерного ГСЧ, параметров К е {0.1,0.2, 0.3}, 8 = 0 и гее - 8. При моделировании с разными значениями г установлены следующие закономерности, проявившиеся в некоторых реализациях ансамбля: П при 0.2 < X < 0.3 линия имеет участки с попятным движением, т. е. перестае- быть однозначной в ортогональном направлении к базовому отрезку; П при X > 0.3 на ломаной линии появляются петли, что затрудняет ее использование, например, как линии горизонта. Таким образом, алгоритм рекомендуется использовать при значениях параметра ра> броса ГСЧ X < 0.2, нежелательно — при 0.2 < X < 0.3 и противопоказано при X > 0.3. Для выработки дальнейших практических рекомендаций по использованию алгоритма FLLrec с равномерным ГСЧ предпримем небольшое статистическое исследование. Каждая ФЛЛ, построенная за гее рекурсий разбиения отрезков средними точками, состоит из и = 2rei+ 1 вершин Pj =[xj >>,],! е[1,и] и имее- индивидуальные максимальное и среднеквадратичное отклонения от базового горизонтального отрезка: Л=тахЫ, с= -5>,2. (3.86,
Математические модели поверхностей и объектов 365 У 0.25 0 125 0< -0.125 -0.25 к Х=0.2 jC_-A^=01 Mir L^ \, ! х=о.з| \ 1* ^"у!г*'1 .!l../;K> *^ 1 1 Рис. 3.75 Важной статистической характеристикой ломаной линии {р\рг...рп}, отражающей ее непрямолинейность, является коэффициент удлинения — отношение суммы длин отрезков ломаной к расстоянию между ее концами: и-1 ZIa--a-+i| У = -^- (3.87) \P\-Pn\ Зададим число М = 30 и набор значений А, = 0.01/ V/ =0, М . Для каждого А, рассчитаем ансамбль из N - 1000 ФЛЛ с вычисленными по (3.86) отклонениями r\k и ок, а по (3.87) — коэффициентами ук. Рассчитаем средние параметры ансамбля w 1ср -Г-5>*. °ср=Т7 5>А' Ycp=— 5>А- N , N N , (3.88) *=1 " к=\ " к=\ Соответствующие графики приведены на рис. 3.76. Первые две зависимости хорошо аппроксимируются линейными функциями, а третья — параболой: Лср(А) * 2А, / 3, Оср(А) * 0.2А, усР(А)» 1 + 6А2. (3.89) ч.о' 0.2 0.1 0 к i 1 1 i >r 1 1 1 1 1 ,с__т- 1 1 L- 1 i W^ ■cp %^. Ч 2 1 —► 0.1 0.2 Рис. 3.76 0.3 X
366 Глава 3 Итак, в (3.89) нами получены усредненные зависимости максимального и среднеквадратичного отклонений и коэффициента удлинения фрактальной ломаной линии от параметра разброса X генератора равномерно распределенных случайных чисел. Теперь стало возможным как оценить полосу нахождения линии горизонта вокруг базового отрезка при заданном значении X, так и задать X сообразно желаемому поведению ФЛЛ. Для формирования ФЛЛ на Зс1-отрезке ab с помощью функции FLLrec, работающей в плоскости ху, перейдем в промежуточную систему координат, у которой ось абсцисс направлена вдоль ab. При любом положении отрезка матрица преобразования СК легко вычисляется с помощью функции MAPI из (2.51). Запишем функцию построения пространственной ломаной фрактальной линии на отрезке ab е R3 в следующем виде. & FLLUfl, b, X, 8, rec) {Ск = МАРЪф,Ь-a,03,*0); // матрица преобразования СК L = FLLrec\aCK,bCK,X,b,rec)CK 1 И список вершин ломаной линии в R4 возврат L; Как и с функцией FLLrec, построение ФЛЛ на отрезке ab е R3 осуществляется однократным вычислением списка ее вершин L - FLL3(a, b, X, 8. rec). Для генерирования фрактала на базовой ломаной линии р\рг ...р„ инициализируется начальный список L— {pi}, после чего в цикле L = FLL3(L, ph X, 8, rec) V/ = 2, п строятся ФЛЛ на базовых отрезках рм р,. В последующих задачах мы будем использовать функцию FLL3 с параметром 8 = 0. Таким образом, форму ФЛЛ между точками а и Ъ будут регулировать всего два параметра: П X определяет относительное отклонение ФЛЛ от базового отрезка и согласие рекомендациям, разработанным выше, должен задаваться из условия X < 0.3: П гее устанавливает фиксированное число отрезков ФЛЛ, равное N{rec) = 2гес и возрастающее вдвое при увеличении числа разбиений на единицу. Следующий объект фрактального ландшафта— фрактальная кусочная поверхность (ФКП), гладкий аналог которой — кусочная поверхность Кунса, построенная на рис. 3.47, — описывается моделью (3.66). Практическое применение ФКП — изображение небольшого участка рельефа, водной поверхности, развевающегося на ветру флага, смятого листа бумаги...
Математические модели поверхностей и объектов 367 Зададим в пространстве четыре узла моо, woi, ню, ш\ и построим на базовых отрезках моо ню, им ми, моо moi и ню ни соответствующие граничные линии горизонта g, Л, / и г (рис. 3.77). С помощью функции FLL3 рассчитаем граничные ФЛЛ: g = FLL3(u00,що Д, 0, rect), h = FLL3(u0buu,K,0, rect), I = FLL3(u00,u0i,X, 0, recz), r = FLL3(ul0,uu,K, 0, recx). (3.90) Рис. 3.77 Очень важный момент в этой задаче — равенство числа вершин в парах линий {g, И) и {/,/■}, потому что дальше мы сопоставим (n, + 1)-ой паре точек {#,-, Л,-} значения параметра tj = — ,где nt =2 ', а (лх + 1)-ой паре точек {/,, /)} — значения параметра ту =^-, где/1,=2^^. Числа гее, и гее, можно задавать равными, исключая случаи сильной вытянуто- сти ячейки вдоль одного из направлений t или т. Теперь по уравнению непрерывной модели (3.66) вычислим узлы ФКП: Pij = gi (l - */)+ Л,-*/ + lj 0 -',)+ rjti - моо 0 - '/ )(l - tj)- «io'i (1 - xj)- (3.91) -UQ^-t^T-untjTj Vi = 0,nt,j = 0,nx, n, =2rec', nx=2reCz. В целях иллюстрации работы алгоритма (3.90), (3.91) на рис. 3.78 построены фрактальные поверхности на одном и том же наборе некомпланарных узлов моо, им, то, ш\, но с разными значениями параметра разброса А. равномерного ГСЧ. Налицо влияние этого коэффициента на характер рельефа: от чуть холмистой равнины при X » 0.1 (рис. 3.78, б) до сильно пересеченной горной местности при К я 0.3 (рис. 3.78, в). Кстати, если задать А. = 0, то алгоритм создаст прямолиней-
368 Глава 3 ные граничные линии g, h, I, г и детерминированную поверхность типа косой плоскости, изображенной на рис. 3.45. Л=0.2 А.=0.1 А.=0.3 "Ш. Зг* Рис. 3.78 Логическое завершение темы фрактального рельефа — построение фрактальной полигональной сети (ФПС) как объединения фрактальных кусочных поверхностей в единое целое. Практическое применение фрактальных сетей — изображение протяженных рельефных ландшафтов с разнообразными топографическими свойствами участков. Допустим, в пространстве задано (п + \)(т + 1) узлов щ \/i = 0,n, j = 0,т, пронумерованных в порядке их соединения в крупноячеистую базовую сеть (рис. 3.79). Для удобства организуем объемную матрицу U моо ми0 и0т eR иХтехЗ Рис. 3.79 с элементами векторного типа. Простое и/и-кратное выполнение алгоритма (3.90), (3.91) с индивидуальными граничными ФЛЛ каждой ячейки не дает непрерывного сопряжения кусочных поверхностей смежных ячеек (рис. 3.80, а) Для обеспечения непрерывности ФПС необходимо, чтобы ее ячейки имели общие
Математические модели поверхностей и объектов 369 граничные линии, рассчитанные функцией FLL3. Лишь после этого наступает черед расчета внутренних узлов кусочных поверхностей по формуле (3.91). В результате получаем следующий алгоритм FPS{U, X, 8, rec„ recz) построения фрактальной полигональной сети на базовой сети с матрицей узлов U е R"x'"x3. & Шаг 1. Рассчитываем m + 1 граничную ФЛЛ базовых ячеек вдоль направления /: { v(^ =u0j, v0) =РШ\уи\ии,Х,0,гес,) V/ = iTn}\/j = 67m. (3.92) Шаг 2. Рассчитываем и + 1 граничную ФЛЛ базовых ячеек вдоль направления т: { w(0 =1/0/, w(,) =FLi3(w(,),M0,X,0,7-ecT) V/=Um} Vi = M- (3.93) Шаг 3. Во вложенном цикле j = 0, и -1, j = 0, m -1: П из списков vW и v(/+l>, каждый из которых содержит по п ■ п, + 1 точек, где nt = 2гес' , формируем массивы п, + 1 вершин граничных линий (i,/)-ой ФКП: z = \vU) vu) vu) } A = (vt/+1) vu+l) vU+l) \ (3 94) П из списков и*0 и и»*'*'), каждый из которых содержит по ш • и, + 1 точек, где п^ = 2геСг , формируем массивы пх + 1 вершин граничных линий (/,/)-ой ФКП: / = { w« , м/0 (0 } { ^..+1) w(/+i) (Ж) } (395) П во вложенном цикле v = 0, nt , ц = 0, пг рассчитываем узловые точки ФКП (i,/)-ой ячейки как подмножество узлов общей ФПС: Лц+v, >т+м = £v 0 - т)+ М + /ц 0 ~')+ У ~ м/ j (1 - 0(1 - ТЬ v и (3%) - мж 7(1 - т)- «j +1 (l -t)x- ы,+1 +1гг, где t = —, т = —. J п, пх Шаг 4. Выводим ФПС как параметрическую поверхность, заданную узловыми вершинами р0 V/ = 0,2геС/ п +1, у = 0,2геСт m +1 . □ На рис. 3.80, в приведено изображение горного ландшафта, построенного по алгоритму FPS на основе базовой сети с организацией 7x7 узлов. Центральное ядро базовой 5 х 5-сети позаимствовано из примера 3.20 (см. рис. 3.60), а по краям к нему добавлено предгорье. Для оживления пейзажа в ландшафт вставлено горное озеро с волнистой поверхностью, моделируемой функцией типа у(х, z) — /4sin(coA)cos(cox). Для создания ФПС были выбраны следующие формообразующие параметры: гее, - гесЛ - 5Д = 0.4. Кстати, благодаря тому, что специально выбрано значение К > 0.3, горы и получились такими складчатыми.
370 Глава 3 Рис. 3.80 3.1.5.3. Свойства фракталов После беглого знакомства с отдельными представителями бесконечно разнообразного фрактального мира можно поговорить об основных свойствах и закономерностях строения фрактальных объектов. Прежде всего отметим, что фрактал— это не линия или поверхность в виде привычных уравнений. Фракталы выражаются не в первичных геометрических формах, а в алгоритмах, которые трансформируются в геометрические формы с помощью компьютерной программы. Отличительной особенностью большинства фрактальных алгоритмов является их преимущественно рекурсивный характер, хотя некоторые фракталы можно строить и итерационным методом, наглядное подтверждение чему — линия Коха и алгоритм ее построения KOCHit (см. рис. 3.67, 3.68). Теоретически глубина рекурсии фрактала бесконечна. Окончательным результатом бесконечно повторяющегося цикла рекурсии является предельное изображение. Его можно определить вычислением суммы бесконечной геометрической прогрессии, но невозможно достичь в рамках самого процесса. Глубина рекурсии ограничена размерами изображения и разрешающей способностью дисплея отображать самые мелкие его детали. Примером вычисления глубины рекурсии фрактального алгоритма при заданном разрешении служит формула (3.83). При растяжении выделенной области с одновременным пропорциональным уменьшением размера минимального элемента алгоритм продолжает рекурсию до нового предела разрешения с появлением новых, невидимых ранее, элементов.
Математические модели поверхностей и объектов 371 Нами рассмотрены два типа фрактальных алгоритмов: детерминированные и стохастические. Алгоритмы первого типа абсолютно воспроизводимы: они дают идентичные изображения независимо от числа повторений. Стохастические алгоритмы дают большее разнообразие форм благодаря элементам управляемой случайности. Это же делает случайное фрактальное изображение неповторимым, что иногда является недостатком из-за невозможности заранее предвидеть результаты длительного расчета. По принципу преобразования элементов между итерациями или уровнями рекурсии фрактальные алгоритмы делятся на линейные и нелинейные. Нелинейный фрактал представлен множеством Мандельброта и другими алгоритмическими фракталами, рассмотренными выше. Линейное фрактальное множество образуется рекурсией аффинных преобразований определенного геометрического объекта. Преобразуемый элемент может перемещаться, вращаться, сжиматься, отражаться произвольным образом при условии, что прямые линии остаются прямыми. Примерами линейных фрактальных алгоритмов служат функции построения всех объектов, изображенных на рис. 3.67—3.80. К ним же относятся алгоритмы построения объемных фрактальных объектов, показанных на рис. 3.81. Рис. 3.81 По характеру изменения объема пространства, занимаемого фрактальными объектами, между соседними уровнями рекурсии алгоритмы и производимые ими объекты делятся на аддитивные и субтративные. Большинство известных фракталов относятся к аддитивным, т. к. в процессе дробления появляются новые элементы, увеличивающие объем занимаемого фракталом пространства. К суб- тративным можно причислить треугольник и пирамиду Серпинского, а также показанный на рис. 3.81, б куб со стремящимся к нулю предельным объемом. Почему мы так уверенно говорим, что обычная линия одномерна, полигон двухмерен, а полиэдр трехмерен? Ведь ясно, что показателем размерности объекта служит не размерность пространства, в котором он существует, а что-то другое. Линия может проходить и в трехмерном пространстве, тем не менее она од-
372 Глава 3 номерна. То же касается и поверхности — двухмерного объекта, который может существовать и на плоскости, и располагаться в пространстве RA Независимо от природы или метода построения у всех фракталов есть одно важное общее свойство, характеризующее степень их раздробленности и предельные свойства. Это некоторое характеристическое число D, называемое фрактачъной размерностью. Следуя идее Мандельброта, ее можно определить подсчетом числа элементов N, принадлежащих фрактальному множеству, при различных разрешениях 8 — минимальных линейных размерах элементов. При достаточно малом 8 выполняется условие iV-8B« const. Задав малые значения Si, 82 и подсчитав соответствующие числа N\ и ЛЪ, из условия A^Sf = yv2Sf получим оценку размерности фрактала: log(/V2/7V|) л~1оЖЖГ <3-97' Это соотношение приблизительное потому, что при определении принадлежности элементов объекту по принципу "да / нет" число N округляется до целого. Иначе пришлось бы учитывать дробные части элементов, что требует разрешения, меньшего 8. Поэтому правильнее будет определить предельную форму размерности: £>= lim ^ l°g(S,-/8,-+1), при 8,+i < 6,, (3.98) При выборе разрешений 8, совсем не принципиально условие их кратности. Однако, если при уменьшении разрешения в целое число раз ь,+1 постоянен предельный коэффициент увеличения числа элементов kN = lim 1 N, то получим более простую, чем (3.98), формулу расчета размерности фрактального объекта: Например, если при каждом уменьшении линейного разрешения в два раза число элементов увеличивается втрое, то размерность фрактального объекта оценивается числом D = log23 » 1.585.
Математические модели поверхностей и объектов 373 Вычислим по (3.98) размерность плоской замкнутой фигуры с постоянной границей. Зададим разрешение пространства плоскости 8i = 1, построим растр с шагом 8i и подсчитаем число "пикселов" растра, центры которых закрываются фигурой. Оно равно jVi = 9 (рис. 3.82, а). Уменьшив разрешение до 82 = 0.5, получим число новых "пикселов" N2 = 43 (рис. 3.82, б) и размерность D, = log2(43 / 9) * 2.2563. h :,с !. ♦- ^4 г ± -<>- -V ^5 Г ~<Л -с- sy ■4- --#-- --♦-- > / & -\>- -/>- "•-] -с- -о- i f ■f i ■6-0~CI-»-H>-#-f>"6~O-0~C> * с '"^"4Н>!1*^»г'4"ч1'"<Н>""{,"Т 12 3 4 12 3 4 5 6 Рис. 3.82 Продолжая двойное уменьшение 8, получаем последовательность #2 = log2(l67/ 43) «1.9574, #3 = log2(683 /167) «2.032, £>4 = log2(2 733 /683) «1.9962, Ds = log2(10 903 / 2 733) * 1.9999, достаточно быстро сходящуюся к размерности плоского нефрактального объекта, равной D-1. В отличие от привычных геометрических объектов, фрактальное множество не имеет постоянной границы. Она дробится с каждым уменьшением разрешения. У аддитивных фракталов происходит приращение "вещества", у субтративных — его сокращение. В результате размерность фрактала может быть дробной! Это свойство фрактальных множеств является их очередной удивительной особенностью. Использование формул (3.97)—(3.99) предполагает, что фрактал состоит из однородных элементов, как, например, линия Коха или треугольник Серпинского. Однако не все фрактальные множества таковы. Ветвь папоротника или фрактальная ломаная линия и построенные на ее основе поверхности (ФКП и ФПС) сложены из элементов разной длины или площади. Для вычисления размерностей таких объектов введем понятие среднего фрактального элемента длиной 8, площадью 82 или объемом 83. Количество фрактального "вещества" (назовем это массой фрактала М) в зависимости от числа степеней свободы фрактала п связано с числом средних элементов N длины 8 соотношением М = N- 8".
374 Глава 3 У линейного фрактала масса равна суммарной длине всех его отрезков, у площадного — сумме площадей, а у объемного — сумме объемов элементов. Прежнее определение размерности можно сформулировать в обобщенной форме: D= lim ( „ "\ l-log(M,+I/M,.)/log(7V,+I//V,)y (3.100) где под массой М>0 подразумевается длина линейного фрактала с п = 1, площадь площадного фрактала с п - 2 или объем объемного фрактала с п - 3. Из (3.100) следует: П при ненулевой предельной массе фигуры ее размерность совпадает с числом степеней свободы и. Следовательно, не все фрактальные множества имеют дробные или отличные от числа степеней свободы размерности; П если предельная масса аддитивного фрактала с Mi+] > М, неограниченно возрастает, то его размерность D> пи может быть дробной; П если предельная масса стремится к нулю, то такой субтративный фрактал с М,+1 < М, имеет размерность D <пи также может быть дробной. Рассчитаем размерности рассмотренных нами выше фрактальных объектов. П У линии Коха (см. рис. 3.67, а, б, в) на каждой итерации (или уровне рекурсии) один отрезок заменяется четырьмя отрезками втрое меньшей длины. Следовательно, б, = 3IJ, Nj — 4'', и по (3.99) этот линейный фрактал имеет размерность D = log34« 1.262. Аналогично получаем, что прямоугольные линии Коха, изображенные на рис. 3.69, имеют размерность D = logi5 « 1.465. То, что обе размерности больше единицы, говорит о бесконечной предельной длине этих аддитивных фракталов. П У "снежинки" Коха (см. рис. 3.67, е) как площадного фрактала с уменьшением линейного разрешения б, = 3м число треугольных элементов растет следующим образом: N\ = 1, Ni = 9iVi + 3, Nt, = 9N2 + 12,..., Ni+1 = 9N, + 3 • 4'"' = 0.2(8 • 9M - 3 ■ 4'"1). По определению (3.98) при lim (n,+i/N,)=9 получим D = logj9 = 2. Таким I—>co образом, несмотря на аддитивность фрактала, его размерность п не дробная, а равна двум — размерности геометрической фигуры с постоянной границей. Этот результат объясняется конечной предельной площадью фрактала Мм = — N^dl = — = 0.693 . 4 5 П Каждый элемент треугольника Серпинского (см. рис. 3.72) при разбиении заменяется тремя подобными треугольниками с вдвое меньшими линейными размерами. Поэтому по (3.99) размерность этого площадного фрактала D = log23 « 1.585. То, что она меньше двух, есть признак субтративного
Математические модели поверхностей и объектов 375 фрактала со стремящейся к нулю площадью. Действительно, т. к. б, = 2м и ЛГ;=3'Лто ,, S., я2 >/з (ЗТ . Mm= — N„6t= — - \-\ =0. 4 4 {4 J П Аналогично получим размерность объемного тетраэдра Серпинского (см. рис. 3.73, в), равную D - log24 = 2 < 3— признак стремящегося к нулю объема фрактала. Интересно, что предельная площадь боковой поверхности его элементов бесконечна: /7 А7 б, = 2'-', N, = 1 б'-1 => М„ = — Л^ = ^±- 4" = «>. 4 4 □ Ветвь папоротника (см. рис. 3.71) относится к линейным фракталам с неоднородными элементами: один отрезок длиной /за рекурсию обрастает тремя отрезками длиной пи I, mi I и тъ I. С учетом коэффициентов (3.85) относительная прирастаемая масса за одну рекурсию составляет т = т\ + тт + /то = 1.556. Подставив в (3.100) вычисленное в (3.82) число отрезков /V, = 0.5(3'- 1) и массу линейного фрактала М(=к11щ + т+т1 +... + т' 1)=k2hQ — 1 получим размерность ветви папоротника D = = 1.674>1. 1 - log3 т П Фрактальная ломаная линия также является стохастическим линейным фракталом с неоднородными элементами. Оценим размерность фракталов на рис. 3.75, генерируемых функцией FLLrec(a, b. К, б, гее) при б = 0 за rec = 8 рекурсий, с учетом зависимости (3.89) коэффициента удлинения усР(Л) от параметра к равномерного ГСЧ. Так как из N\ = 1 отрезка длиной М\ — 1 получается Ni - 2гес = 256 отрезков общей длиной Mi = ycp(?i) ~ 1 + 6Х2, то l-log256(l + 6A2J Например, D(0.1) * 1.011, /)(0.2) * 1.04, 0(0.3) * 1.084. За неимением результатов статистических исследований фрактальных кусочных поверхностей и полигональных сетей автор не может доложить читателю об их размерностях, но, очевидно, что они немного больше двух. □ Аналогичный изображенному на рис. 3.82 эксперимент по расчету размерности множества Мандельброта (см. рис. 3.63) при разрешениях б, = 0.1 • 21"' дал значения D, = \ogi{NM IN^, совершающие затухающие колебания в интервале [1.995, 2.005] вокруг предельной размерности D - 2 (рис. 3.83). Это означает,
376 Глава 3 что данный фрактал нельзя уверенно отнести ни к аддитивным, ни к субтра- тивным фрактальным множествам, и он имеет конечную и ненулевую площадь предельного изображения. D 2.01 2 1.99 1 2 3 4 5 6 7/ Рис. 3.83 В заключение темы перед последним цитированием "отца фракталов" хотелось бы вновь повторить, что репертуар фрактальных объектов неисчерпаем. Каждый объект является завершенным и единственным в своем роде алгоритмом — единицей смыслового значения фрактального языка. Овладев языком фракталов, можно изобразить дерево или гору так же просто, как архитектор описывает здание с помощью чертежей на языке традиционной геометрии. Благодаря эстетической привлекательности и бесконечной глубине содержания фракталь, привлекают внимание исследователей, дизайнеров и программистов к освоении: этого класса математических объектов. "Красота многих фракталов тем более поразительна, что открылась совершение неожиданно: мы хотели построить— с чисто учебной целью— всего лишь математические диаграммы, и можно было ожидать, что они окажутся сухими и скучными <..> Трудно найти человека, равнодушного к фракталам. Многн: считают, что знакомство с фрактальной геометрией подарило им совершенно неповторимые эстетические впечатления и обогатило новым научным опытом В этом смысле фракталы безусловно оригинальны настолько, насколько это вообще возможно" (Б. Мандельброт, [21]). 3.1.6. Графические поверхности Графическая поверхность описывается множеством отдельных точек, принадлежащих этой поверхности. Поточечное описание применяется в тех случаях, когд поверхность очень сложная, негладкая ни в одном своем фрагменте, имеет разрывы, отверстия и другие нарушения непрерывности. Это могут быть грунтовы; поверхности, рентгеновские снимки, компьютерные томограммы, данные локации и т. п. Практическая цель изучения графических поверхностей заключается ъ приобретении умения строить разноракурсные изображения и анимацию объектов, ограниченных графическими поверхностями.
Математические модели поверхностей и объектов 377 Согласно современной терминологии дискретные элементы пространства называются вокселами (VOlume piXEL), т.е. объемными пикселами. Вексельная технология подразумевает разбиение пространства на отдельные элементы и рассматривает их как неделимые. В отличие от математических точек, вокселы имеют ненулевой объем. Исходная информация о графической поверхности, состоящей из ив вокселов, задается массивом координат, организованным как линейный список P = \pi,-.,pn ) без учета или с частичным учетом взаимной близости точек, либо как их тх 3-матрица (при nm = /ь), соседние элементы которой соответствуют физически близким вокселам. Для создания впечатления о целостности графической поверхности ее элементы должны отстоять друг от друга на некотором оптимальном расстоянии. Оптимальная частота пространственной дискретизации вокселов должна быть такой, чтобы их изображения заполняли все пикселы экранного окна вывода без проколов и наложений (рис. 3.84). Например, если размер пиксела равен 0.25 мм, а масштаб изображения 1 /1000, то оптимальный интервал съема точек составляет 25 см. Рис. 3.84 Редкое расположение вокселов характерно скорее для независимых точек, чем для структурно упорядоченной поверхности (рис. 3.85, а). Не самым худшим способом заполнения пустых промежутков между редкими вокселами является увеличение их диаметра с небольшим перекрытием друг друга (рис. 3.85, б). При большой частоте съема резко возрастают машинные ресурсы, необходимые для хранения и обработки всех точек. Однако это не улучшает степени детализации изображения, т. к. его дополнительные точки не могут быть помещены между пикселами экрана. Избыточность дискретизации может быть полезна в том случае, если в дальнейшем потребуется увеличить графическое разрешение экрана или масштаб изображения (рис. 3.85, в). Рассмотрим особенности визуализации вексельных поверхностей. В начальном приближении воксел можно считать кубиком, а еще удобнее— шариком, равномерно окрашенным в некоторый цвет со. Также могут использоваться прозрачные вокселы. Введение атрибута прозрачности позволяет быстро изменять видимость отдельного воксела или группы вокселов без их физического удаления из массива данных.
378 Глава 3 • . • • * • < s V.- >- L«4 -I ... £v" ,s '' .< k\^ Рис. 3.85 Равномерная окраска изображения воксела на экране естественна, когда егс диаметр составляет примерно один пиксел. Для более крупного изображения вокселов можно использовать круги с равномерной (рис. 3.86, а) или градиентной заливкой. Последняя может быть как центральной (рис. 3.86, б), так и смещенной в направлении источника света (рис. 3.86, в). Эффект бархатистой поверхности создается путем изображения вокселов в виде аэрозольных пятен с радиально уменьшающейся плотностью точек (рис. 3.86, г). б Рис. 3.86 Простейшие способы изменения цвета или оттенка цвета равномерного окрашивания вокселов используют следующие направления сортировки: □ вдоль некоторой оси координат МСК, например, по высоте (см. рис. 3.85); П вдоль направления на наблюдателя 5, используя для сортировки точек р, числа di = \pj - S\ при ближнем или df - -р{ ° S при дальнем наблюдателе; П комбинирование этих двух способов: например, выбор цвета воксела по некоторой координате, а оттенка цвета — по удаленности воксела от наблюдателя. Максимально реалистичное окрашивание воксела по методу Ламберта (3.8) требует знания направления нормали к поверхности в месте его расположения. Ввиду неаналитичности и недифференцируемости воксельной поверхности аппроксимируем ее полиэдром, для чего каждую точку соединим ребрами с несколькими (минимум с тремя) ближайшими с ней точками. Пусть ближе всех к точкер,расположены точкиpjfpk и/?,. Вектор нормали ^вычислим усреднением, а еще проще — суммированием трех нормалей к треугольным граням PiPjPk,PiPkPiиPiPiPj (Рис- 3.87): Nijk = norm({p,ppk}), Nikl = погт({р,ркр,}), NHJ = norm({p,p,Pj}).
Математические модели поверхностей и объектов 379 Рис. 3.87 Наиболее сложен поиск ближайших к /?, точек поверхности путем сортировки скалярных произведений (Pj-Pi) ° iPj-Pt) = \Pj-Pil2 У/ = 1, «в J Ф i. Полный перебор требует очень больших вычислительных затрат. Рациональнее изображать графическую поверхность методом, подобным алгоритму z-буфера (см. рис. 3.6): 3 определяются экранные координаты всех вокселов [*/э Уп ° !]=[*/ У/ z, \\СЭ, где Сз — матрица преобразования пространственных координат точки в экранные; П из каждой группы точек с равными координатами {х3,уз} отбирается одна видимая точка/?,, ближайшая к наблюдателю 5, т. е. с минимальным значением d/ = \pj - S\ при ближнем или d, - -pt ° S при дальнем наблюдателе; 3 вычисляется нормаль 7V, и по (3.8) цвет окраски этой точки, который для простоты можно принять равным сш = \N ° %0ш Vco е {г, g, b} ■ Подводя итог сказанному, заключаем, что сложная и ресурсоемкая задача изображения графической поверхности затруднена отсутствием аналитического описания поверхности. Для ускорения перебора сначала находятся видимые во- кселы, которые затем изображаются шариками, окрашенными соответственно направлению нормалей. 3.2. Модели объектов в пространстве Объект есть часть пространства, заключенная между некоторыми границами. Границы играют важную роль в моделировании объектов компьютерной графики. Именно благодаря их непрозрачности объекты становятся видимыми, а от-
380 Глава 3 ражательные свойства ограничивающих поверхностей определяют их цветовое восприятие. Взаимная ориентация графических объектов также выполняется относительно их границ. В алгоритмах трассировки рассчитываются пересечения лучей с объектами в их граничных точках. Для ускорения расчетов в задачах ориентации и пересечения сложные объекты часто окружаются виртуальными габаритными оболочками простой формы в виде сферы или параллелепипеда. На рис. 3.88 приведена ктссификтщя моделей пространственных объектов. Наибольшее распространение получили три основных типа моделей [11]: каркасные, граничные и сплошные. Каркасная конструкция в виде проволочной сетки, охватывающей объект по линиям пересечения ограничивающих его поверхностей, является простейшим и самым примитивным способом передачи формы объемного тела. Проволочные модели применяются для быстрого, не требующего детальной визуализации, эскизного изображения объектов и их габаритных оболочек. МОДЕЛИ ОБЪЕКТОВ ] V ^ V Каркасные J Сплошные [ Граничные Вексельные Конструктивные Рис. 3.88 Граничное описание включает перечень всех элементов, создающих границы объекта— тонкие оболочки, под которыми находится пустое пространство. К граничным элементам объекта относятся: О грани— ограниченные поверхности, отделяющие внутреннее пространство объекта от внешнего; П ребра — линии пересечения граней; П вершины — точки пересечения ребер. Вершины, инцидентные (принадлежащие) одному и тому же ребру, как и грани, имеющие общее ребро, являются смежными. Количественное соотношение между числами вершин пв, граней яг и ребер иР замкнутого объекта устанавливается удивительно простой формулой Эйпера [7, 13]: пв+пГ=пр+2. (3.101) Граничное моделирование информативнее каркасного и позволяет выполнять более реалистичную визуализацию объектов. Каркасное изображение гранично определенной модели строится достаточно легко, т. к. задание ребер присутствует в структуре данных явным образом. Определенную трудность представляет
Математические модели поверхностей и объектов 381 выполнение над объектами булевых операций, при которых появляются новые граничные элементы, требующие расчета пересечений линий и поверхностей. Сплошная, объемная или твердотельная модель охватывает все точки внутри и на поверхности объекта. Описание сплошными телами подразумевает перечисление вокселов — мельчайших Зс1-ячеек, заполняющих объект, либо конструирование сложной формы как композиции небольшого числа простых объемных примитивов (куб, сфера, конус, цилиндр), с которыми выполняются необходимые аффинные преобразования. Последовательность конструирования описывается древовидной структурой, терминальными вершинами которой являются примитивы, нетерминальными — операторы над ними, а ветвями — матрицы преобразований промежуточных форм. Сплошные модели органично приспособлены к работе в системах логического конструирования сложных форм. Алгоритмы выполнения булевых операций (объединения, пересечения и дополнения) с Зс1-объектами являются составной частью данного способа моделирования, область применения которого — различные САПР твердотельных конструкций, системы архитектурного проектирования и им подобные. 3.2.1. Каркасные модели. Платоновы тела Назначение каркасной модели Зё-объекта— отражать форму его граней. В зависимости от их свойств выбираются методы построения каркасного изображения. В случае плоской грани вполне достаточно вывода ее ребер (рис. 3.89, а). Заметим, что условие планарности вершин грани (1.81)— только необходимое условие планарности всей грани. Следовательно, информация о свойствах граничных поверхностей объекта должна быть априорно известной. Адекватное восприятие объемной грани невозможно без вспомогательных каркасных линий, проведенных в междуреберном пространстве. Особенно это важно в случае планарности вершин грани, когда информация о дополнительных точках поверхности в принципе необходима. В подтверждение сказанного на рис. 3.89, б изображен объект, имеющий неплоскую грань с теми же планарными вершинами, что и на рис. 3.89, а. Очевидно, что без промежуточных каркасных линий реальная форма объемной грани не воспринимается. Для построения каркаса криволинейной поверхности грани с известными граничными элементами можно использовать алгоритмы кусочно-линейной интерполяции (см. разд. 3.1.3), а при задании дополнительных узловых точек внутри грани и на ее ребрах могут быть полезны методы сплайн-интерполяции (см. разд. 3.1.4.2). Каркасное изображение объекта с прозрачными гранями, построенное без учета удаленности ребер от наблюдателя, выглядит двусмысленным: восприятие формы и ориентации тела в пространстве у разных наблюдателей индивидуально. Один из них видит параллелепипед на рис. 3.89, а как бы сверху, для другого наблюдателя ближними и видимыми являются передняя, левая и нижняя грани. Большей реалистичности и однозначности восприятия можно достичь несколь-
382 Глава 3 кими способами: утолщением ребер видимых граней (рис. 3.90, а), пунктирным изображением (рис. 3.90, б) или вообще удалением невидимых ребер (рис. 3.90, в). В любом из этих случаев необходимо выполнять упорядочивание граней объекта по удаленности от наблюдателя и определять их видимость. Некоторые алгоритмы решения задач данного типа в общих чертах рассмотрены в разд. 3.1.1. Рис. 3.89 а v б ^^- Рис. 3.90 Описание каркаса Зс1-объекта включает следующие действия. П Нумерация элементов каркаса — вершин, ребер и граней. Для этого чаще используются сквозные (одноиндексные) номера, хотя иногда могут быть удобнее двухиндексные номера. Например, при сквозной нумерации вершин pt V/ = 1, пв двухиндексное обозначение rti несет информацию о том, что объект имеет ребро, соединяющее вершины/?, и/^. На рис. 3.91 построен и пронумерован сквозным образом объект, состоящий из пв - 9 вершин, пг = 7 граней и иР = 14 ребер. Не трудно убедиться в справедливости формулы Эйлера (3.101). П Задание или расчет координат вершин относительно начала координат (абсолютный метод) или некоторой базовой точки (относительный метод) и сохранение их в ив х Ъ-матрице координат Q. В качестве базовой точки можно выбрать центр симметрии объекта или любую вершину каркаса. Относительные координаты вершин предпочтительнее абсолютных, т. к. при геометрических преобразованиях объекта достаточно выполнить одну групповую операцию Q' = QC (3.102)
Математические модели поверхностей и объектов 383 вместо вычисления координат каждой вершины по сложным формулам аффинных преобразований. Рис. 3.91 U5 Задание пюпологии каркаса, т. е. указание порядка соединения вершин ребрами. Это можно осуществить следующими способами: • в каждом из /7Р списков-столбцов матрицы ребер R = Щ\ ... R„ \ записываются два номера вершин, соединенных ребром. Например, топология объекта, изображенного на рис. 3.91, описывается матрицей ребер "1234456716879 8" R = [2 341 567358192 9_- Список Rj может дополнительно содержать атрибуты i'-го ребра: цвет, толщину, стиль линии (сплошная, пунктирная и т. п.) и другие характеристики. Матрица ребер не содержит явной информации о составе граней каркаса, поэтому ее используют для изображения каркасной поверхности с прозрачными ячейками, не требующими расчета их видимости и окраски в зависимости от направления нормали; • в каждом из /7г списков массива граней G=\G\,..., G„ \ записываются номера вершин грани в порядке их обхода по замкнутому контуру в выбранном направлении. Крайние элементы списка G, ={g/i, .... g/„ , g,i) совпадают: они соответствуют одной и той же вершине Qg . Список G, может дополнительно содержать атрибуты /-ой грани: прозрачность, цвет, видимость, координаты вектора нормали и т. п. Если грани имеют разное число ребер, то списки в G будут неравной длины. Например, топологию граней, изображенных на рис. 3.92, можно описать списками G. = {1, 2, 3, 4, 1}, G2 = {3, 4, 5, 6, 7, 3}, G3 = {1, 5, 6, 8, 1}, G4- {1, 4, 5, 1}, Gs = {2, 3, 7, 9, 2}, G6 = {6,7, 9, 8, 6}, Gi = {1, 8, 9, 2, 1}.
384 Глава 3 Рис. 3.92 Если для объектов с числом граней нг < 10 перечисленные действия можно выполнить вручную, то более многогранные каркасные модели должны строиться исключительно алгоритмически. Серьезному программисту рекомендуется создать библиотеку моделей разных тел и алгоритмов их формирования. Построение каркаса с помощью введенных массивов выполняется путем поочередного сканирования списков используемого топологического массива: П по списку R/ на экране рисуется ребро между вершинами Qr и Qr . При этом каждое ребро каркаса выводится только один раз. Недостаток кодирования топологии матрицей R заключается в сложности определения всех ребер, входящих в состав конкретной грани; П по списку G, на экране рисуется замкнутый контур /-ой грани. Недостаток метода в том, что большинство ребер каркаса (а в замкнутых объектах — все ребра) выводится дважды. Применение кодирования топологии матрицей G оправдывается при построении непрозрачного каркаса, когда требуется выявлять лицевые грани и вычислять их окраску по направлению вектора нормали. Плоскость /-ой грани определяется точкой Q„ и нормалью Ni = norm(side(Q, G, ij). (3.103) Для ускорения вычисления нормали можно включить ее координаты в структуру списка грани, а при геометрическом преобразовании поверхности матрицей С пересчитывать по формуле (2.10): N- = NtC. (3.104) Второй вариант — включить векторы Nt в массив координат Q и выполнять совместное преобразование вершин и нормалей по (3.102).
Математические модели поверхностей и объектов 385 Перед тем, как перейти к изучению алгоритмов построения правильных многогранников и производных от них тел, сделаем некоторые важные дополнения. П Для правильной визуализации непрозрачных граней все нормали к ним должны иметь одинаковую ориентацию — либо внешнюю, либо внутреннюю. Если /-ая грань является плоским и выпуклым полигоном, то вычисленная по (3.103) нормаль будет иметь внешнюю ориентацию при направлении ее обхода против часовой стрелки с точки зрения внешнего наблюдателя. Таким образом, два списка граней объекта на рис. 3.91 следует формировать в виде Gt = {3, 6, 7, 5, 4, 3}, Gs = {2, 9, 7, 3, 2}. Обход невыпуклой плоской грани против часовой стрелки должен начинаться с такой вершины, чтобы угол между первыми тремя вершинами полигона был выпуклым. Например, топологию грани, заштрихованной на рис. 3.93, можно описать списком {1,2, 10,9,6,5, 1}, но не {10,9,6,5, 1,2, 10}. Рис. 3.93 Все сказанное здесь о необходимости правильного выбора направления обхода граней следует учитывать, если нормаль к грани рассчитывается по трем ее первым точкам. Если же вектор Nt получается способом, независимым от порядка перечисления вершин в списке грани G,, то этот порядок может быть произвольным. П Для описания полигона с отверстием введем фиктивное ребро ij, связывающее внешний и внутренний контуры полигона между /-ой и у'-ой вершинами (рис. 3.94, а). Отразим это добавлением в список грани индексов {...i,-j,...,j,-i,...}. Второй отрицательный индекс пары {... i,—j,...} означает, что при сканировании списка ребро ij не должно изображаться. Направление обхода полигона должно быть таким, чтобы он оставался все время слева. Например, топологию передней грани объекта на рис. 3.94, б можно определить списком {1,2,3,4,-12, 11,-19, 18, 17, 19,-11, 10,9, 12,-4, 1}.
386 Глава 3 Рис. 3.94 Рис. 3.95 Каркасные модели могут быть естественными или аппроксимирующими объекты с гладкими криволинейными граничными поверхностями. К естественным относятся модели полиэдров, из которых выделяются пять Платоновых тел (рис. 3.95). Число этих фигур определяется числом способов соединения однородных правильных полигонов в вершине полиэдра. Допустим, к вершине примыкают т > 3 правильных п > 3-угольников. Сумма их внутренних углов, каждый из которых равен уя = 180° - 360° In, должна быть меньше 360°, т. к. телесный угол при вершине не должен быть плоским. Из условия т ■ vj/„ < 360° и естественных геометрических соображений получаем систему неравенств т\п-1)<2п, п>Ъ, т>Ъ, имеющую всего пять целочисленных решений {п, т), изображенных на рис. 3.96: П {3,3}—тетраэдр (а); П {4, 3} — гексаэдр (б); П {3, 4} — октаэдр (в); П {3, 5} — икосаэдр (г); П {5, 3} — додекаэдр (д).
Математические модели поверхностей и объектов 387 Рис. 3.96 Приставка перед греческим корнем "эф" означает число граней полиэдра пг. Для любого Hr-эдра число ребер равно нР = nTnm / 2, а число вершин определяется по формуле Эйлера (3.43): пв = 2-П[- Птпт 12. Рассмотрим экономичные, т. е. с минимумом ручных расчетов, методы построения Платоновых тел, координаты пв вершин которых отсчитываются относительно начала координат— центра симметрии. Массив G, содержащий списки равной длины п + 1, будем задавать пг х (и + 1)-матрицей. Добавим к параметрам тела П длину ребра d; П радиус описанной сферы i?c; П длину ребра описанного куба dK. Зная эти величины, можно управлять относительными размерами тел: П деление матрицы Q на i?c дает тела, вписанные в сферу радиуса Rc - 1; □ деление матрицы Quad дает тела с ребрами единичной длины d - \. Переходим к детальному изучению моделей Платоновых тел. П Тетраэдр (п-1, пг = 4, «Р = 6, ив = 4)— простейший правильный полиэдр, построение которого в привычном виде (см. рис. 3.95, а) — вовсе не тривиальная задача из-за необходимости ручного расчета координат вершин. Вращая тетраэдр, вписанный в куб (рис. 3.97), на углы Ф, = -45°, Фх = arctg(V2 )= 54.7°, получим желаемое положение тетраэдра с параметрами 64 = -1 1 1 -1 *v(q>vk(4>*).G4= 3 2 2 4 4 3 2 3 4 , d = 2^2, Rc=fi,d* = 2.
388 Глава 3 Рис. 3.97 П Гексаэдр (и = 4, п, = 6, «Р = 12, пь = 8) или в просторечии куб прост в построении и расчете параметров (рис. 3.97): 66 = rf=2, Лс = л/з,Л = 2. П Октаэдр (п = 3, «г = 8, «Р = 12, лв = 6) также просто строится на основе куба (рис. 3.98) и имеет параметры 28 = 1 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -|Т 1] -1 1 , G6 = 1 1 1 2 2 3 5 7 6 8 5 7 2 6 1 3 5 1 4 7 1 4 6 2 3 8 2 4 8 3 0 1 0 1 0 0 0 0 1 -1 0 0 0 0" 0 -1 -1 0 rf = V2 т , G8 = ,Rc=\, 1 1 1 2 3 4 5 2 3 1 1 1 d* = 2. 1 5 4 1 2 3 6 2 2 6 5 2 3 4 6 3 4 5 6 4 Рис. 3.98
Математические модели поверхностей и объектов 389 П Икосаэдр (п = 3, иг = 20, пР = 30, «в = 12) конструируется по следующему алгоритму (рис. 3.99). & Шаг 1. В окружностях сечений у = ±Л цилиндра единичного радиуса х2 + z2 - 1 строятся правильные пятиугольники 1-3-5-7-9-1 и 2-4-6-8-10-2 (рис. 3.99, а) с координатами вершин х, = cos(36°/), z, = sin(36°/),у, = (—iy-'Л V/ = IjO . Шаг 2. Соединяя вершины 1-2-3-4-5-6-7-8-9-10-1, получим десять средних треугольных граней икосаэдра с длиной горизонтальных ребер <НЛ-Л| = 2*1 = 5-V5 Из условия получения равносторонних треугольников \pi-pl0\ = yJ4h2+zf+(l-xlf=1jl4h2+^-=d з-Vs" получим значение /г = 0.5. Шаг 3. Вычислив радиус описанной сферы ^n-ite+A2+*?=#. построим две вершины /?ц =[0 Яс OJ и р|2 =[0 -/?с 0J. Соединяя их с вершинами pi -=-рю, как показано на рис. 3.99, б. получим пять верхних и пять нижних граней икосаэдра. □ В результате получаем следующие параметры модели икосаэдра: "IT £20 = Х\ Х2 Х3 Х4 Х5 Х6 X-J Х8 Хд Х]0 h —h h -h h -h h -h 0 0 zl ?2 z3 z4 z5 z6 h -h Rc -Rc 0 0 z8 z9 z10
390 Глава 3 7 912345678 9102 4 6 810 11 11 3 3 5 5 7 7 9 9 1 1 12 12 12 12 12 9 12446688 10 10 2 102 4 6 8' 7 912345678 9 10 2 4 6 8 10 П Додекаэдр (п = 5, «г = 12, иР = 30, «в = 20) — наиболее сложное платоново тело. Оптимальный метод его построения заключается в предварительном создании икосаэдра и соединении центров его смежных граней ребрами (рис. 3.100). Отсюда получаем формулу расчета строк Q\7>1' матрицы координат вершин додекаэдра на основе матриц икосаэдра Q20 и G20: 02^ = - £02O<G2°"> V/ = ГгО . Рис. 3.100 Матрица граней додекаэдра и остальные его параметры равны "1 1 2 3 4 5 7 9 11 13 15 1б]т 5 2 3 4 5 1 8 10 12 14 6 17 4 8 10 12 14 6 9 11 13 15 7 18 3 7 9 И 13 15 18 19 20 16 17 19 ' 2 6 8 10 12 14 17 18 19 20 16 20 1 1 2 3 4 5 7 9 11 13 15 16 G20 = 1 3 5 11 11 И 3 5 7 1 3 5
Математические модели поверхностей и объектов 391 Путем построения дополнительных надстроек на гранях правильных полиэдров создаются различные объекты сфероидной и звездчатой форм. В первой группе объектов все вершины полигонов надстроек находятся на описанной вокруг полиэдра сфере; во второй группе надстройки над гранями полиэдра имеют форму лучей. П Для создания сфероидного объекта с параметрами {и, ив, Иг, Q, G, d, Re} каждая из «г граней полиэдра (например, грань {pip2 ...р„р\) на рис. 3.101) заменяется надстройкой из (и + 1)-ой грани. Центральная грань подобна исходной, ее вершиныр„,+рт+г1 лежат на прямых, соединяющих центр полиэдра с серединами ребер грани {pip2 ...рпр\), на расстоянии Лсот центра: Рт = [Pl+Pl} Rc > Pm+l = Vb+Рз} Яс . ■■■ . Pm+n-1 = \Pn + Pi} ^c ■ Рис. 3.101 Боковые грани {pm+n-, pi pj, {p„,p2pm+,},..., G?,„+«-2/>„/Vn-i} (равнобедренные, но не правильные треугольники) соединяются с соседними надстройками. Замена одной старой грани на (и + 1)-у новую грань алгоритмически означает выполнение следующих действий: • ив = «в + и, а в матрицу Q добавляется и новых строк; • «г = «г + п, а в массив G вместо списка, описывающего заменяемую грань, вставляется и новых списков. Выполнив аналогичные замены всех граней исходного полиэдра, получим модель сфероидного объекта, вершины которого лежат на поверхности описанной сферы. На рис. 3.102 изображены объекты этого класса, построенные на гексаэдре (а), октаэдре (б) и икосаэдре (в). Возможно итеративное надстраивание граней сфероидного объекта. После нескольких итераций объекты становятся близкими к правильным полиэдрам, но ими не являются: не все их грани — правильные полигоны, что отчетливо видно по несимметричности каркасной сетки. На рис. 3.102 показан результат двукратного надстраивания граней на гексаэдре (г), октаэдре (д) и икосаэдре (е).
392 Глава 3 Рис. 3.102 П Звездный объект на правильном полиэдре конструируется путем надстройки над каждой его гранью прямой пирамиды. Например, для грани {pi рг —рпр\) на рис. З.ЮЗ вершина пирамиды находится в точке Рис. 3.103 Коэффициент а задает длину луча в единицах расстояния от центра объекта до грани полиэдра. При а < 1 лучи направлены внутрь объекта. Замена одной старой грани на п новых треугольных граней {ртр\ рг}, {р,„Ргрз}, —, {/>,«/>«/»} алгоритмически означает выполнение следующих действий: • «в = ив + я, а в матрицу Q добавляется новая строка координат точки рт; • пг = Пг + п- I, а в массив G вместо списка, описывающего заменяемую грань, вставляются п новых списков.
Математические модели поверхностей и объектов 393 Выполнив аналогичАые замены всех граней полиэдра, получим модель звездного объекта. На рис. 3.104 изображены объекты данного класса, один из которых построен на додекаэдре с коэффициентом а = 0.75, а два других — на сфероидных объектах с а = 2. Рис. 3.104 3.2.2. Граничные модели Граничная модель представляет объект системой элементов, создающих его границы (поверхности, края поверхностей и указатели пересечения поверхностей), и топологической информации о соединении элементов друг с другом. Структура данных модели включает: П матрицы неявного описания плоскостей Fi и квадратичных поверхностей F2. Аффинное преобразование с матрицей С дает следующие преобразованные матрицы плоскостей и квадратичных поверхностей: F{ = C-XFx,Fi=C-XF2{f-x); П элементы неявного или параметрического описаний поверхностей высших порядков и трансцендентных поверхностей; П коэффициенты параметрических функций и интервалы изменения параметров, задающие края граничных поверхностей — линии их пересечения; П топологические матрицы граничных поверхностей. При моделировании объекта границами структура данных строится одновременно с процессом создания модели. Благодаря явному присутствию в этой структуре уравнений поверхностей и линий их пересечения легко решается задача каркасного изображения объекта. В отличие от каркасной модели с плоскими гранями граничное описание позволяет изображать нелинейную поверхность каркасом с криволинейными ячейками. Основной проблемой граничного описания является выбор возможных форм задания поверхностей. Так как поверхности в большинстве случаев непрозрачны, то для их правильной визуализации требуется, как уже неоднократно отме-
394 Глава 3 чалось, внешняя ориентация нормалей ко всем точкам поверхностей. Для обеспечения этого требования применяется метод заведомо внутренней точки ^вн: П в неявной форме описания поверхности ±f(p) = 0 одна из возможных функций +fiP) или -f(p) выбирается по правилу размещения точки pBH в области, где значение/ (р) < 0: /» = -sgn {/(?■„)}/(р). (3.105) В частности, матрицы поверхностей первого и второго порядков корректируются так: F\+ =-sgn{pBH о Ft }F,, F2+ =-sgn{pBHF2 pBHT ]F2 . (3.106) Это означает изменение знаков всех элементов матрицы F на противоположные, если для заведомо внутренней точки выполняется условие/(рвн) > 0; П в параметрической форме p{t,x) ориентация нормали N= Vx И7 определяется направляющими векторами V = р\ и W = р'х. При обмене параметров (отв функции p(t, т) нормаль меняет направление на противоположное. Это же происходит при расчете нормали по формуле N = W х V. Из двух возможных параметрических форм выбирается та, в которой угол между нормалью в точкеро и вектором рт -ро, направленным в заведомо внутреннюю точку /?вн, тупой: рв«: (рм ~ро) oN<0,rneN=VxW,V = М',*) dt W _ Эр(г,т) Ро Эх (3.107) Ро Это условие выполняется для любой внутренней точки выпуклого объекта и близкой кро внутренней точки невьтуклого объекта. Если для исходного уравнения p(t,x) условие (3.107) не выполняется, то его нужно либо заменить на р(г, t), либо вычислять нормаль как N = Wx V. Условие близости двух точек ро и рен-ро весьма важно. Построим, например, нормаль к замкнутой поверхности эллиптического тора с моделью (3.13) p(t,T)=[(as\n(T)+r)cos(t) 6cos(t) -(asin(i;)+r)sin(/)] Vf/re [о, 2я], r>a, r>b (3108) в точке p0 = [О 0 - (г - я)], соответствующей параметрам to = п I 2 и то = Ъп I 2: F = [-(r + asin(T))sin(f) 0 -(r + asin(i:))cos(/)] |f =[-(r-a) 0 О], W = [acos(t)cos(r) -6sin(r) -asin(f)cos(i;)]| =[0 b o], '0>X0 7V = *" У -(r-a) 0 0 b = [0 0 -b(r-a)].
Математические модели поверхностей и объектов 395 Она направлена внутрь тора. Выбор близкой к ро внутренней точки Рвн = [О О ~П подтверждает эту направленность: (рвн -ро) о N = ab(r - a) > 0. Корректируем (3.108) путем обмена параметров t <-> т: p(f,T)=[(flsin(f)+r)cos(T) 6cos(f) -(asin(/)+r)sin(T)] Vr.xe [0, 2л]. (3.109) Теперь нормаль 7V = [0 0 b(r-a)] является внешней к поверхности тора (рис. 3.105): (рвн -ро)° N = -ab(r -a)<0. Рис. 3.105 Однако, если выбрать не близкую к /?о, но тоже внутреннюю точку Рвн ~ [О 0 гJ, то тест (3.107) дает ложный ответ: {p'BH-Po)°N = (2r + a)(r-a)b>0. Многие объекты не являются замкнутыми, и часть их внутренней поверхности может быть видна одновременно с внешней (см. рис. 3.2, 3.8, 3.10, 3.12, 3.25 и др.). Для визуализации внутренних поверхностей они должны быть описаны как внешние. Другими словами, каждая тонкая оболочка, претендующая на двухстороннюю видимость, рассматривается как две граничные поверхности p(t,i) и /?(т, i) с противоположно ориентированными внешними нормалями. Если какая- либо внутренняя поверхность не видна ни при каких ракурсах, то включать ее описание в граничную модель нет необходимости. 3.2.3. Сплошные модели Сплошная модель включает в объект как граничные, так и внутренние точки. Это позволяет, во-первых, производить декомпозицию сложного объекта на простые составляющие— примитивы (кубы, сферы, конусы, пирамиды, призмы и т. д.); во-вторых, строить разнообразные композиции из простых примитивов. Процесс композиции заключается в выполнении аффинных преобразований
396 Глава 3 примитивов для создания нужных форм в нужном месте пространства и булевых операций с формами для создания единого объекта. Это очень напоминает строительный конструктор, позволяющий создавать разнообразные по архитектуре сооружения из типовых блоков. За счет небольшого числа примитивов и всего четырех булевых операций конструктивный подход к описанию сложных объектов и сцен позволяет уменьшить объем памяти и трудоемкость процесса построения сцены. Простейшая декомпозиция заключается в разбиении пространства сцены на кубические или сферические ячейки, называемые вокселоми (рис. 3.106, я), и установлении состояния каждой ячейки— свободна она или занята объемом тела. Структура данных воксельного объекта представляется трехмерной п х т х I- матрицей битов состояний ячеек пространства сцены. Рис. 3.106 При построении разрезов или сечений сплошных тел требуется временно удалить группу вокселов. Эту операцию удобно выполнять, управляя атрибутом прозрачности: выводу на экран подлежат только непрозрачные вокселы, а прозрачные можно даже не исключать из описания объекта для быстроты восстановления его неразрезанной модели. Вексельный метод моделирования прост, но требует большого объема памяти для описания крупных Зс!-объектов с хорошим разрешением. Если у воксельных поверхностей лишь один тонкий слой "вещества", то в объемном варианте этого метода объект состоит из множества слоев вокселов, и, что досадно, большинство внутренних ячеек, находящихся в глубине тела, практически никогда не будут видны, занимая, тем не менее, уйму машинной памяти. Уменьшение требуемых ресурсов достигается применением: П различных методов сжатия данных, аналогичных методам архивации файлов. Например, по методу группового кодирования можно хранить в памяти карту горизонтального плана некоторого воксельного пейзажа размером п х т. Каждая ячейка этой матрицы плана хранит всего два числа — минимальную и максимальную ординаты столбика вокселов, расположенного над данной клеткой (рис. 3.106, б). Это равносильно затратам памяти на хранение
Математические модели поверхностей и объектов 397 всего двух слоев и дает выигрыш в скорости вывода вокселов на экран, сокращая число обращений к массиву данных; Ш пирамидально-ячеечной структуры объекта, начинающей его описание с крупных кубических ячеек и рекурсивно разбивающей частично заполненные ячейки на подъячейки меньшего размера, пока не будет достигнуто желаемое пространственное разрешение. При этом наиболее мелкие ячейки группируются на границе объекта, а его внутренность охвачена небольшим числом крупных ячеек. У каждой ячейки-кубика изображается не более трех лицевых граней. Применение сферических вокселов более просто в визуализации, но сложнее в заполнении ими пространства объекта, т. к. приходится решать задачу вписывания сферы в область с криволинейными границами. Конструктивное моделирование представляет объекты комбинацией простых плоских и объемных примитивов. Простота примитивов означает относительную математическую простоту и удобство конструирования из них произвольных тел. Плоский примитив есть часть плоскости, ограниченная криволинейной замкнутой линией или полигоном. Объемный примитив есть часть пространства, ограниченная функционально описанными поверхностями первого и второго порядка. Выбор минимальных порядков граничных поверхностей обусловлен необходимостью аналитического решения задачи пересечения с ними светового луча. Каждый примитив имеет граничное описание. Исходное положение примитивов можно выбрать в начале координат, т. е. описывать их геометрию в собственных объектных координатах. Многообразие конструкций достигается аффинными преобразованиями примитивов. Например, граничное описание цилиндрического примитива состоит из: 3 матрицы F6oK=diag[l 0 1 — l] боковой поверхности цилиндра единичного радиуса; П матриц /-^= [О -1 О О] и /*"вер = [О I 0 -l] торцевых плоскостей, ортогональных оси цилиндра; П уравнений линий пересечения боковой поверхности с торцами: /w(')=fcos(f) 0 sin(r)], pBep(/)=[cos(f) 1 -sin(f)]. Рассмотрим правила построения комбинаций примитивов. Множество примитивов Пц Пг, ... , все пространство I и пустое пространство 0 образуют булеву алгебру со следующими логическими операциями (символ "•" означает точку). 3 Отрицание (дополнение до I) примитива П: •е (-Л), если «е П. (3.110) Выполнение этой операции означает: • изменение направлений нормалей ко всем граничным поверхностям на противоположные; • матрицы Fj плоскостей и квадратичных поверхностей заменяются на матрицы -F-,
398 Глава 3 • направления обхода полигональных граней заменяются на противоположные; • параметрические функции p(t, т) заменяются на функции р(х, t). П Объединение (сложение) примитивов П; и Пу: •е (П, + Пу), если (»е П,)11(»е Пу). (3.111) Выполнение этой операции заключается в расчете пересечения всех поверхностей примитивов П, и Пу. Поверхность объекта П, + Пу формируется из внешних частей поверхности П, относительно Пу и из внешних частей Пу относительно П,. П Пересечение (произведение) примитивов П, и Пу: •е (П,& П), если (.е П,)[>е П,). (ЗЛ 12) Поверхность объекта П, & Пу формируется из внутренних частей поверхности П, относительно Пу и из внутренних частей Пу относительно П,. П Исключение (вычитание) примитива П, из примитива П;: •е (П,-,П),еспи («е Пу)[>еПу). (ЗЛ13) Поверхность объекта П, -■ Пу- формируется из внешних частей поверхности П, относительно П, и из внутренних частей П, относительно П,. Логические операции подчинены следующим основным законам булевой алгебры: П законам отрицания -Л = 0,-,0 = I,-,(-,11) = П; (3.114) П коммутативным законам П, + Пу = Пу + П„ П,&Пу = Пу&П,; (3115) П ассоциативным законам (П; + Пу) + П, = П( + (Пу + П,), (П, & Пу) & Пд = П, & (П, & Пд); (3-!16> П дистрибутивным законам (П, + Пу) & П, = П, & П, + Пу & Пд., П, & П, + Ц. = (П, + Пд) & (Пу + Пд); С3-117> П законам двойственности де Моргана 4vn,.)=(-.n;.)&(-,n,.) 4i/&n7-)=(-Ji<)+^ny) (3.118) П законам идемпотентности П, + П, = П„ П,&П-П,, (З.П9)
Математические модели поверхностей и объектов 399 (3.120) П законам поглощения (П,. + П;)&П, = П„ п, & п, + п, = п,. Последовательность логических операций над примитивами при конструировании объекта называется его булевым описанием. Любое булево выражение, описывающее объект О, можно представить в виде объединения 2N пересечений N объектов о, — примитивов и их отрицаний: 2N ( N k=i yi=\ (3.121) где 0,С, означает воздействие на объект о, аффинного преобразования с матрицей С,. Данная каноническая форма булева описания может быть минимизирована широко известными в булевой алгебре методами карт Карно, диаграмм Эйлера (Венна) и т. д. [13]. Полная сплошная модель объекта включает его минимальное булево описание совместно с данными о типе каждого примитива, его граничной моделью, оптическими свойствами каждой поверхности и матрицами аффинных преобразований на каждом шаге конструирования сложного объекта или сцены. Процесс композиции можно изобразить в виде бинарного дерева с правилом обхода "от листьев к корню". Терминальные вершины (листья) означают исходные примитивы; узлы — логические операции; ветви — аффинные преобразования; корень— объект или сцена. Не лишне будет еще раз напомнить формулы аффинных преобразований матриц плоскостей и квадратичных поверхностей: F' = C~lF , F' = C~lF\f~lJ. Правила логического конструирования позволяют формальными методами рассчитать положение точки относительно замкнутого объекта. Оно определяется трехзначной функцией принадлежности ф(р, П) точки р примитиву П: <р(л п)= -1, если р внутри П; 0, если р на поверхности П; 1, если/? вне П. (3.122) Пусть выпуклый примитив П ограничен N поверхностями/ (р) - 0 V/ = 1, N', нормали которых внешне ориентированы по правилам (3.105)—(3.107). Функция принадлежности точки р примитиву П вычисляется аналогично тесту (1 122): 1, если f,{p)<0 V/ = 1,7V; ф(лП)=-| 1, если 3/e[l,/v]: f,(p)>0; 0, если не ±1. (3.123)
400 Глава 3 Точка лежит внутри выпуклого примитива, если в ней все значения/(р) < 0. Точка лежит вне примитива, если хотя бы одна из функций/(р) > 0. Точка принадлежит поверхности выпуклого примитива, если хотя бы одна из функций поверхностей в этой точке обращается в ноль, а остальные функции неположительные. Требование выпуклости примитива принципиально. Для убедительности достаточно вычислить по (3.123) функцию принадлежности точки, находящейся под гранью {5, 6, 7, 8, 5} объекта на рис. 3.93: Ф(р,П)=1, т.к. существует грань {9,10,11,12,9}, относительно которой эта внутренняя точка расположена снаружи. Правило (3.123) совместно с логической формулой (3.121) позволяет формально вычислить ориентацию точки относительно сложного объекта, полученного композицией выпуклых примитивов. Решение этой задачи актуально для его визуализации. В методе трассировки световой луч пересекает множество поверхностей различных примитивов (расчеты пересечений луча с плоскостью и квадратичной поверхностью даны в гл. 1). Из всех точек пересечения отбираются точки, принадлежащие границам объекта, а из них— ближайшая к источнику света или наблюдателю. Таким образом, нужно уметь вычислять ориентацию точки относительно комбинированного объекта. В табл. 3.3 приведены функции принадлежности точки объектам А, В и их логическим комбинациям. Объекты не обязательно должны быть выпуклыми. Главное, чтобы расчет по (3.123) выполнялся для выпуклых примитивов. Таблица 3.3 А -1 -1 -1 0 0 0 1 1 1 в -1 0 1 -1 0 1 -1 0 1 -.А 1 1 1 0 0 0 -1 -1 -1 А&В -1 0 1 0 0 1 1 1 1 А +В -1 -1 -1 -1 0 0 -1 0 1 А-.В 1 0 -1 1 0 0 1 1 1 Особенность трехзначной логики, заключающаяся в том, что -i0 = 0, накладывает ограничение на расположение примитивов с совпадающими границами. Во
Математические модели поверхностей и объектов 401 избежание ошибки расчета положения точки на общей границе двух объектов, когда ср(/>, А) - ф(р, В), должны быть запрещены совпадения границ в двух операциях (рис. 3.107), отмеченных в табл. 3.3: П внутреннее касание границ при объединении объектов. По табл. 3.3 определяем ф(р1, А + В) — 0, хотя в действительности точка р\ лежит внутри объекта А+В; П внешнее касание границ при операции исключения объектов. Согласно табл. 3.3 имеем ф(рг, А —> В) = 0, хотя в действительности точка рг лежит вне объекта А-\В. AS Рис. 3.107 Для исключения запрещенных совпадений границ между объектами А и В можно изменить один из примитивов, например, В, так, чтобы было (p(phB) =-l. Теперь по табл. 3.3 функции принадлежности определяются верно: ф(р|,Л +Б) = -1,у(р2,А-.В)= 1. СЭ Пример 3.21. Составить описание объекта, изображенного на рис. 3.108, а, и вычислить принадлежность объекту точек <7i=[l 3 3], д2=[2 3 3],<73=[3 3 з]. Решение. Выбрав примитивы П| (куб на рис. 3.108, б) и ГЬ (призму на рис. 3.108, в), составим бинарное дерево композиции объекта (рис. 3.108, г). Булево описание объекта имеет следующий вид: О = (П1С1) & (П2С2) -л (П1С3). Сформируем массивы неявного описания плоскостей объектов ГЬ, Ш и матрицы аффинных преобразований С\ + Су. П, = 1 0 0 1 0 1 0 -1 0 0 1 -1 -1 0 0 0 0 -1 0 0 0 0 -1 0 По ЕЕ 0 1 1 1 1 0 0 -1 -1 0 0 0 0 -1 0 0 0 0 -1 0 (3.124)
402 Глава 3 С, = 6 0 0 0 0 6 0 0 0 oi 0 0 6 0 0 1 . Q> = 8 0 0 0 0 8 0 0 0 0 8 0 0" О О 1 . с3 = 2 0 0 0 0 5 0 0 0 0 5 0 2 2 2 1 Рис. 3.108 Матрица Сз выбрана так, чтобы внешние грани объектов IIiCi и ГЬСз не совпадали. Обходя дерево от листьев к корню, формируем массив матриц плоскостей объекта: n,c,s 1 0 0-100 0 1 0 0-10 0 0 10 0-1 -6-6-6 0 о о п2с2- 0 1-10 0 1 0 0-10 1 0 0 0-1 -8-8 0 0 0 ПА- 1 0 0-100 0 1 0 0-10 0 0 10 0-1 -4 -7 -7 2 0
Математические модели поверхностей и объектов 403 0 = (П.С^&^С 1 0 0 1 0 0 -6 -6 0 0 1 -6 2)- -1 0 0 0 " 1 0 0 -6 0 -1 0 0 0 1 0 -6 0 0 -1 0 0 0 1 -6 0 1 1 -8 -1 0 0 0 0 1 1 -8 0 -1 0 0 -1 0 0 4 0 0 -1 0 1 0 0 -2 0" 1 1 -8 0 1 0 -2 » 0 0 1 По формуле (3.123) вычислим функции принадлежности точек q\ +дз примитивам П1С1, П2С2 и П1С3, а по табл. 3.3 — всему объекту О: □ Фи = ф(#|,П|С0 = -1,ф12 = ф(<?1,П2С2) =-1,ф1з = ф(<71,П1Сз)= 1: фП &ф12 -1 ф13 = (-l)-i 1 =-1, из чего следует, что точка q\ находится внутри объекта О; 3 ф21 = ф(#2, П1С1) = -1, ф22 = ф(#2, ШСг) = -1, фгз = ф(<72, П1С3) = 0: ф21 & ф22 -1 ф23 = (-1) -1 0 = 0, откуда следует, что точка qi лежит на поверхности объекта О; 1 фз1 = ф(#з, П1С1) = -1, фзг = ф(<?з, П2С2) = -1, фзз = ф(#з, П1С3) = -1: ф31 & ф32 -1 фЗЗ = (-1) -1 (-1) = 1, откуда следует, что точка дз лежит вне объекта О. СЗ
Глава 4 Геометрические задачи визуализации В этой главе рассматриваются методы решения главных геометрических задач визуализации — отсечения элементов, не попавших в область отображения сцены, и удаления элементов, заслоненных (экранированных) другими элементами от наблюдателя. В результате на экране дисплея формируется изображение, несущее наблюдателю важнейшую информацию о пространственном строении объектов сцены и их взаимном положении. Последующие более тонкие и трудоемкие оптические алгоритмы делают изображение реалистичнее и красивее. Сложность геометрических задач визуализации привела к появлению большого числа различных способов их решения. Некоторые из них разработаны в расчете на специализированные приложения и учитывают их нюансы, другие более универсальны, имеют широкий круг применения, но менее проработаны в частностях. Не следует считать, что разработка алгоритмов визуализации в настоящее время завершена. Усвоив основные идеи методов отсечения и удаления, описываемых в этой и других книгах, читатель сможет самостоятельно разобраться в новых появляющихся алгоритмах или разработать свои алгоритмы применительно к конкретному приложению. 4.1. Логические операции со списками Для работы с данными, объем которых заранее неизвестен, используются динамические массивы— списки различных типов данных. Поскольку настоящая книга не является учебником по программированию, то в планы автора не входит рассмотрение разнообразных типов списков, методов их структурной организации и программной реализации. Квалифицированным программистам все это хорошо известно, а просто любопытным читателям можно войти в курс дела, например, по книгам [5, 30] и не стареющей во все времена "библии программиста" [12]. Перечислим операции со списками: П вычисление размера списка size(L) — числа содержащихся в списке L элементов; !П инициализация пустого списка L = 0. Размер пустого списка size(0) - 0; у" 1 />С>,
406 Глава 4 П добавление е—>Ь нового элемента е в конец списка Ь с увеличением размера Ь на единицу; П исключение L —> е из списка Ь элемента, значение которого равно е. Если такой элемент в списке найден, то после его исключения размер списка size(L) = size(L) - 1, в противном случае список Ь не изменяется. Возможен вариант операции исключения из списка всех элементов, равных е. Тогда значение size(L) уменьшается на число исключенных элементов; П слияние (конкатенация [4]) двух списков Ь\ и Ьг в список Ь- Li v Ьг, включающий все элементы каждого списка независимо от их суммарной кратности в списке Ь. Размер конкатенации size(L) = size(L\) + size(Li)\ П объединение (дизъюнкция) двух списков Ь\ и Ьг в список L = Lj U Ь2 минимальной длины путем записи в него объединений элементов Ь\ и Ьг. Размер объединенного списка size(L) < size(L\) + size(Li); П пересечение (конъюнкция) двух списков L\ и Ьг в список L-L\V\L2 минимальной длины путем записи в него пересечений элементов L\ и Lr, П исключение L\ -, Ьг из списка Ь\ пересечений с элементами списка Ьг; П сортировка sort{L) элементов списка Ь по критерию с. Чаще всего критерием с сортировки является возрастание или убывание элементов либо самого списка L, либо какого-нибудь другого списка. Логические операции со списками скалярных (L) и векторных {Ьр) переменных имеют переборный характер. Рассмотрим их выполнение на примере списков скалярных данных Ь\ - {а\, ...,ап) и Ьг = {Ы, ...,Ь,„}. Ввиду простоты действий с множествами точек ограничимся словесным описанием алгоритмов. П Алгоритм слияния Ь - Ь\ v Ьг заключается в создании списка Ь — Ь\ и поочередном добавлении ^ —> Lb него всех j = \,т элементов списка Ьг. П Алгоритм объединения Ь = ^иь2 можно реализовать двумя методами—ао- дитивньш (с добавлением элементов) и субтративным (с удалением элементов): • после инициализации пустого списка Ь = 0 в него последовательно добавляются элементы я, V/ = 1, п и Ь; V/ = 1, т, не содержащиеся в текущем списке L; • из конкатенации Ь- L\v Ьг исключаются все кратные элементы путем и\ попарного сравнения. Удаление из произвольного списка Ь всех кратных элементов выполняется с помощью операции L = L(J0. По аддитивному методу из списка Ь как ис-
еометрические задачи визуализации 407 точника данных в список L (приемник данных) будут скопированы (через вспомогательный буферный список) только некратные элементы. По субтра- тивному методу элементы конкатенации Lv0-L попарно сравниваются друг с другом и в приемник L копируются только непересекающиеся элементы. П Алгоритм пересечения L = Ij П £2 также может быть выполнен аддитивным и субтративным методами: • после инициализации пустого списка L — 0 в него добавляются элементы о, = bj, общие для обоих списков-сомножителей; • из списка L = Lj U0 исключаются элементы, не совпадающие ни с одним из элементом bj. TJ Алгоритм исключения L - L\ —, Li также реализуется двойственным образом: • после инициализации списка L = 0 в него добавляются элементы a^bj первого списка, отсутствующие во втором списке; • из списка L = L\ \J0 исключаются элементы, совпадающие хотя бы с одним из элементов Ь,. Не трудно видеть, что аддитивные варианты всех алгоритмов предпочтительнее субтративных как по трудоемкости, так и по автономности, т. е. независимости от алгоритмов выполнения других логических операций. Теперь рассмотрим логические операции со списками отрезков Ls\ = {a\b ,anbn},Ls2= {ndi,... ,c,„dj, размещенных на плоскости или в пространстве. В отличие от списков типа L и Lp, элементы которых являются объектами нулевой длины, в списках типа Ls зозможно частичное совмещение отрезков я,й, и Cjdj, лежащих на одной прямой. Эти отрезки необходимо выявить либо отличающимися друг от друга тестами коллинеарности (1.20) на плоскости или (1.91) в пространстве, либо едиными, работающими в пространстве любой размерности, тестами: 3 параллельности пар векторов {Ь, - а„ dt - с,} и {bt - ah Cj - о,-}: l| b,-a,oelj-Cj\ = \ ]п{|*(-о(°су-о(| = 1 j; (4Л,а) 3 (1.17, б) в R2 — он же (1.79, б) в R3 — расположения четырех точек а,-, Ь„ с} и d} на одной прямой: rang d.-c. =1. (4.1,6) 'ь, dJ IеJ -<ч ~CJ ~a> В алгоритмах, изложенных ниже, будет использован тест (4.1, а), позволяющий отсеять неколлинеарные отрезки уже после первой проверки на параллельность. В то же время вариант теста (4.1, б) также вполне эффективен. Он срабатывает, если тестируемая 3 х л-матрица (п — размерность пространства R", содержащего
408 Глава 4 отрезки) не имеет ни одного ненулевого 2 х 2-минора, общее число которых равно трем при п = 2 или девяти при п - 3. Достоинство этого теста — отсутствие вычислений длин векторов и их нормировки. Эти две операции выполняются приближенно и служат источниками вычислительных погрешностей, тогда как расчет определителей в (4.1,6) является целочисленным и может производиться непосредственно с экранными координатами точек. После нахождения пары коллинеарных отрезков с множеством их точек совершается необходимая операция. Наиболее эффективный алгоритм обработки списков отрезков основывается на комбинированном аддипшвно-субтрапшвном методе. 4.1.1. Объединение списков отрезков Изображенный на рис. 4.1, а алгоритм объединения Lsi\jLs2 списков отрезков Ls\ и Lsi начинает работу со слияния исходных списков в конкатенацию Ls = Ls\ v Lsi = {го h'i, ..., u,w,} с 1 = n + m элементами w, и-, = cijbj Vi = 1, n, un+jn'„+, = Cjdj Vi = l,m. Определим направляющий вектор /-го отрезка V, = Wj - и, V; = 1,/. До тех пор, пока / > 2, т. е. список Ls содержит более одного элемента, итеративно выполняются следующие действия. & Шаг I. Перебираем пары отрезков u,w, V/ = 2,/ и «;и'; V_/ = 1, /-1, пока не будет обнаружена коллинеарная пара. Два отрезка с номерами / и j коллинеар- ны, если (рис. 4.1,6): О параллельны векторы Vt и Vj, т. е. П параллельны векторы ^иму-м„т. е. |^4y-«.)|=i- Если ни одна пара элементов Ls не удовлетворяет этим условиям, то алгоритм возвращает текущий список Ls и заканчивает свою работу. Шаг 2. Для найденной пары отрезков {м, vr„ г<, и,} по (1.19) вычисляем координаты l и т точек Uj и Wj в одномерном пространстве их общей прямой, при этом начало координат лежит в точке и„ а единица— в точке и-v (рис. 4.1, в). Если окажется, что t > х, то путем обмена параметров t <-> т обеспечиваем сонаправленность объединяемых отрезков (рис. 4.1, г).
Геометрические задачи визуализации 409 Шаг 3. Тестируем перекрытие отрезков u,w, и UjWj по логическому пересечению числовых интервалов [0, 1] и [{, т]. При t > 1 или т < 0 отрезки не имеют ни одной общей точки и остаются в списке без изменения (рис. 4.1, г). В противном случае при /<1 (рис. 4.1,()) и т>0 (рис. 4.1,е) вычисляем дизъюнкцию pq=UjWj \JujWj — новый отрезок, концевые точки которогор и q имеют в масштабе отрезка u,w, координаты min{0, /} и тах{ 1, т} соответственно. Шаг 4. Элементы w,w, и w; w; исключаем из списка Ls, а отрезок pq в него добавляем. Декрементируем размер списка / = /- 1 и переходим на проверку условия /> 2 перед шагом 1. □ Ls ( = LS] b,Ub-2 V vLs2, 1 = ) size(Ls) — end—< i-i > ...i r Vr»-r», > ' .(-1 -end- ( Возврат Ls J J>(u -„) Vi°(Wj-lt,) t= , x= *■ V.oV. v.°v. /<->x p = ui + min^,tyi 9=u/ + max{l,xK Ls = Ls—iu^Vi—iU^Vj pq—*Ls, /=/-1 Рис. 4.1, a
410 Глава 4 Внешний цикл алгоритма заканчивается, когда в Ls не останется ни одной парь, перекрывающихся коллинеарных отрезков, либо размер списка / станет равным 1 Возвращаемый алгоритмом список содержит все попарно непараллельные отрезки списков Lsi и Lsi, а также все дизъюнкции коллинеарных отрезков. Особенностью изложенного алгоритма является первоначальное формирование конкатенации Ls~Ls\\/Lsi, в которой все отрезки являются равноправными независимо от их принадлежности исходным спискам. Следовательно, алгоритм объединения списков отрезков можно применять для дизъюнкции отрезков одного списка Ls с помощью операции Ls = Ls U 0. & Пример 4.1. Рассчитать объединение двух списков отрезков Ls\ = {a\b\,aibi, тЬъ) и Lsi = {c\d\,C2di,nds}. Взаимное расположение отрезков показано на рис. 4.2, а. Для наглядности отрезки немного смещены от несущих их прямых. Решение. Формируем конкатенацию из / = 6 отрезков (рис. 4.2, б), которые графически будем обозначать направлениями и номерами в списке Ls. В поиске коллинеарных перекрывающихся отрезков перебираем пары {2, 1} (не коллине- арны), {3, 1} (коллинеарны, но не перекрываются), {3, 2}, {4, 1}, пока не находич нужную пару отрезков {4, 2}, для которых значения параметров 0 < t < 1 и т > 1 Следовательно, концы объединенного отрезка равны р - С] + (d\ - с]) ■ min{0, /} = с\, q = c\ + (d\ -n) • тах{1,т} = Ьг. После удаления из списка Ls второго, четвертого отрезков и добавления нового отрезка/?<7 нумерация элементов становится такой, как изображена на рис. 4.2. 6
Геометрические задачи визуализации 411 Повторяя поиск из / = 5 элементов списка, находим пару перекрывающихся отрезков {3, 2}, для которых t > 1 и т < 0. Так как t > т, то после обмена получим t < 0, т > 1 и концевые точки/? = div\q — ci. Удалив второй, третий и добавив новый отрезок pq, получим размер списка / = 4 и новую нумерацию его элементов, показанную на рис. 4.2, г. Рис. 4.2 Аналогично, при объединении в этом списке третьего и второго перекрывающихся отрезков получим t > 1 и 0 < т < 1.. После обмена параметров будет нужное соотношение 0 < t < 1 < т и концевые точки объединенного отрезка р = съ и q = с\. Удаление двух отрезков и добавление отрезка pq дает список из / = 3 элементов (рис. 4.2, д). Анализ расположения этих отрезков показывает, что среди них нет ни одной перекрывающейся пары. Таким образом, мы получили окончательный состав и расположение отрезков объединения списков Ls\ и Lsz, изображенные на рис. 4.2, е. □ 4.1.2. Пересечение списков отрезков Алгоритм пересечения Lsl f]Ls2 списков отрезков Ls\ и Lsi (рис. 4.3, а) построен по аддитивному методу. Сначала инициализируется пустой список Ls = 0, в который будут добавляться конъюнкции pq = ajbir\CjdJ каждого отрезка списка Lst с каждым отрезком списка Lsi. В том случае, когда любой из исходных списков пустой, т. е. имеет нулевой размер, алгоритм возвращает пустой результат и заканчивает работу.
412 Глава 4 Пересечение отрезков я,ft, и Cjdj не пусто, если они: П коллинеарны, т. е. (N^T^h1 WH^)|=i}. где V=bi-ai; П перекрывают друг друга при {/<1}П{т>0}, где t и т > t — вычисляемые по (1.19) координаты точек Cj и d, в масштабе отрезка atb,. Если окажется, что t > т, то путем обмена t <-* т делаем отрезки со- направленными. Концевые точки конъюнкции р и q имеют в масштабе отрезка яД координаты max{0, t) (рис. 4.3, б) и min{ 1, т} (рис. 4.3, в) соответственно. ( ь.ПЬ; ) Г Возврат /л J — end—^j= 1.../и ^> ; K»^-g|) T_^-ai) <<-»T /)=о,+К-тах{0,<} <7=а;+Р-тт{1,х} pq—>Ls Рис. 4.3, a
Геометрические задачи визуализации 413 Рис. 4.3, б— е & Пример 4.2. Рассчитать пересечение двух списков отрезков Ls\ = {a\ Ы,агЬг, аъЬг) и Lsi = {с\ d\,cidi, сз А}. Взаимное расположение отрезков показано на рис. 4.3, г. Решение. Инициализируем список Ls = 0. В поиске коллинеарных перекрывающихся отрезков {ajbhCjdj} первой находим пару {агЬг, c\d\}, для которой значения параметров 1<0и0<т< 1. Следовательно, первый отрезок, помещенный в список Ls, имеет концевые точки, изображенные на рис. 4.3, д: pi = ci2 + (bi-ai) ■ max {0, t) = m, q\-ai + (bi-ai) ■ min{l,x} = d\. Вторая пара отрезков {aibi, ы А} характеризуется параметрами 0 < т < 1 < t. После обмена 0 < t < 1 < т получим второй отрезок списка Ls с концевыми точками /72 = Л и qi = Ьг. Наконец, третья пара {азЬз, cidi) с переставленными параметрами t < 0 и т > 1 добавляет в Ls отрезок pi </з = аз Ьъ. Окончательный состав списка Ls изображен на рис. 4.3, е. □ 4.1.3. Исключение списков отрезков Алгоритм исключения Ls\ -i Lsi отрезков списка Lsi = {с\ di,..., c„,d„,} из отрезков списка Ls\ - {a\b\,... ,anb„} изображен на рис. 4.4, а. Принципиальное отличие операции исключения отрезков от других логических операций с отрезками и от исключения списков скаляров и точек заключается в возможности получения более одного результирующего отрезка при полном перекрытии отрезка C/dj отрезком Ojbj.
414 Глава 4 ( Ц^»2 ) <HZ> end ( Возврат Ls J ■end -< ^1 -m > c(£/,-C, <^V->(cy- "4^>- V°(dj-i -<1 ',) <<->т, Cj<r+dj ufi,—*Ls Рис. 4.4, a
Геометрические задачи визуализации 415 Рис. 4.4, б—к Вначале формируется список Ls = Lsi = {uiw , M/W,} с 1=п элементами ii/Wj = a,bj. Если список Lsi пуст, т. е. m = 0, то алгоритм возвращает Ls и заканчивает работу. Иначе, пока размер исключаемого списка / = size(Ls) > О, производится аналогичный предыдущим алгоритмам поиск пары перекрывающихся отрезков {u,whCjdj} V/= 1,/, j = \,m. В зависимости от их ориентации, определяемой значениями координат t и т > t концевых точек с, и dj в масштабе отрезка м, Wj (при х < t выполняются обмены параметров Юти точек с, <-» dj), возможны следующие варианты действий: □ при t < 0 и т > 1 отрезок u,w, целиком перекрывается отрезком Cjdj (рис. 4.4, б); □ при 0 < t < 1 неперекрытая часть щс} отрезка ц н>, добавляется в Ls (рис. 4.4, в); □ при 0 < т < 1 неперекрытая часть d} w, отрезка щ w, добавляется в Ls (рис. 4.4, г).
416 Глава 4 После этого отрезок г/, и1, удаляется из списка Ls. В связи с изменениями размера списка Ls и нумерации его элементов алгоритм повторяет анализ отрезков с начала. Завершение работы алгоритма, не считая упомянутого случая т = 0, происходит либо при получении пустого списка Ls = 0, когда все отрезки a,b, перекрыты отрезками с,^, либо при исчерпании пар перекрывающихся отрезков {м,и'„ Cjdj}. & Пример 4.3. Рассчитать исключение отрезков списка Lsi = {с\ d\, cidi, adi) из отрезков списка Ls\ — {а\Ь\,агЬг,аъЬъ\. Взаимное расположение отрезков показано на рис. 4.4, д. Решение. Создаем список Ls с тремя элементами м,и', = я,6, и ищем пары перекрывающихся отрезков {UjWhCjdj}. Первой находим пару {inwi, c\d\), для которой 0 < t < т < 1 (рис. 4.4, е). Исключив из Ls отрезок иг т и добавив два отрезка агс\ и d\ Ьг, получим конфигурацию, изображенную на рис. 4.4, ж. В следующей паре отрезок иг т (под ним теперь скрывается аз Ьъ) полностью перекрыт отрезком сг di и поэтому удаляется из Ls (рис. 4.4, з). Анализируя третью пару отрезков {мзи'з,гзЛ} с параметрами (после обмена) О < t < 1 < т, удаляем из Ls отрезок мзи'з и добавляем туда d\ di. В получившейся конфигурации отрезков (рис. 4.4, и) нет ни одной перекрывающейся пары. Окончательный состав списка Ls показан на рис. 4.4, к. О 4.2. Методы отсечения Отсечение (clipping) есть процедура обнаружения и исключения из дальнейшего анализа элементов сцены (линий, поверхностей, объектов), которые не попадают в видимую область, отображаемую на экране. Эта операция выполняется одной из первых в процессе визуализации. Она позволяет существенно снизить трудоемкость расчета сложной пространственно протяженной сцены за счет раннего исключения из дальнейшей обработки многих объектов в условиях ограниченной видимости. Помимо задачи визуализации алгоритмы отсечения могут использоваться в системах конструктивного моделирования для выполнения логических операций с плоскими и пространственными объектами и построения сечений, в различных тестах ориентации, при построении оптических эффектов — теней, отражений и преломлений — на ограниченных поверхностях, для создания многооконного интерфейса прикладных программ со сложной, т. е. не прямоугольной, формой окон и т. д., и т. п. Объект, устанавливающий границы области отсечения, называется отсекателем. В зависимости от размерности, области действия, сложности формы и средств реализации отсекатели бывают: □ плоскими (2d), например, окно на экране дисплея, в котором строится изображение сцены. Такое не слишком трудоемкое отсечение производится на конечной стадии отображения объемной сцены, многие элементы которой, возможно, не попадут в окно;
Геометрические задачи визуализации 417 □ объемными (3d), например, призма (при параллельном проецировании) или пирамида (при центральном проецировании) видимости — это полиэдры, в основаниях которых лежит картинная плоскость, а боковые грани ориентированы параллельно лучу зрения наблюдателя. Более трудоемкое в сравнении с плоским, отсечение по объему исключает заведомо невидимые элементы сцены из дальнейшего анализа, т. е. до расчета их взаимного положения с другими элементами. Это дает значительную экономию машинных ресурсов; □ внешними, отбрасывающими элементы сцены, находящиеся вне отсекателя. Последний играет роль ограниченного окна, через которое объекты сцены видны наблюдателю; □ внутренними, отбрасывающими элементы сцены внутри отсекателя. Последний играет роль ограниченной ширмы, которая загораживает объекты сцены от наблюдателя; □ регулярными, имеющими форму плоской (прямоугольник) и объемной (параллелепипед) фигур, ориентированных по координатным осям. Для этих простейших форм отсекателей разработаны специальные упрощенные, но зато и более быстрые алгоритмы отсечения; □ нерегулярными, имеющими произвольную форму. Алгоритмы, работающие с такими отсекателями, более сложные и ресурсоемкие; □ аппаратными, реализованными микропроцессорными средствами СБИС центрального процессора, контроллеров, графических ускорителей и т. д. Обычно аппаратные отсекатели ограничиваются простейшими — регулярными или выпуклыми — 2d- и 3d^opMaMH; □ программными, создаваемыми в отсутствие аппаратного отсекателя или нестандартных ситуаций отсечения. Программные алгоритмы часто имеют недостаточное быстродействие в приложениях, ориентированных на процессы, протекающие в реальном времени. В гл. 1 нами уже рассматривались некоторые методы внешнего выпуклого отсечения отрезка на плоскости и в пространстве. Эту операцию выполняют функции clip2_cross (см. рис. 1.18), clip2_test (см. рис. 1.19), clip3_cross (см. рис. 1.47) и clip3_test (см. рис. 1.48). В разд. 1.3.5.1 было рассмотрено два варианта модификации этих алгоритмов для выполнения внешнего выпуклого отсечения луча. В рамках тех знаний было затруднительно построить систематическую методологию различных видов отсечения, перечисленных выше. Теперь это стало возможным, в связи с чем далее разрабатывается пакет алгоритмов отсечения, рассматриваемых в порядке возрастания их сложности. Структурная схема пакета приведена на рис. 4.5. Форма модулей алгоритмов отсечения условно отражает форму отсекателя: регулярный, выпуклый, невыпуклый, плоский или объемный. Отсекаемые этими модулями фигуры (отрезки, полигоны или полиэдры) показывают решаемые алгоритмами задачи внешнего или внутреннего отсечения. Округлые модули выполняют вспомогательные функции, необходимые для работы основных алгоритмов. Стрелки, соединяющие модули, обозначают использование модуля-источника модулем- приемником.
418 Глава 4 Алгоритмы отсечения С Плоские J Объёмные) reg_outclip2 Рис. 4.5 Сравним две тактические схемы выполнения отсечения на примере построения проекции Зс1-сцены, включающей объект— плоский полигон Р — {р\ рг ръ р\), отсекатель — полигон О - {о\ ог оъ 04 о\) в плоскости f, источник света S и тень
Геометрические задачи визуализации 419 объекта Р на окно О. Схемы отличаются местом, занимаемым в них операцией отсечения. □ Схема отсечения в пространстве сцены целесообразна, если отсекатель представляет собой прямоугольник (рис. 4.6, а). Здесь полностью применим проективный алгоритм построения тени, описанный в разд. 2.2.5.4. Согласно ему сначала вычисляются проекции точек объекта на f, затем по простому алгоритму выполняется отсечение полигона Pf окном of=ocK в такой системе координат, где отсекатель является регулярным. Матрицу Ск преобразования системы координат можно вычислить по формуле (2.14), выбрав четыре пары точек: {Оз,о,}, {\о2 -о,|Л oj, {\о4 -oi\y°, о4}, {\N{\z°, о, +Nt}, где Nt = (02 - oi) х (о4 - о\) — нормаль к плоскости f. Наконец, координаты видимого в О полигона тени преобразуются в экранные /, с помощью матрицы С~ Спэ. Рис. 4.6 □ Схема отсечения в плоскости экрана целесообразна в том случае, когда отсекатель является произвольным полигоном (рис. 4.6, б). Сначала рассчитываются экранные проекции полигонов окна дП=дсП и полной тени объекта mi = '^М^пэ > а отсечение выполняется в экранной системе координат х?уэ перед отображением сцены.
420 Глава 4 Таким образом, практически всегда отсечение тени произвольным полигоном выполняется быстрее по второй схеме. Аналогична картина и при построении отражения объекта в полигональном зеркале. Выигрыш достигается за счет исключения расчета промежуточных точек на плоскости тени или зеркала, преобразования СК и получения результата отсечения сразу в виде экранной формы. 4.2.1. Регулярное плоское отсечение отрезка Простейшим внешним 2с1-отсекателем является прямоугольное окно О на картинной плоскости или на экране дисплея, заданное координатами сторон хп, хп. ун, у» или вершин °лн = [*л УиJ. олв = [хл ув], от = [х„ ув], от = [х„ уи] (рис. 4.7). К такой форме отсекателя сводится множество типовых задач селективного изображения элементов сцены. Например, составной частью алгоритмов построения оптических эффектов является проверка принадлежности точки ограниченной поверхности. Если эта поверхность— плоский прямоугольник, то, преобразуя его во фронтальное и ориентированное вдоль осей окно, приходим к регулярному виду отсекателя. Внешнее отсечение точки р = [х у] регулярным прямоугольным окном О выполняется элементарным габаритным тестом (1.39, а): \{xe[xn, xn\Y){ye[yH, ув]}=> реО, \{хе[хп,хп]}{]{уе[уИ,ув]}=>реО. () Более сложна задача внешнего отсечения отрезка р\рг (рис. 4.7, а). Возможны следующие варианты ориентации отрезка и регулярного окна-отсекателя: □ отрезок целиком расположен в окне, если для обоих концов отрезка тест (4.2) дает результат {р^0}Г]{р2^0}=]; О отрезок целиком лежит вне окна, достаточным условием чего является расположение обеих точекр\ wpi снаружи любой из сторон окна (тест (1.40)): р\рг $. О: gabl_poly{p\рг, О) = 1. (4.3) Внешнее положение отрезка возможно и при невыполнении условия (4.3), что подтверждает верхний правый отрезок на рис. 4.7, а; □ отрезок расположен в окне частично, пересекая его стороны один или два раза. Основным в процедуре плоского отсечения является расчет точек пересечения заданного отрезка с отрезками — сторонами окна. Для этого можно использовать функцию cross_segm, разработанную в гл. 1. Там же представлены алгоритмы внешнего отсечения отрезка clip2_cross и clipl_test, использующие функцию cross_segm для получения нужного числа точек пересечения отрезка со сторонами отсекателя.
Геометрические задачи визуализации 421 У У. У« 0 \ "ш Л ^ °™ '> х ^> °т х Произвольно ориентированный на плоскости отрезок пересекается с регулярным окном не более двух раз и не более одного раза с каждой его стороной. С целью уменьшения расчетов пересечений, требующих обращения матрицы, желательно как можно раньше отделить заведомо внутренние и внешние отрезки, а для остальных полностью или частично внешних отрезков запомнить информацию о сторонах окна, с которыми потенциально возможно их пересечение. Для этого каждой концевой точке отрезка /¾ = [xk ук ] поставим в соответствие трехзначный логический код Ek = ек\ ек2 екз екА, (4.4, а ) четыре разряда которого однозначно описывают ориентацию точки относительно каждой из четырех сторон регулярного окна по порядку его обхода: ек\ = sgn(jcn - хА), екг - sgn(yk - ув), еА.з = sgn(xA. - лг), ек4 = sgn(y„ - ук). (4.4, б) Определим отношения Е * а, означающие, что все разряды логического кода Е удовлетворяют условиям е, *а с символом отношения * е {—, Ф, <, <, >, >}. Тогда точка рк, находящаяся внутри регулярного окна, имеет код £(. = -1,ав коде граничной точки Ек < 0 нулевые разряды (один или два) означают расположение точки на соответствующих сторонах окна. Поразрядные логические операции с кодами Е\ и Ег выполняются согласно табл. 3.3. Из нее следует: □ признак расположения всего отрезка р\ pi внутри окна есть Е\ &Ег< 0; □ признак заведомого расположения отрезка вне окна— невыполнение условия Е\+Ег< 0. Оставшиеся после этих двух проверок отрезки содержат по одному или два внешних концов. Со стороны внутреннего конца, если он есть, частично видимый отрезок обязательно пересекает какую-нибудь сторону окна. Со стороны
422 Глава 4 внешнего конца рк отрезок может пересечь не более одной из двух сторон окна, для которых eki — 1. На рис. 4.8, а представлен разработанный на основе метода логических кодов алгоритм reg_outclip2(p\p2,0,Ls) внешнего отсечения отрезка р\рг регулярным окном, векторы вершин которого составляют массив О = {Опн Опв Опв От Оли} = {о\ 02 03 04 Os) в порядке, соответствующем очередности формирования разрядов в логическом коде (4.4). Алгоритм возвращает признак видимости отрезка в окне: □ 0 — весь отрезок расположен вне окна и невидим; □ 1 — отрезок видим в окне целиком или частично. На рис. 4.8, б приведен алгоритм regJnclipHp\pi,0,Ls) внутреннего отсечения отрезка р\рг регулярным окном О, возвращающий признак видимости отрезка вне окна: □ 0 — отрезок целиком невидим, т. е. расположен весь внутри окна; □ 1 — отрезок видим вне окна целиком или частично одной частью; □ 2 — отрезок видим частично двумя частями. Внутреннее отсечение в отличие от внешнего может расщепить отрезок на два фрагмента (см. рис. 4.7, б). (reg_oulclip7ipyjirOJJ)J { Возврат/ J Рис. 4.8, а
Геометрические задачи визуализации 423 ( reg_inclip2{p ^,0,1^) J end -<El>—г »<^ '-14 y~ end -'^xCT^ <—^^оГ5> T cross _segm(pi p2 ,0,-0/+) ,t,% v ) pkv^>Ls,f=f+\ —>C Возврат/ J<- *0 P\Pi-^>Ls,f = \ Рис. 4.8, б Оба алгоритма регулярного отсечения отрезка сохраняют его видимые фрагменты в списке Ls, заранее созданном для запоминания неотсеченных элементов сцены. Это может быть обычный массив отрезков или более сложно организованная структура, дополнительно содержащая параметры tn и тп, вычисленные функцией crossjsegm. После отсечения всех объектов сцены накопленное содержимое списка используется последующими алгоритмами визуализации. 4.2.2. Произвольное плоское отсечение отрезка Усложним отсекатель— пусть он будет произвольным выпуклым и-угольником, заданным массивом векторов вершин О = {о\ ... опо\). Подобные отсекатели возникают, например, при построении тени или отражения отрезка на полигональном участке плоскости. Приняв за основу алгоритмы отсечения на рис. 4.8, внесем в них следующие минимальные изменения: □ цикл i = 1 ... 4 заменим циклом / = 1 ... п; □ изменим правила расчета и-разрядного логического кода Ек ориентации точки рк относительно сторон выпуклого окна. Построим по (1.8) внешние нормали W, = (ом - о,- )r(- 90°) - |pI+lo, - oiy oix - oi+u ]
424 Глава 4 к сторонам окна, обходя его вершины против часовой стрелки. Тогда значение разряда eki определяется знаком угла между вектором рк - о, и нормалью Nt (рис. 4.9): еи = sgn((p, - о,) ° N,) Vi = \Гп ■ (4-5) Рис. 4.9 Обозначим модифицированные таким образом алгоритмы произвольного выпуклого внешнего и внутреннего отсечения как outclip2(p\ рг, О, Ls), inclip2(p\ pi, О, Ls). Они возвращают число неотсеченных фрагментов отрезка. Сравнительный анализ трудоемкости (числа расчетов пересечений прямых) родственных алгоритмов outclipl, clip2_cross и clipljtest показывает эффективность метода логических кодов, ускоряющего решение самой массовой задачи геометрической визуализации: благодаря анализу этих кодов алгоритм outclipl обращается к функции cross_segm лишь тогда, когда потенциально возможно пересечение отрезка с окном. Алгоритм cUpljcross поочередно рассчитывает все пересечения до тех пор, пока их число не станет равным двум. Конкуренцию методу пересечений составляет алгоритм clip2_test, способный благодаря тесту ориентации отделять внешние фрагменты отрезка от внутренних. В связи с этим он весьма перспективен, но имеет большую трудоемкость, чем алгоритм clip2_cross. Дальнейшее усложнение отсекателя: пусть он будет произвольным иевыпукльш полигоном, возможно, с отверстиями и несвязными фрагментами. Рассмотрим три способа описания произвольных отсекателей и соответствующие алгоритмы отсечения ими отрезка ab. 1. Полигон отсекателя задается списком вершин О- {о\ ... о„о\) в порядке обхода его по замкнутому контуру в произвольном направлении. Описываемый ниже метод пересечений не нуждается в логических кодах (4.5). Он рассчитывает пересечения отрезка со всеми сторонами окна, т. к. в отличие от выпуклого алгоритма clip2_cross заранее неизвестно максимальное число пересече-
Геометрические задачи визуализации 425 ний. Алгоритм, конечно, работоспособен и с регулярными, и с выпуклыми отсекателями, но менее эффективен в этих случаях из-за бесполезных расчетов в среднем около половины пересечений. Отсечение отрезка ab окном О основано на идее, заложенной в алгоритм clip2_test (см. рис. 1.19), и выполняется следующим образом. 1&Шаг1. Инициализируем список чисел L= {О, 1}, определяем возвращаемые значения J, = cross_segm(ab, 0,0,+1, f„ т,, q,) Vi = 1, п функции расчета пересечений отрезка со сторонами полигона и формируем логическую сумму л L = L\J\J\f (sj>0:tj,0) /=1 в виде неупорядоченного списка параметров точек пересечения на отрезке l(t) = a + (b-a)t, включая параметры его концевых точек t = О и t = 1. Шаг 2. Сортируем список по возрастанию элементов L=sort\L), после чего точки rk = l(Lk) разбивают отрезок на непересекающиеся фрагменты [rk, rk+\] с постоянной ориентацией относительно полигона. ШагЗ. С помощью тестов ориентации (см. рис. 1.15, 1.17) средних точек определяем расположение каждого фрагмента относительно полигона Р. Видимые фрагменты изображаются на экране или добавляются в список Ls не- отсеченных элементов. Шаг 4. Ls = Ls\J0 и возврат size(Ls). Q I& Пример 4.4. Выполнить внешнее и внутреннее отсечение отрезка ab невыпуклым окном О - {о\ ... on oi} (рис. 4.10, а). Решение. Инициализируем список L = {0,1} и рассчитаем параметры пересечения отрезка со сторонами окна, дополняя L параметрами f, граничных точек: • £/-05^^1(^,0102,^,11,91)=1,/1 = 0,11=0=^ L = L\Jt\ ={0,1); • cross_segm(ab, ог оз, ti, тг, qi) = 0, ti - 1.12, хг = 1.98; • cross_segm(ab, 03 04,1з, тз, #з) = 0,1з = 0.57, тз = 2.98; • cross_segm(ab, 04 05, /4, т 4, qi) = О, U - 0.94, Т4 = 1.31;
426 Глава 4 • cross_segm{ab, 05Об, ts, ts, qs) - 1, /s = 0.85, ts = 0.47 => L = L U/5 = {0,1, /5}; • cross_segm{ab, оь от, tb, Тб, <7б) = 1,/6 = 0.7, те = 0.53 => L = L (J tb = {o, 1, /5, /6 }; • cross_segm(ab,070s,h,T7,qT) - 1,/7 = 0.57,17 = 0.48 => L = L (J/7 = {0,1, /5, t6,ty}; • cross_segm(ab, os 09, ts, is, qs) = 0, /e = 0.49, T8 = -0.26; • cross_segm(ab, 09 010, ft, 19, q<>) = 0, /9 = 0.85,19 = -2.53; • cross_segm(ab, 010on, /10, no, 910) = 0. /10 = 0.19, no = 2.34; • cross_segm{ab, on on, /11,111,911) — 0,/11 = 0.57, тн =-2.02; • cross_segm(ab, 01201, /12, T12,912) =1,/12 = О, T12 = 1 => => Z, = /,Щ2 ={0,U5.'6>'7}- Рис. 4.10 Далее сортируем элементы списка по возрастанию 0 < h < 1ь < ts < 1 и отбираем точки м = а, п = qi, п = qt, r^-qs и rs- b (рис. 4.10, б). Наконец, угловым тестом, примененным к средним точкам пи -=- пц, определяем, что внутри окна находятся непересекающиеся фрагменты Л|Л2 и гз/ч, а вне окна— фрагменты П Гъ И Л4 Л5. Трудоемкость алгоритма составляет двенадцать расчетов пересечений прямых и четыре теста ориентации точки относительно полигона. □ 2. Желание сократить число расчетов пересечений с помощью логических кодов, формируемых корректно только для выпуклых отсекателей, приводит к конструктивному методу — описанию произвольного окна булевой комбинацией выпуклых полигонов, индивидуальному отсечению отрезка каждым примитивом и логическим операциям с полученными списками неотсеченных фрагментов отрезков. Внешнее и внутреннее отсечения отрезка ab невыпуклым полигоном О = Q(Oi,..., Оф) конструктивным методом выполняются следующим образом. & Шаг 1. Инициализируем пустые списки Lsi=0\/i = \,ш и функцией внешнего отсечения outclip2(ab, 0,, Ls,) добавляем в них внутренние относительно О/ фрагменты отрезка ab.
Геометрические задачи визуализации 427 Шаг 2. Формируем список не отсеченных отсекателем О фрагментов отрезка ab: • при внешнем отсечении Ls = Cl(Ls\,... , Lsa); • при внутреннем отсечении Ls = {ab} -, Cl(Ls[,..., Lsa). Шаг 3. Возврат size(Ls). CD Результат внутреннего отсечения отрезка ab можно получить и иначе. Выполнив внутреннее отсечение функцией inclip2\ab,Oj,Ls'"j Vi' = l,со, получим списки Ls'", дополняющие соответствующие списки внешнего отсечения Ls"1" до целого отрезка ab. Из законов двойственности де Моргана (3.118) следует двойственная логическая формула: Lsi"=QAB(Lsi",...,Ls^). Двойственность означает формальный обмен логических операций "+" и "&". Например, двойственны формулы А -, В + С и (А + (I -, В)) & С. Практически всегда предложенная в алгоритме формула расчета списка ^/л={а^фг" ^'") менее трудоемка, чем двойственная ей формула Ls' =Qm\Ls", ...,Ls£)■ £j Пример 4.5. Решить пример 4.4 конструктивным методом. Решение. Представим отсекатель комбинацией О = б\ -, Ог + 0з ВЫПУКЛЫХ ПРИМИТИВОВ 0\ = {Oil 0120130140ц}, 02= {021022 023 021} И Оъ — {оз| 032 0зз0з4 03|} (рис. 4.11, а). Внешние отсечения отрезка ab сторонами примитивов формируют списки отрезков Ls\ = {qnqa},Ls2= {qi\ qu}, Lsi - {aqu}. Первая операция Ls\ -i Lsi дает список Lsn = {(714921,922713}. Вторая операция Ls\2 Ui^3 дает результат внешнего отсечения Ls""' - {aqii,q22q\3}. Список видимых отрезков внутреннего отсечения отрезка ab отсекателем О имеет вид Lsi"= {ab} -1 {aqa,q22qu} - {qnq22,q\ib}. Трудоемкость алгоритма составляет шесть расчетов пересечений прямых и две (три — для задачи внутреннего отсечения) логические операции со списками отрезков. □
428 Глава 4 3. Разновидностью конструктивного метода является представление невыпуклого отсекателя объединением непересекающихся выпуклых примитивов: ы O = \JOi,Oir}OJ=0Vi*j. (4.6) i=l Это эквивалентно разрезанию (ручному или алгоритмическому [25]) полигона на простейшие выпуклые фигуры (трех- и четырехугольники), для которых задача отсечения решается индивидуально с помощью функций *clip2\ab,Oj,Lsj), где символ "*" означает "out" или "in". В результате созда- * * ются непересекающиеся списки отрезков Lsj ,..., Lsw. Состав результирующего списка Ls* зависит от вида отсечения: • для внешнего отсечения ы Ls01" = \jLsfl"; i=i • для внутреннего отсечения работает двойственная формула ы Рис. 4.11 (& Пример 4.6. Внутреннее отсечение в примере 4.4 методом разрезания. Решение. Разрежем отсекатель на выпуклые примитивы 0\ = {он 012 озоном}. Ог - {02\ 022 023024021} и Оъ - {оъ\ 032озз03403i} (рис. 4.11, б). Сначала формируем списки внешних отрезков Ls\ - {bqn},Lsi ~ {ab},Ls3 = {aqu, bqn}. Пересечение этих списков есть Ls = Lsi П Ls2 ПLs3 = {734 qi3, bq33}. Трудоемкость метода составляет семь расчетов пересечений прямых и две логические операции со списками отрезков. □
Геометрические задачи визуализации 429 Анализ трудоемкости методов отсечения, основанных на представлении отсека- теля комбинацией выпуклых примитивов, показывает, что они заметно сокращают число расчетов пересечений прямых. К недостатку конструктивных методов, затрудняющему их применение, отнесем сложность алгоритмизации выбора выпуклых примитивов и синтеза булевой формулы описания невыпуклого окна. Из всего вышесказанного следует вывод: конструктивный метод имеет высокую эффективность в задачах невыпуклого отсечения. Обозначим алгоритмы невыпуклого внешнего и внутреннего отсечения отрезка ab отсекателем О как outclip2_segm{ab, О, Ls) и inclip2_segm(ab, О, Ls). 4.2.3. Произвольное плоское отсечение полигона На основе разработанных методов отсечения отрезка перейдем к решению главной задачи плоского отсечения произвольного полигона Р произвольным полигональным отсекателем О. Если полигон каркасный, то эта задача сводится к последовательному отсечению ребер. Непустым результатом отсечения сплошного полигона является полигон. При этом возможна фрагментация видимых элементов полигона, т. е. расчленение его на несвязные фрагменты. Алгоритм отсечения должен сформировать все эти фрагменты и описать каждый из них аналогично описанию исходного полигона. Пусть, например, даны полигон Р- {р\ргр1р*р\} и окно 0\ = {oi 02оз0405Об07 oi} (рис. 4.12). Внешнее отсечение (а) дает два полигона Р\ = {p\q\06qbp\},Pi= {qiqiquqsqi}, а внутреннее (б) — два полигона Ръ = {pi qi qsp4 qbOtq\ pi} ,Р*={рз q* #з #з}. Рис. 4.12 Основная идея поиска внешне (внутренне) не отсеченных фрагментов полигона воплощается в двухэтапном процессе: П внешнее (внутреннее) отсечение сторон полигона окном; П внешнее (внешнее) отсечение сторон окна полигоном.
430 Глава 4 На каждом этапе неотсеченные отрезки накапливаются в неупорядоченном списке Ls. Затем эти отрезки сцепляются в замкнутые контуры концами с совпадающими координатами. Результат сцепления сохраним в массиве списков Lm = \Ll, ...,Ln } замкнутых контуров— видимых фрагментов исходного полигона. Число Ик элементов массива равно числу полученных контуров. Каждый элемент Lm есть список Lk = \lk , ... lk т lkl\ вершин k-ro замкнутого контура — я?А-угольника. Перед сцеплением из Ls нужно удалить кратные отрезки, которые появляются при внешнем отсечении полигонов с совпадающими границами (например, отрезок 04/м на рис. 4.12, в). Возможен случай, когда при отсечении должен получиться полигон с одним или несколькими отверстиями (см. рис. 3.94,6). При этом в массиве списков Lm будут присутствовать непересекаюгциеся контуры: охватывающий и соответствующее число вложенных в него. Критерий охватывания контура L, контуром L, имеет вид Lj с Lt : {ljiX е L, }П {liy е £у } Vv = 1,1и4 , ц = 1, rrij, (4.6) т. е. все вершины L, лежат внутри Lh а все вершины L, лежат вне L,, что определяется тестами ориентации — габаритным и угловым. Условия (4.6) проверяются для каждой пары списков L, и Lj. В случае их выполнения формируется новый список U = Vi,i - Wu ф О.» - (/.«Д1 Ф k\ J (4.7) со специальными элементами Ф, вставляемыми между концами фиктивного ребра полигона. Список L, исключается из Lm. Функция cont(Ls) формирования замкнутых контуров из отрезков списка Ls, возвращающая список типа Lm, имеет следующий вид. & Шаг 1. Инициализация пустого списка Lm = 0 и номера списка /:=1. Если Ls = 0, то видимые фрагменты полигона отсутствуют и перейти на шаг 6. Шаг 2. Начало первого отрезка в Ls принимается за начало k-го контура Lk, а конец — за конец контура. Сам отрезок удаляется из Ls. Шаг 3. В списке Ls ищется отрезок, любой из концов которого совпадает с концом контура. Отрезок присоединяется к контуру этим концом, второй его конец становится концом контура Lk, а сам отрезок удаляется из списка Ls. Формирование контура в Lk заканчивается при совпадении его конца с началом. Шаг 4. Если Ls * 0, то к = к + 1 и перейти на шаг 2. Шаг 5. Контуры в Lm проверяются по (4.6) на охватывание, и при необходимости по (4.7) формируются списки контуров с отверстиями. Шаг 6. Возврат Lm. С2 Если видимые фрагменты имеют общую точку на границе окна (рис. 4.12, в), то в ней возможно неоднозначное продолжение контура. В этом случае следует просчитать все возможные варианты замыкания контура от точки разветвления и выбрать из них кратчайший вариант. Отрезки, удаленные в не выбранных вариантах, должны быть восстановлены в списке, а в выбранном варианте—- удалены из списка.
Геометрические задачи визуализации 431 Алгоритмы внешнего outclip2_poly(P, О, Lm) либо внутреннего inclip2_poly(P, О, Lm) отсечений полигона Р- {р\ —р„р\} полигональным окном О- {о\ ... о„,о\}, возвращающие число неотсеченных фрагментов, имеют следующий вид. & Шаг 1. Инициализация пустого списка Ls = 0 и расчет числа вершин полигонов п = size(P) - 1, m = size(Q) - 1. Шаг 2. Внешнее либо внутреннее отсечение п ребер полигона Р отсекателем О с помощью функции outclip2_segm(pipi+\, О, Ls) либо inclip2_segm(pipi+\, О, Ls) V/ = 1, п. Видимые внутренние либо внешние фрагменты сторон Р добавляются в Ls. Шаг 3. Внешнее отсечение m ребер полигона О отсекателем Р с помощью функции outclip2_segm(OjOf+[, Р, Ls) Vi = 1, m . Видимые внутренние фрагменты сторон О добавляются в Ls. Шаг 4. Формирование замкнутых контуров в массиве списков Lm = cont\Ls U 0)- Шаг 5. Возврат size(Lm). CD I& Пример 4.7. Внутреннее отсечение полигона Р= {р\ргрърьр\} невыпуклым окном О = {см ог оъ 04 05 06 07 01} (рис. 4.12, б). Решение. Последовательно отсекая части сторон Р, лежащие внутри О, получим первый список отрезков Ls\ - {q\pi,piqi,qi,p^pT,qb,qbpb,pbqb}. Аналогично отсечение частей сторон полигона О вне отсекателя Р дает второй список Lsi - {qi с/4, qs qi, q\ Об, оь qe}. Просматривая объединенный список видимых отрезков Ls = Lsx (J Ls2, формируем первый замкнутый контур Рз- {qxpiqiqspiqbObqx}. Из оставшихся в Ls = {дзрз,рз<74, с/здч} трех отрезков составляем второй замкнутый контур ^4= {#3/73(74(73}, после чего список Ls = 0. Таким образом, после отсечения число видимых фрагментов равно двум, они не удовлетворяют условиям охватывания (4.6), а массив списков фрагментов имеет описание Lm = {Л, Л}. □
432 Глава 4 I& Пример 4.8. Внешнее и внутреннее отсечения невыпуклого полигона Р- {pxpipipupspy} невыпуклым окном 0= {0102030401} (рис. 4.12, в). Решение. Внешнее и внутреннее отсечения сторон Р окном О дают списки отрезков Ls\ = {qiq2,04pi,pips,psq3},Ls2- {p\q\,qipi,pipi,piOi,qip\}. Внешнее отсечение сторон О отсекателем Р дает список отрезков LS3 = {qiq\,qi04, 04/74}. Получаем списки сторон полигонов отсечений Ls°ut - Ls\ U Lst, и Ls'" = Ls2 U Ls^ с одним отрезком 04/м в каждом списке (второй такой же отрезок удален при объединении списков). Начиная фрагментацию списка Ls"'" с отрезка q\ qi, формируем замкнутый контур Ps = {q\ qi 04/74/75 qi q\}, после чего Ls'"" = 0. В результате массив Lm'"" - {Ps} содержит один замкнутый контур. Фрагментация списка внутреннего отсечения Ls'" дает два замкнутых контура: .Рб= {p[q\q3p[},Pi= {qipipiotqi}. В результате получаем массив из двух замкнутых контуров Lm'" = {Рв, Pi}. CD 4.2.4. Объемное отсечение отрезка Обобщим методику плоского отсечения на трехмерное пространство. Наиболее распространенные формы Зс!-отсекателей — призма и пирамида видимости — возникают, например, при параллельном и центральном проецировании (рис. 4.13). Сечение этих полиэдров картинной плоскостью дает окно с изображением части сцены, находящейся внутри отсекателя, боковые грани отсекателя направлены к наблюдателю, а передняя и задняя грани могут не участвовать в отсечении, т. е. быть пассивными. Рис. 4.13
Геометрические задачи визуализации 433 Цель объемного отсечения— выявление активных объектов на ранней стадии расчета сцены — до ее проецирования на картинную плоскость. Это существенно экономит машинные ресурсы и, главное, не загружает компьютер бесполезной работой с заведомо невидимыми объектами. Второй пример Зс1-отсечения — логические операции со сплошными телами: П объект А + В образуется объединением внутренних отсечений тела А телом В, тела В телом А и пересечения тел А и В; П объект А &.В есть объединение внешних отсечений тела А телом В и тела В телом А; П объект А -1 В формируется объединением внутреннего отсечения тела А телом В и внешнего отсечения тела В телом А. Методика отсечения обогащает формальные правила конструирования сложных объектов из примитивов, описанные в комментариях к определениям (3.110)— (3.113). Рассмотрим последовательно задачи Зс1-отсечения точки, отрезка прямой линии, плоского полигона и полиэдра. Взяв за основу алгоритмы плоского отсечения, внесем в них необходимые изменения. Для работы с полиэдрами нам потребуются определенные в (1.116) и (1.117) функции side(P,G,i) и попп(Р), позволяющие вычислить нормаль к /-ой грани полиэдра Н = {Р, G} как N = norm(side(P, G, i)). Простейший регулярный Зс1-отсекатель — параллелепипед с шестью гранями, параллельными координатным плоскостям (рис. 4.13, а). Положение точки рк относительно граней отсекателя описывается логическим кодом Ек = ек\ ... ек$екь, четыре разряда которого определены в (4.4), а два последних разряда ек5 = sgn(zA. - ze), екб = sgn(za - zk) (4.9) ориентируют точку по глубине сцены относительно ближней и дальней граней отсекателя с аппликатами гъ и гд. Аналогично (4.5) вычисляется иг-разрядный логический код точки рк eki = sgn((pk -ogn )с N,)\/i = Т^~Г (4.10) относительно пг граней произвольного выпуклого отсекателя. Также аналогично плоскому варианту признаки полной видимости и заведомой невидимости отрезка р\рг во внешнем отсекателе есть, соответственно, выполнение условия Е\ & Ег < 0 и невыполнение условия Е\ + Ег < 0. Основой Зс1-отсечения является расчет точек пересечения отрезка р\рг с гранями отсекателя с помощью функции cross_side (см. разд. 1.2.2). Если отрезок совпадает с плоскостью какой-либо грани (при этом возвращается значение
434 Глава 4 crossjside = -1), то нет нужды решать задачу плоского отсечения отрезка полигоном этой грани в ее СК, т. к. прямая отрезка в этом случае пересекает и другие, не параллельные ей грани. Выполнив все необходимые изменения функций reg_outclipl, regjnclipl, outclipl. inclipl, outclipl_segm и inclipl_segm, получим 3<1-алгоритмы регулярного, выпуклого и произвольного отсечений отрезка reg_outclip3(p\ pi, О, G, Ls), reg_inclip3{p\ pi, О, G, Ls), оШсИрЪ(р\ pi, О, G, Ls), inclipb(p\ pi, О, G, Ls), outclip3_segm(p[pi, 0, G, Ls), inclip3__segm(pipi, 0, G, Ls), возвращающие в списке Ls неотсеченные окном О фрагменты отрезка p\pi На рис. 4.14 показано, как выглядит алгоритм внешнего выпуклого отсечения оШсИрЪ. С ourc//p3(p1p2,0,G,b) j >( Возврат ТУ*— Рис. 4.14 4.2.5. Объемное отсечение полигона и полиэдра Следующая задача рассматривает пересечение в пространстве двух произвольных плоских полигонов Р= {р) ...р„р\} и О = {о\ ... ошО|} (рис. 4.15). Требуете* найти все отрезки, по которым полигоны взаимно пересекают друг друга.
Геометрические задачи визуализации 435 °\ Р\ Рис. 4.15 Составим алгоритм cross_poly(P, О, dim, Ls) расчета пересечения произвольных плоских полигонов РиО, возвращающий признак пересечения: П -I — плоскости полигонов параллельны и не совпадают; ПО — полигоны не пересекаются; П I — полигоны пересекаются по отрезкам, добавляемым в список Ls; □ 2— плоскости полигонов совпадают, а в списке Ls возвращаются отрезки сторон полигона Р, находящиеся внутри отсекателя О. Параметр dim е {2, 3} определяет размерность пространства, в котором заданы полигоны. & Шаг 1. Вычислив нормали к полигонам NP = norm(P), N0 = norm(0) и матрицы преобразования системы координат СР = MAP2(pbN^,03,z0)., С0 =MAP2{pxJ^,03,z°), проверяем ориентацию плоскостей РиО: П если {np x.N0 = 03 }П {Np ° (р\ - о\) * О}, то возврат -1; П если {npxNq = 03}Г){/V/> °(л ~°i) = ®}- то выполняется внешнее отсечение полигона Р отсекателем О в системе координат, где их общая плоскость фронтальная {Р,0} Ср >{Р',0'}, Ls' = 0, outclip2_poly(P', О', Ls'), Ls' cj} ) Ls , и возврат 2; П если dim - 2, то возврат 0. Шаг 2. Для каждого ребра РиО вычисляем булевы переменные Sj = cross_side{piPj+\ ,0,1, ¢,) V/ = 1, n, n = size(P) - 1, Oj - cross_side(OjOj+\, P, x, rj V/ = \,m,m- size(0) - 1.
436 Глава 4 Если число пересечений ребер с полигонами п т , , 2{**>0}+£{оу>0}<2, то возврат 0. Шаг 3. Формируем неупорядоченный список точек пересечения ребер с полигонами: Lp = 0; qt -» Lp Vz: si > 0; rj -> Lp V/: aj > 0; Lp = Lp U 0 , A/ = size(Lp). Сортируем неповторяющиеся точки в Lp вдоль прямой, на которой они расположены: tkALPk-LpMLp2-LPx) yk=UJ. \Lp2-Lpx\ sort{Lp)^>{Lpu..., LpM}. Шаг 4. Преобразовав точки списка Lp в системы координат полигонов Р и О по формулам Lp CV ) Lp', {Lp, О} С» >{Lp", О"}, с помощью подходящего 2d-meana ориентации из коллекции тестов, приведенных в гл. 1, определяем принадлежность центра каждого фрагмента LpkLpu, обоим полигонам: {0.5(LP'k + LpUx )е />'}П {0.5(Lp'k + Lp'k+i )е О'}. Фрагменты, удовлетворяющие этому условию, добавляются в список Ls неотсе- ченных элементов. Шаг 5. Возврат 1. СЗ На основе функций cross_poly, outclip3_segm и inclip3_segm составим алгоритмы внешнего ouiclip3_poly(P, О, G, U, F) либо внутреннего inclip3^poly(P, О, G, U, F) отсечений плоского полигона Р = {р\ ...р„р\} произвольным полиэдром, заданным массивами координат вершин О и топологии граней G ={0] ... G„ }. & Шаг 1. Инициализация пустого списка Ls = 0 и расчет размера списков: п = size(P) - 1, ;ir = size{G).
Геометрические задачи визуализации 437 Шаг 2. Расчет пересечения полигона Р с каждой гранью полиэдра отсекателя: cross_poly(P, side(0, G,j), 3, Ls) V/ = 1, иг. Шаг 3. Расчет отсечения каждого ребра Р полиэдром С соответствующей функцией outclip3_segm{pipi+], О, G, Ls) либо inclip3_segm(plpl+u О, G, Ls) V/ = 1, п. Шаг 4. Формирование видимых контуров в массиве списков Lm = cont(Ls\J0). Шаг 5. Сохранение списков массива Lm в массивах £/и F. Шаг 6. Возврат Lm. С2 Результат отсечения — видимые фрагменты полигона, возвращенные списком через имя функции и сохраненные в массивах координат вершин U, топологии граней F = ^\, — . f„ |. Число иф элементов массива Fравно числу хранящихся в нем фрагментов. Каждый элемент Fk содержит список номеров вершин замкнутого контура к-го фрагмента. Номера fkl есть номера вершин фрагмента в U. На пятом шаге алгоритма выполняется копирование координат точек из Lm в массив U и формирование списков Fk в соответствии со списками Lmk. Фиктивное ребро, признаком которого является элемент Ф между двумя точками списка Lmk, оформляется в списке Fk парой номеров вершин с отрицательным вторым номером, как это описано в разд. 3.2.1. Для экономии памяти и однозначности нумерации вершин рекомендуется сохранять в массиве U только отсутствующие в нем точки. Если отсечение полигона полиэдром — самостоятельная задача, то перед вызовом функций ошс11рЪ_ро1у или 1псИрЪ_ро1у нужно инициализировать пустые массивы U= 0 и F— 0. & Пример 4.9. Рассчитать внешнее и внутреннее отсечения треугольника р\ ргръ с вершинами Д=[0 5 0], p2=[l 1 5], ft=[8 0 1] невыпуклым полиэдром с вершинами о,=[0 0 0], о2=[4 0 0], о3=[4 0 2],о4=[2 0 l\, о5=[2 0 б], об=[0 0 6],о7=[0 2 0], 08= [0 2 б], о9=[2 2 б], о10 =[2 2 2],0|,=[4 2 2],о,2=[4 2 о] и массивом топологии G - {G\,..., G%) со списками граней (рис. 4.16) G, = {1, 2, 3,4, 5,6, 1}, G2 = {7, 8, 9, 10, 11, 12, 7}, G3 = {6, 5, 9, 8, 6}, G4 = {5,4, 10, 9, 5}, Gs = {4, 3, 11, 10, 4}, G6 = {3, 2, 12, 11, 3}, G7 = {2,1,7, 12, 2}, Gs = {1,6,8,7, 1}.
438 Глава 4 Рис. 4.16 Решение. Инициализируем массивы U- {р\,р2,рз} и F= 0. На первом шаге получаем список Ls\ - {/i h, h U, Is к, h Is, h /ю} отрезков пересечения полигона Р со второй по шестую гранями отсекателя О С остальными гранями полигон не пересекается. Координаты точек /i -ь /ю следующие: /|=l0.75 2 3.75],/2 =[2 2 2.78],/3=[3 2 2], Ц=[Л 2 1.22], /5=[2 0.86 4.43],/6 = [2 2 2.78],/7 =[4 1.46 2],/8=[з 2 2], /9=[4 2 1.22],/10= [4 1.46 2]. На втором шаге рассчитываем точки ?,=[0.75 2 3.75], ^2 =Ь 0.86 4.43] пересечения ребер полигона Р с гранями отсекателя О, после чего формируем двс списка отрезков: П Ls2 = {q\p2,piqi} — внутри отсекателя; П Ls3 - {р\ q\,qipi,pip\} — вне отсекателя.
Геометрические задачи визуализации 439 В результате получаем неупорядоченные списки отрезков внешнего и внутреннего отсечений полигона полиэдром Lsout = LSl U Ls2, Lsin = Lsx U Ls3. На третьем шаге, учитывая совпадение точек /i =q\,h = /б, /з = /в, U = h, Is = qi, h = /10, формируем замкнутые контуры в двух массивах Lm""' = {/1 /2 hpi /1, /з /4 /7 /3}, Ы" = {/, h hpip\ /1, /з /4 /7 /3}. Проверяя угловым тестом (в системе координат, в которой полигон Р является фронтальной плоскостью) полученные контуры на охватывание, обнаруживаем, что контуры в списке Lm'" удовлетворяют критерию (4.7): второй контур охватывается первым. После коррекции по (4.8) массив контуров внутреннего отсечения принимает вид ЬнР = {Л /2 lsp3.pi h Ф /з /4 h h Ф /i}. Он содержит внешний контур /1 hlspip\ /1 с отверстием hhhh. На четвертом шаге формируем массивы вершин и списков фрагментов: U- {р\,р2,рз, l\, h, Is, h, /4, /7}, F"" = {{4, 5,6, 2, 4}, {7, 8, 9, 7}}, F" = {{4, 5, 6, 3, 1, 4,-7, 8, 9, 7,-4}}. D Переходим к последней и главной задаче 3<1-отсечения произвольного полиэдра Н\ = {Р\, G\} произвольным полиэдром Hi - {Pi, Gi]. Исходные объекты заданы массивами координат вершин Р\, Pi и топологии граней G\, Gi. Основная идея объемного внешнего (внутреннего) отсечения аналогична плоскому варианту: накопление неотсеченных элементов в процессе внешнего (внутреннего) отсечения Н\ отсекателем Hi и внешнего отсечения Hi отсекателем Н\. В результате формируются массив координат вершин U и неупорядоченный список Fнеотсеченных фрагментов граней. При Зё-отсечении также возможно расчленение Н\ на несвязные объемные фрагменты. Алгоритм отсечения должен сформировать все эти фрагменты, т. е. описать каждый из них аналогично описанию исходного полиэдра. Это означает упорядочение массива F и разделение его на группы списков граней замкнутых полиэдров. Принцип фрагментации — сцепление граней друг с другом по общим ребрам до получения замкнутого объекта. Результат фрагментации представляет собой массив групп списков Гт = {Г/Я],..., Гтп ] замкнутых полиэдров— неотсеченных фрагментов исходного полиэдра. Число щ элементов массива равно числу полученных фрагментов. Каждый элемент Гт есть группа Гтк - \гк\,..., Г^ \ списков граней k-го замкнутого полиэдра — шд.-гранника).
440 Глава л Функция frag(U, F) формирования замкнутых фрагментов из граней массива списков F, возвращающая массив групп списков типа Гт, имеет следующий вид. & Шаг 1. Инициализация пустого массива Гт - 0 и номера фрагмента к = 1 Если F- 0, то видимые фрагменты отсутствуют, и следует возврат Гт. Шаг 2. Первый список массива F принимается за начало к-ой группы и переносится из F в массив Гтк. Шаг 3. Для каждого нефиктивного ребра из Гтк ищется совпадающее с ним нефиктивное ребро в массиве F с концами Up- и UF . В случае удачи весь список Ft переносится в массив Гтк. Формирование фрагмента в Гтк заканчиваете? при просмотре всех содержащихся в нем ребер. Шаг 4. Если F*0, то к = к+ 1 и перейти на шаг 2. Шаг 5. Возврат Гт. СЗ Внешнее outclip3_hectr(Pi, G\, Р2, Gi, U, Гт) либо внутреннее inclip3_hedr(P\, G\, Р2, Gi, U, Гт) отсечение полиэдра Н\ = {P[,G[} полиэдром Hi = {Pi, G2} выполняется следующим алгоритмом, формирующим в массивах U и Гт координаты вершин и группы списков фрагментов, а также возвращающим число фрагментов. & Шаг 1. Инициализация пустых массивов списков U- 0 и F= 0. Шаг 2. Внешнее ошсИрЪ_ро1у(П,, Р2, Gi, U, F) либо внутреннее тсИРЪ^>о1у(П1, Р2, Gi, U, F) отсечение т = size{G\) граней Я, = side(P\, G\, i) V/ = Т^ц полиэдра #i отсекателем Н2. Вершины и списки неотсеченных фрагментов граней Н\ добавляются в U и F. Шаг 3. Внешнее outclip3^poly(side(P2, G2,j), P],Gi,U,F) V/ =l7«2 отсечение m = size{G2) граней полиэдра Н2 отсекателем Н\. Координаты верши- и списки неотсеченных фрагментов граней Р2 добавляются в массивы UwF. Шаг 4. Формирование неотсеченных фрагментов в массиве Гт =frag(U, F). Шаг 5. Возврат size(rm). С2
Геометрические задачи визуализации 441 сЭ Пример 4.10. Рассчитать внешнее и внутреннее отсечения треугольной пирамиды Н — {Р, Г), заданной списками вершин и граней Р = {Р1,Р2,РЗ,Р4}={Ь 5 3], [1 1 4], [5 1 0], [5 0 б]}, Г= {Л, /2,Гз, Га) = {{1,3, 2,1}, {1,2, 4,1}, {1,4, 3,1}, {2, 3,4, 2}}, невыпуклым отсекателем, заданным в примере 4.9 списками вершин 0-{о\,... ,о\г} и граней G= {G\,..., G%}. Решение. На рис. 4.17 приведен эскиз сцены с выделенными отрезками, по которым грани полиэдров пересекаются друг с другом: Рис. 4.17 П {/1/2,/3/4), {/5/2}, {/б/з} и {/7/4} — отрезки пересечения грани Л с гранями G2, d, GiViGt; П {k /1} и {/9 k} — отрезки пересечения Гг с Gi и Gt,; П {Is /9}, {/б /ю} и {Л /ю} — отрезки пересечения Гц с G4, Gs и Gt,. Координаты точек /i ■¥ /ю следующие: /,=[1.5 2 3.75],/2= [2 2 3.25],/3 = [3.25 2 2], /4=[4 2 1.25], /5=[2 1 3],/6=[3 1 2],/7=[4 1 1],/8=[2 2 3.94],/9 =[2 0.75 4.5], /10=[4 0.83 2]. Перед вычислением отсечения {Р,Г} отсекателем {О, G) инициализируются пустые массивы списков U= 0, F"" - 0 и F" = 0.
442 Глава л Внешнее отсечение граней Я, = side(P, Г, /) V/ = 1,4 функцией oulclip3^pol}iI7h О. G. U, F'"") добавляет в массив F'"" фрагменты Fi = {Л hкргl\},Fi= {/зUhU/3}, Ft, = {Is/ipihh}, F4 = {hl9pils),Fs= {/6 /10/7 /б}. Внутреннее отсечение inclipi_polyWh О, G, U, F'") добавляет в F'" фрагменты Ft = {p\ps/7/4/3kh/2l\p\},Fn= {p\ /1 /ehp*p\}, F» = {j>[p4p3p\},F9 - {hkhohpipthls}. Внешнее отсечение оШсПрЪ_ро1)Щ, P, Г, U, F°") либо outclip3j>oly(Qj, P, Г, U, Fin) граней Qj = side(Q, G,j) V/ = 1,8 полиэдром {P, F) добавляет в массивы F"" либо F" неотсеченные фрагменты Fio = {/2/1 /в /2} ,Fu = {Uh 011 /4), F12 = {/e /9 /5 hk}, F]3 = {hkl]oo\\h},F\* - {/10/7/4011/10}. В процессе последовательного формирования неотсеченных фрагментов созда- массив из 15 вершин: U- {l\,h, ls,p2, /з, /4, /7, /б, k,h,p\,p3,p4,o\\}. Фрагментация списков F'"" и F'" функциями frag(U, F'"") v\frag(U, Fin) дает массивы групп списков Гт'"" = {{Fi, F.o, F12, Л, Л}, {Fi, Fu.Fit, Fs, Fu}}, Гт'" = {{F6, Fs, F% Fu, Ft 1, F13, Fu, Fw, Fi}}. О 4.2.6. Логическое конструирование ЗсЬобъектов В завершение разработки комплекса методов отсечения получим на их основе алгоритмы выполнения бинарных логических операций с объектами А и В: О объединения А + В; П пересечения А &В, П исключения А-> В. Эти алгоритмы воплощают в реальность описанный в розд. 3.2.3 метод конструктивного моделирования сложных объектов на плоскости и в пространстве. Н рис. 4.18 показаны результаты логических операций А+В,А&В,А->ВиВ-.л с двумя Зс1-объектами: пирамидой А и сферой В.
Геометрические задачи визуализации 443 А + В А-,В А&В В^А а б в г Рис. 4.18 В разд. 4.2.3 и 4.2.5 были фактически разработаны плоские и объемные варианты алгоритмов выполнения двух логических операций: П операция пересечения А & В - В &А эквивалентна внешнему отсечению полигона на плоскости (см. рис. 4.11, а) или полиэдра в пространстве (см. рис. 4.17) с помощью функций outclip2_poly(A, В, Lm), outclip3_hedr(A, GA, В, GB, U, Гт); О операция исключения А—, В эквивалентна внутреннему отсечению полигона на плоскости (см. рис. 4.11,6) или полиэдра в пространстве (см. рис. 4.17) с помощью функций: inclip2_poty(A, В, Lm), inclip3_hedr(A, GA, В, GB, U, Гт). Рассмотрим порядок выполнения третьей логической операции — объединения. В плоском варианте граница объекта А + В = (Л-.В)11 (fi-i/4)U (А & В) формируется из отрезков трех непересекающихся групп (рис. 4.19): О фрагментов сторон полигона А вне полигона В; П фрагментов сторон полигона В вне полигона А; П пересекающихся фрагментов сторон Aw В. Рис. 4.19
444 Глава 4 Получаем следующий алгоритм add2(A,B,Lm) объединения полигонов A = [а\ ... а„а\) и В= {Ь\ ... b„,bi}, формирующий массив списков фрагментов объекта А + В и возвращающий через имя функции add! число его сторон. & Шаг 1. Инициализация пустого списка Ls = 0. Шаг 2. Внутреннее отсечение п = size(A) - 1 сторон полигона А отсекателем В функцией inclip2_jsegm(aiai+u В, Ls) V/ = \,п. Внешние фрагменты сторон А добавляются в Ls. Шаг 3. Внутреннее отсечение т = size(B) - 1 сторон полигона В отсекателем А функцией inclip2_segm{bjbJ+i, А, Ls) V/=\,т . Внешние фрагменты сторон В добавляются в Ls. Шаг 4. Формирование списков отрезков LsA = {a\ci2,агаъ,... ,a„a\},LsB= {b\bi,bibi,... ,b„,b\} и добавление их пересечения в список Ls: LsA П Lsb —> Ls . Шаг 5. Формирование замкнутых контуров в массиве списков Lm = cont(Ls). Шаг 6. Возврат size(Lm). СЗ Аналогично строится алгоритм add3(A, GA,B, GB, 11,Гт) объединения полиэдров НА = (A, GA) и Нв - (В, GB), формирующий в массивах U и Гт координаты вершин и группы списков фрагментов объекта А + В, а также возвращающий через имя функции add3 число его фрагментов. & Шаг 1. Инициализация пустых массивов списков U- 0 и F- 0. Шаг 2. Внутреннее inclip3__poly(side(A, GA, i), В, GB, U, F) V/ = \,n отсечение n - size(GA) граней полиэдра HA отсекателем Нв. Координаты вершин и списки неотсеченных фрагментов граней НА добавляются в массивы Uu F. Шаг 3. Внутреннее inclip$_poly(side(B, GB,j), A,GA, U,F) V/ = 1, m отсечение m = size(GB) граней полиэдра Нв отсекателем НА. Координаты вершин и списки неотсеченных фрагментов граней Нв добавляются в массивы U и F. Шаг 4. В циклах / = \,п , _/ = 1, /и функцией cross_poly(side(A, GA, i), side(B, GB,j), 2, Lm)
Геометрические задачи визуализации 445 вычисляем пересечения пар граней GAi и GBj, лежащих в одной плоскости. Если возвращенное значение cross_poly - 2, то добавляем списки массива Lm в массивы UuF. Шаг 5. Формирование массива rm=frag(U,F) и возврат size(Tni). СЗ I& Пример 4.11. Сконструировать объект из примера 3.21 (см. рис. 3.77, а). Решение. Опишем примитивы Tli = {P,Gi} (см. рис. 3.77, б) и Пг = {Р, Gi) (см. рис. 3.77, в) массивами координат вершин Р = {[0 0 o][i О О] [0 1 О] [0 0 1] [1 1 Ojfl 0 1] [О 1 l] [l 1 l]} и топологии граней G. = {{1,3,5,2,1}, {1,4,7,3,1}, {1,2,6,4,1}, {8,7,4,6,8}, {8,6,2,5,8}, {8,5,3,7,8}}, G2 = {{1,3, 5, 2,1}, {1,2,6, 4,1}, {1,4, 3,1}, {2, 5, 6, 2}, {3,4,6,5,3}}. Объект конструируется по формуле О = (П1С1) & (ШСг) -, (П.Сз) = 01 & Ог -, Оъ с матрицами преобразований С\, Сг и Съ из (3.51). Выполнив необходимые преобразования вершин примитивов, получим три выпуклых объекта 0\ = {Pi, G\), Ог= {Рг,Сг} и Оъ - {Рз,, Gi}— операнды логических операций (рис. 4.20, а) с новыми матрицами вершин Р\ - 6Р^ {0\\, ... ,018}, Р2=8Р= {021,... ,028}, Р3={[2 2 2][4 2 2][2 7 2][2 2 7][7 7 2Ц4 2 7][2 7 7j[4 7 7]}. °31 °32 °33 °34 °35 °36 °!7 °38 Инициализируем пустые массивы U= 0 и Лп = 0. Первая логическая операция конъюнкции 04 = 0\ & 02 выполняется функцией outclip3_hedr(P\, G\, Pi, Gi, U, Гт). Рис. 4.20
446 Глава 4 В табл. 4.1 показана последовательность внешних отсечений граней 0\ отсекателем Ог, граней Ог отсекателем 0\ и накопления данных в массивах С/ и Гт = {F}. В результате получаем описание объекта О* = {U, F} (рис. 4.20, б) с десятью вершинами U\ ■*■ t/io и десятью гранями F\ -=-Fio. Объединение F = F\J0 исключает из массива играни Ft, Fs и Fs>, совпадающие, соответственно, с гранями F\, Fi и Гг. Фрагментация frag(U, Г) сцепляет оставшиеся грани в один фрагмент F={F\, Fi, Ft, Fs, Fi, Fa, Fio}. Таблица 4.1 Грани Ox и Ог {oilO|30l50l20ll} {Oil 0140170130м} {0U0120l60140ll} {Ol8017 0l40160ie} {018016012015018} {018015013017018} {021 023 025 022 02)} {021022 026 024 02l} {02l 024023 02)} {022 025 026 О22} (023 024 026 025 023} 1 Отсечение {0ll0130150120ll} {011014^1 ¢2013011} {O11O12OI6O14OI1} {¢1 014016 ¢3¾1)} {¢3 016 012 015^4^3} {¢4 015 013 ¢2 ¢4} {ОПО13О15О12О11} {OllOl20l60l40ll} {01lOl4¢l ¢2013011} {0} {¢2¢1¢3¢4¢2} Массив U °lb°13.°15.0l2 U\ Щ u3 u4 °Ы,ЧЪЧ2 C/5C/6C/7 016 = Us ¢3= СЛ ¢4 = C/10 Фрагменты Fi F. = {1,2,3,4,1} F2= {1,5,6,7,2, 1} F3= {1,4,8,5,1} F4={6,5,8,9,6} F5= {9, 8, 4, 3,10,9} Fe= {10,3,2,7, 10} F7= {1,2,3,4,1} Fs= {1,4.8.5, 1} F9 = {1,5,6,7,2,1} Fio= {7,6,9,10,7} Вторую операцию О = (¾ -1 Оз выполним функцией inclip3Jiedr(U, F, Ръ, &, U, Гт) без инициализации массивов (/и Гт. В результате в (/добавятся вершины ¢5 = С/11, ¢6 = С/12, ¢7 = С/13, ¢8 = t/l4, 031 = C/l5, 032 = C/l6, а в массиве F/я будет сформирован один фрагмент {Fi, Fi, Ft, Fs, Fi, F», F11, F12, F13, Fu, F15, Fie}
Геометрические задачи визуализации 447 из двенадцати граней объекта О, изображенного на рис. 4.20, е. В дополнение к табл. 4.1 обозначено F\\ = {6, 11, 12, 7, 6}, Fn = {13, 9, 10, 14, 13}, Fn = {15, 16, 14, 12, 15}, F.4= {15, 11, 13, 16, 15},F,5 = {15, 12, 11, 15} и Fu, = {16, 13, 14, 16}. □ В заключение хотелось бы на рис. 4.21 проиллюстрировать возможности конструктивного метода моделирования примерами конструирования из выпуклых примитивов сложных объектов— фонаря, лавочки, шахматного коня и макета Нижегородского кремля. Изображения построены с помощью программы 3dLoCon (трехмерный логический конструктор), разработанной магистром Нижегородского государственного технического университета Дмитрием Васиным под руководством автора книги. Рис. 4.21
448 Глава 4 4.2.7. Дополнительные задачи отсечения на плоскости В каждом сложном алгоритме существуют определенные секреты и приемы, помогающие выполнять его более эффективно, с меньшими затратами машинных ресурсов. Иногда это достигается предварительным решением некоторых несложных задач, облегчающих решение основной задачи. Именно такие вспомогательные задачи, имеющие отношение к трудоемкой процедуре отсечения, рассматриваются в данном и следующем разделах. Предлагаемая ниже коллекция алгоритмов несколько выбивается из идейного русла пакета алгоритмов отсечения, изображенного на рис. 4.5. Каждый описываемый здесь алгоритм имеет самостоятельное значение, а некоторые из них могут использоваться как альтернативные методы решения задач отсечения. 4.2.7.1. Отсечение выпуклого полигона полуплоскостью Как известно, прямая линия разделяет плоскость на две области, в которых неявная функция линии f(p) имеет противоположные знаки. Каждая область является неограниченной выпуклой полуплоскостью. Далее полуплоскостью будем называть отрицательно определенную часть плоскости, во всех точках которой №«>■ Рассмотрим задачу нахождения области пересечения нескольких полуплоскостей. Если эта область не пуста, то она безусловно выпукла как пересечение выпуклых областей. Способ решения задачи заключается в последовательном расчете пересечения текущей выпуклой области с очередной полуплоскостью (рис. 4.22). В результате после каждого шага область пересечения либо не изменяется (если она целиком лежит в отсекающей полуплоскости), либо сужается, либо становится пустой (если пересечение с полуплоскостью отсутствует). В последнем случае обработка оставшихся полуплоскостей прекращается. Рис. 4.22
Геометрические задачи визуализации 449 Выберем наилучший способ задания границы полуплоскости. Сравнивая методы описания прямой линии, рассмотренные в гл. 1, и варианты (1.35) вычисления неявной функции f(p), заключаем, что наиболее практичны параметрическая форма {ро, V) с функцией nfV(po, V,p). Для описания прямой им достаточно четырех чисел, а для вычисления f(p)— пяти арифметических операций. Такие же затраты ресурсов имеют нормальная форма прямой {ро, N) и функция nfN(po,N,p), но мы остановимся на параметрической форме, т.к. направление прямой удобнее задавать направляющим вектором V, чем нормалью N. Наибольшая трудоемкость вычисления/(р)— семь арифметических операций в (1.35, г) — у способа задания прямой двумя точками, т. е. четырьмя числами. Казалось бы, что наиболее предпочтительна неявная форма (1.9), в которой прямая описывается всего тремя числами— элементами вектора F = [/l В £>],— а функция nfF(F,p) вычисляется за четыре операции. Однако расчет F по (1.13) требует еще трех арифметических операций, что в итоге делает неявную форму не только неудобной, но и невыгодной. Если отсекаемая область не является замкнутым полигоном, возникает естественный вопрос о способе описания такой неограниченной области. Для преодоления неопределенности зададим начальный полигон big_box - {р\ргрър*р\} в виде выпуклой ограниченной квадратной области с координатами \x\<BIG,\y\<BIG, где BIG— максимально возможное конечное число, надежно обеспечивающее пересечение с big_box любой возможной прямой (см. рис. 4.22). Таким образом, задача пересечения неограниченных полуплоскостей сводится к поочередному отсечению ими большого, но ограниченного выпуклого полигона справа от векторов направлений граничных прямых. Алгоритм clip_line(P,po, V) отсечения выпуклого полигона Р-{р\ ...р„-\р\=р^ полуплоскостью с граничной прямой {ро, V] приведен на рис. 4.23. Работа алгоритма начинается с инициализации пустого списка U= 0 и расчета пересечения прямой с ребрами полигона. Для этого вычисляются значения НФ /,= п/У{ро,Кр^ во всех вершинах полигона, после чего производится сортировка вектора/ s=sqrt(f) по возрастанию его элементов и сравнение значений крайних элементов полученного вектора s: П при si s„ > О полигон с прямой не пересекается, но может касаться ее одной вершиной либо одним ребром. В случае s\ < О весь полигон Р находится в отсекающей полуплоскости и возвращается алгоритмом без изменения. Иначе при s\ > 0 полигон целиком отсекается полуплоскостью, а алгоритм возвращает пустой результат U = 0;
450 Глава 4 □ при sis„ < О существует хотя бы одна пара вершин {phpj}, лежащих по разные стороны от прямой {ро, V}. Так как полигон выпуклый, то прямая пересекает его ровно в двух точках. Отрезок секущей линии между этими точками совместно с частью полигона, лежащей в полуплоскости, составляет искомый полигон U. fclipJine(P,P(j,V) ") т U=0,n=si:e(P) -*VT! > -" /~ ' Ji "Jv\ H0>' >Hi/ end > ' 1 ^ 1 -^ U=P -W k=si:e(U) 4^1=3^ U,-^U 1 >->o—1 >~0-> t С Возврате j Рис. 4.23 Для расчета области пересечения прямой с полигоном Р организуем новый цикл / = 1, п обхода вершин /?, с добавлением в список U: П точек />,-, находящихся в полуплоскости или на ее границе. Эти точки обнаруживаются по ранее вычисленным отрицательным значениям/J < 0; П точек 4i=Pi + (Pn-i-Pdti пересечения ребер полигонаPiPi+l с отсекающей прямой {ро, V) при условии Ш < о,
Геометрические задачи визуализации 451 означающем, что вершины /?, и pi+l находятся по разные стороны от прямой. Значение параметра ft ',= fj-fi+l в точке пересечения /-го ребра с прямой при разностороннем расположении вершин/?, и/?,+i всегда удовлетворяет условию 0 < г, < 1. По окончании цикла проверяется замкнутость полученной в списке U ломаной линии путем сравнения ее крайних вершин U\ и Uk, где k - size(U). При совпадении этих точек алгоритм возвращает полигон U= {U\,..., £/A-i, Uk= U\}. Однако, если первая вершина отсекаемого полигона р\ лежит вне полуплоскости, то крайними вершинами ломаной U- {U\,..., Uk) являются две точки пересечения. Замыкание ломаной линии до полигона выполняется добавлением точки U\ в конец возвращаемого списка U. На основе описанного метода отсечения работает алгоритм построения выпуклого полигона conv^poly (рис. 4.24), полезный в различных задачах компьютерной графики. Алгоритм выполняет поочередное отсечение выпуклого полигона Р — big_box случайно сгенерированными полуплоскостями. Секрет получения всегда непустого решения — в способе выбора отсекающих линий, у которых начало координат всегда лежит слева от векторов направлений, т. е. в отрицательных полупространствах. ( <<- BIG BIG conv_ poly " P—big_box 1 ) r Выбор q = \x у] У = [-У *] P = clipJine(P,q,V) ( Рис. £^max(PJ^2 B03Bf 4.24 зат P ) На плоскости задается или случайно генерируется точка q = [x j]^02, через которую проводится отсекающая прямая {q, N] с вектором нормали N = q и направляющим вектором V=NR(90°)=[-у х].
452 Глава 4 Отрицательное значение неявной функции (1.35, в) в точке с координатами [о 0] nf V(q, V, О2) = nfN(q, q,Oi) = -q°q<0 доказывает, что начало системы координат находится слева от любой построенной таким способом прямой. Генерирование полуплоскостей и отсечение ими полигона Р продолжается до тех пор, пока в координатах его вершин имеются габариты исходного полигона — числа BIG или -BIG. При полном отсечении от Р всех границ объекта big_box алгоритм возвращает полученный выпуклый полигон как решение задачи построения случайного выпуклого полигона. Область применения метода отсечения выпуклого полигона полуплоскостью обширна: это целый круг задач, связанных с изображением сцен, отдельных объектов и оптических эффектов внутри ограниченных выпуклых окон, граней, зеркал... Задачи отсечения с невыпуклым полигоном и/или невыпуклым отсекателем могут быть сведены к объединению выпуклых решений после разрезания невыпуклых фигур на выпуклые фрагменты, в частности, на треугольники. Алгоритмы разрезания произвольных полигонов изучаются в конце разд. 4.2.7. 4.2.7.2. Расчет ядра произвольного полигона Ядро полигона — это множество точек, из которых напрямую видны все его вершины [18, 24]. Две точки полигона р, и р, взаимно видны друг другу, если весь отрезок p,pj принадлежит полигону. Любой выпуклый полигон совпадает со своим ядром (рис. 4.25, а), но не каждый невыпуклый полигон имеет ядро, что видно из сравнения рис. 4.25, б с рис. 4.25, в. В обиходном смысле ядро К полигона Р— это то, что останется от исходной неограниченной плоскости после отрезания от нее ножницами всего, что находится по одну сторону от линий разреза — сторон полигона Р — по завершении обхода его ребер. Выбор положительного направления обхода приводит к отсечению Р отрицательными полуплоскостями его ребер, что позволяет использовать для этой операции алгоритм clipjine. Заметим, что описанная процедура вовсе не равносильна разрезанию полигональной фигуры в процессе обхода ее сторон. При наличии у полигона невыпуклых вершин последовательное отсечение удаляет некоторые ребра, формирующие ядро, в результате чего от полигона остается нечто большее, чем его ядро (рис. 4.25, г). Алгоритм kern_poly(P) расчета ядра полигона Р = {р\ ...р„р\} работает в соответствии с блок-схемой, приведенной на рис. 4.25, д. Вначале с помощью функции dir_tesi(P), наиболее удачный вариант которой приведен в (1.50), находится направление обхода d е {+1, -1} исходного полигона Р, а начальное значение отсекаемого полигона К устанавливается равным big_box. Затем для каждого ребра PiPi+i вычисляется вектор направления V-,= p,+\-pj и выполняется отсечение полигона К прямой этого ребра: справа при d- 1 либо слева при d--\. Если после очередного отсечения полигон К окажется пустым, то ядра полигона Р не существует, а алгоритм возвращает пустой результат К-0.
Геометрические задачи визуализации 453 С kern_poly(P) J >' d=dir JC'St(P), 1 K=big_bo.x —X^i=\....six(P)-\^y end 1 V = (Pm-P,)-<1 K = clipJine(K,p„V) 0k- C Возврат К J Рис. 4.25 4.2.7.3. Пересечение выпуклых полигонов Близкой к задаче нахождения ядра полигона является реализация булевой функции А &В пересечения выпуклых полигонов А и В. Если в алгоритме kern_poly заменить Р на А, К на В и отсекать от полигона В фрагменты, не принадлежащие полуплоскостям сторон полигона А, то получим полигон, принадлежащий как А, так и В, т. е. их пересечение А &В, если оно, конечно, существует. Оно же является ядром объединения выпуклых полигонов А + В. Из этих соображений на рис. 4.26, а построена блок-схема алгоритма cross_conv(A,B) расчета пересечения выпуклых полигонов A = {а\ ... а„а\} и
454 Глава 4 В = {b\ ...b„,b\}. Алгоритм возвращает полигон А&В, если тот существует (рис. 4.26, б), либо пустой полигон, если А и В касаются или не пересекаются (рис. 4.26, в). В алгоритме используется результат d — dir_test(A) теста обхода полигона А, благодаря чему отсечение полигона В всегда выполняется с внешней стороны ребер полигона А, т. е. справа от них при d — 1 или слева при d--\. С cross_conx(A,B) 1 < d=dir_test(A) * r ) \i=l...size(Ay-\b— end - B=clip_line(B, a„ V) 0]<- ( Возврат В J Рис. 4.26 4.2.7.4. Отсечение проекции выпуклого полигона Геометрическое построение изображения сцены разделяется на два этапа: П проецирование объектов на некоторую бесконечную плоскость — картинную или экранную; П отсечение графических элементов (ребер и граней) реальными границами окна вывода. Сложность первого этапа определяется выбором метода проецирования из тех. что описаны вразд. 2.2 (см. рис. 2.38). Параллельное проецирование Параллельное проецирование на фронтальную плоскость f е ху с помощью Сп — одной из проективных матриц Of из (2.60), Af из (2.71) или К{ из (2.76) — дает простую и однозначную формулу расчета проекции любой точки р независимо от ее положения в пространстве: Р=рСП. . (4.11)
Геометрические задачи визуализации 455 Физически безусловное существование проекции объясняется удалением проектора в бесконечность, откуда проецирующие лучи доходят параллельным пучком до каждой точки сцены и всегда пересекаются с неограниченной плоскостью проецирования. Проецирование более сложных, чем точка, графических объектов (отрезков, ломаных линий, полигонов) выполняется путем расчета по (4.11) проекций р\ всех формообразующих точек pt 3(1-объекта Р. В результате получаем плоскую проекцию объекта Р'. На втором этапе производится внешнее отсечение отсекателем О: П отрезка а'Ъ' с помощью функций clip2_cross(a'b',0) (см. рис. 1.18), clip2_test{a'b', О) (см. рис. 1.19), reg_outclip2(a'b', О, Ls) (см. рис. 4.8, а) или ош- clip2(a'b', О, Ls); П полигона Р'— функциями outclip2_poly(P',0,Ls) или cross_conv{P', О) (см. рис. 4.24, а). Центральная проекция Центральная проекция р' = [х' у' о] точки р = [х у z] на фронтальную плоскость f от ближнего проектора S = [sx sy sz\ вычисляется по (2.86): A = l ^p=s + -^—-. (4.12) sz h Существование проекции точки условно и зависит от знака числа И. При И > О луч пересекает плоскость f, а проекция (4.12) действительна. При И < 0 с проективной плоскостью пересекается лишь обратное продолжение луча, создавая мнимую проекцию. Наконец, при И - 0 луч параллелен f, а проекции точки с координатой 1 = sz не существует. Все формы центральной проекции отрезка ab в зависимости от значений h„ и hh приведены в табл. 4.2. Действительная проекция может быть отрезком а'Ъ' при {ha >0}fl{fy, >0} или лучом (два варианта), для расчета направления которого используется невырожденная точка схода (2.89) Таблица 4.2 ^^^ л„<о й„>0 И„<0 а' -> 2а' -рс й„>0 Ъ' -* 2Ъ' -рс [a',V]
456 Глава 4 Pc=S-yv (4.13) проекций прямых с направлением V= b-a. Функции внешнего отсечения отрезка a'b' выпуклым отсекателем О те же, что и в задаче параллельного проецирования. Отсечение луча а' -> Ъ' может быть выполнено функцией clip2_cross(a'b', О) совместно с табл. 1.5 либо любой другой функцией отсечения отрезка [а', а' + (а' - Ь')у] при задании достаточно большого числа у. Принципиальное отличие центрального проецирования полигона Р = {р\ ...р„р\} от параллельного заключается в том, что когда не все точки pt имеют действительные проекции с параметром И, > О, то на плоскости f образуется незамкнутая и неограниченная проекция Р' (рис. 4.27), не пригодная для использования в функциях outclip2_poly(P', О, Ls) и cross_conv(P', О). Применим для решения задачи отсечения полигона Р' выпуклым полигональным окном О функцию clipjine. Поскольку она работает с неограниченным отсекателем — полуплоскостью, то по свойству коммутативности внешнего отсечения назначим отсекаемым объектом полигон О, а граничными линиями полуплоскостей — прямые, на которых лежат действительные проекции ребер полигона Р. Рис. 4.27 В табл. 4.3 приведены все варианты выбора параметров отсекающей прямой {ро, V) € f в зависимости от значений hu и h,„ вычисленных по (4.12) для концов проецируемого отрезка а и Ъ. По этой таблице выбираются аргументы {ро, I } функции clip_line{0,po, V) при отсечении полигона О действительной проекцией
Геометрические задачи визуализации 457 ребра PiPi+\ полигона Р. Если ни одна из вершин pt не имеет действительной проекции, то отсутствует вся проекция полигона Р. Таблица 4.3 a ^~~~-—_^^ Л„<0 й„>0 Л„<0 {а', а' -/М ЛЛ>0 {b',pc-b') {a',b'-a'} Как определить направление обхода фигуры Р', определяющее ориентацию отсекающих полуплоскостей относительно их граничных прямых? Ввиду возможной незамкнутости линии Р' применение теста dir_test(P') в общем случае невозможно. Тем не менее, задача легко разрешима с точки зрения дальнего проектора S ". Достаточно вычислить ортогональную замкнутую проекцию полигона Р " = POt е f, найти направление ее обхода dir_test(P "), инвертировать его при расположении проекторов 5 и 5 " по разные стороны от плоскости полигона Р и использовать полученное значение d в аргументе d- V функции clipjine. Кстати, если проектор лежит в плоскости полигона Р, то проекция Р' вырождается в неполигональную фигуру нулевой площади (отрезок, луч или бесконечную прямую), что равносильно отсутствию проекции. Итак, выкристаллизовывается следующий алгоритм clip^pro(P, О, S) отсечения центральной проекции полигона Р= {р\ — рпр\) е R3 выпуклым окном О е f, возвращающий часть проекции Р' с О внутри окна О либо пустое решение 0 (рис. 4.28). & Шаг 1. По (1.119, г) находим значение неявной функции f =п/Ъ(р\,рг,ръ, S). Если/= 0, то проектор лежит в плоскости полигона Р, а алгоритм возвращает пустое решение О = 0. Шаг 2. Определяем направление обхода d = dir_test{P ■ Oi) ортогональной проекции Р на плоскость проецирования f и корректируем его умножением на sgn(/). Признаку существования действительной проекции присвоим значение s = 0. Следующие шаги 3-=-6 выполняются в цикле i = 1, sizeyP)-1 для каждого отрезка, направленного от точки р( = ак точке pi+i = Ъ. Шаг 3. По (4.12) вычисляем значения л а. , . Ь,
458 Глава 4 Cdip_pro(PjOJS)\ f=sgn(n/3(pi,p2,p3,S)) d = fdirJest(POf) 5 = 0 ( Возврат 0 ) Si=\...si:e(P)J>- end b'=S+(b-S)/hh, 5 = 1 i-*l pc=S-{b-a)szl{b:-az) Выбор {p,,,!7} по табл. 4.3 ( Возврат О J Рис. 4.28 Проекции концов отрезка ' о , a~S h'-v i b~S a=S + , о—i+——
Геометрические задачи визуализации 459 действительны, соответственно, при ha > 0 и /г,, > 0. В любом из этих случаев устанавливаем признак s= I. Шаг 4. При выполнении условия К > о}П{hb < o}\j{ha <о}Пк >о} один из концов отрезка ab имеет действительную, а другой — мнимую проекцию. Для расчета направления линии отсечения вычисляем по (4.13) точку схода Pc=S-.S* (b-a). bz -с. Шаг 5. Выбираем по табл. 4.3 параметры прямой отсечения — точку ро и направление V. Шаг 6. При {ha > О} U {h/, > о} выполняем отсечение полигона О полуплоскостью с граничной прямой {ро, V). Если в результате получим О = 0, то алгоритм возвращает пустое решение. Шаг 7. При s - 1 возвращается полигон О, иначе — пустое решение О - 0. □ & Пример 4.12. Наблюдатель находится в точке 5 = [о 0 F] на фокусном расстоянии F — 30 от фронтальной плоскости проецирования. Построить перспективное изображение плоского пятиугольника Р с вершинами р,=[4 -4 14], р2 = [4 4 26], р3=[0 8 34], р4=[-4 4 30], р5=[-4 -4 18] внутри прямоугольного фронтального окна О с габаритами -15<х<15 и - 10 <у< 10 (см. рис. 4.27). Решение. Вычислив по (4.12) числа Л, = 1 - z, / F, равные //1 = 0.533 > 0, In = 0.133 > 0, из = -0.133 < 0, Ы = 0, As = 0.4 > 0, и анализируя их знаки, заключаем, что вершины полигона р\, рг и ръ имеют по (4.12) действительные проекции /?(=[7.5 -7.5 0], /?2=[30 30 0], р'5=[-\0 -10 о], тогда как вершины ръ и/м таких проекций не имеют. Следовательно, лишь ребра р\рг npsp\ образуют на плоскости ху действительные проекции в виде отрезков Р\Р'г и P'sP\ ■ Проекции ребер ргръ и pips, для которых Лг/гз < 0 и /м/гз < 0, представляют собой лучи, векторы направлений которых Уг и V* вычислим по табл. 4.3 с помощью точек схода (4.13): Pc2=S — (ft-ft)=[l5 -15 0]=> У2=Р2-Рс2=Ь 45 0]; z3~z2 Pc4=S ^_(р5-р4)=[0 -20 0]=> К,=Л4-^=[10 -ю 0]. z5~z4
460 Глава 4 Оставшееся ребро рзр4 не проецируется на фронтальную плоскость ни в каком виде (рис. 4.29), т. к. целиком находится сзади проектора. Рис. 4.29 Таким образом, центральной проекцией замкнутого полигона {р\ргрзр4р5р\} на плоскость ху является фигура Р\Р2 ->°°...°°->Р5/>1 с незамкнутой границей в виде двух отрезков р'\Р2, р'$Р\ и двух лучей {р'2, У2}. {p5,V4f- Удаленность части границы в бесконечность не позволяет считать эт> фигуру полигоном и определить направление ее обхода. Для выполнения данной операции построим ортографическую проекцию Р"еху путем обнулены» z-координат вершин pt (см. рис. 4.27). Направление обхода Р" положительно и п/3{р\,р2,рз, S) = 256 > О, поэтому d = 1 и отсечение полигона О полуплоскостями будем выполнять справе от их граничных линий {poh F,}. Начинаем обход ребер полигона Р и отсечение окна О линиями их проекций Первая же прямая {р[, р'2 -р'\} отрезает от О правый нижний угол. Вторая пря-
Геометрические задачи визуализации 461 мая \pi,V-ii не изменяет окна, полностью лежащего слева от нее. Третье ребро рър* не создает отсекающей полуплоскости. Прямая {/¾.^} отсекает от окна левый нижний угол. Наконец, последняя прямая {р'5, р\ - р'^\ отсекает от^остат- ка окна нижний треугольник. В итоге центральная проекция полигона Р на ограниченное плоское окно О представляет собой шестиугольный полигон, занимающий большую часть окна. □ 4.2.7.5. Выпуклая полигональная оболочка массива точек Допустим, на плоскости задан массив Р—{р\,р2,...,р„) из п>2 точек Pi =lxi >'/]• Выпуклая полигональная оболочка массива точек есть объединение всех полигонов, построенных на точках этого массива как на вершинах. Ее можно также представить как выпуклый полигон минимальной площади, накрывающий все точки массива (рис. 4.30). У' 10 8 V 4 2 Ут 0 L ::::35:: Рг^^ ^\* ^rz\ Ри\ ♦ 1 | \|г Pi\ jPioN 1 \ ф—ф—i — Рщ \P\-Pn 1 |- {--{- РЛР» : X-f—-f- iV4^> PjrP7] ТР12 Ч, "Ч 2 4 хт 6 8 10 X о о Исходные точки —о— Вершины оболочки Рис. 4.30 По отношению к оболочке точки массива делятся на внутренние и граничные, принадлежащие сторонам полигона оболочки. Граничные точки, образующие вершины этого полигона, назовем выступающими. На отрезки между выступающими вершинами могут попасть другие граничные точки. Задача построения выпуклой оболочки заключается в поиске выступающих точек и формировании из них замкнутого контура. Алгоритм cover(P), решающий задачу построения выпуклой оболочки, представлен блок-схемой на рис. 4.31. Он воплощает простой метод построения ограды
462 Глава 4 вокруг рощи деревьев, по которому сначала выбирается некоторое "крайнее" дерево (на рис. 4.30 нижняя левая точка), от которого строится первая сторона ограды в направлении второго выступающего дерева под углом ф| (на рис. 4.30 угол ф1 = 0). Если в этом направлении растет несколько деревьев, то ограда строится до самого дальнего из них. Начинаясь с этой новой точки, вектор направления вращается на минимальный угол фг, под которым видно третье выступающее дерево... Процесс огораживания продолжается до тех пор, пока полигон не замкнется в начальной точке. В итоге окажется, что контур ограды соединяет выступающие деревья отрезками прямых и при этом все деревья расположены с одной стороны от каждого отрезка ограды. Следовательно, в соответствии с тестом convl, определенным в (1.37), полученная полигональная оболочка является выпуклой. ( cover(P) J m=\,n-size(P) <— >0 <->о *ч /=2...л m=i Л ч - end -<0 —| Pi<->Pm. Ai+i=Pi I s=- l,d=0,m=k+l Si=m..ji+l ^— end k=k+l, рт<нр, v=PrPt-\ ( Возврат {p,...Pt} ) Рис. 4.31 Переходя к алгоритмизации процесса построения полигональной оболочки, выберем положительное направление охватывания точек массива и найдем в нем первую выступающую точку р,„ с минимальной ординатой ут (рис. 4.30). Если таких точек несколько, то выберем из них точку с минимальной координатой хт. Путем обмена/я <->/>,„ поставим найденную точку в начало массива, а ее копию добавим в конец массива в виде точки р„+] для обеспечения проверки замыкания оболочки. Зададим начальное направление вектора охватывания У=х° вдоль оси х и индекс конечной точки оболочки к - I.
Геометрические задачи визуализации 463 Далее организуем внешний цикл поиска выступающих точек р,„ и накопление их в начале массива путем обмена р,„*->рк. Во внутреннем цикле i = k + l,n + l для каждой точки р, вычисляется вектор пробного направления W — pt-pk. При ненулевой длине этого вектора г = \W\ * 0 (данная проверка позволяет отсечь кратные точки, которые не должны входить в оболочку) находим скалярное произведение c = cos((p)=VoWe[-l, l]. Перебрав точки р, Vi > к, находим точку р„„ видимую из точки рк под минимальным углом ф = Z(V, W), т. е. при максимальном значении с. Если таких точек несколько, то выбираем из них самую дальнюю от рк. Инкрементировав индекс к-к + 1, сделаем ее путем обменар„,<->рк новой выступающей точкой оболочки. Новый вектор направления положим равным V-рк -рк-\. Внешний цикл и построение оболочки заканчиваются при совпадении точки рк с начальной точкой р\. Алгоритм возвращает субмассив вершин оболочки {/71 ...рк). Статистическое моделирование алгоритма cover(P) со случайными выборками случайного числа точек показало его высокую надежность и быстроту работы. По сравнению с описанным в [18] алгоритмом giftwrapHull, основанным на методе "заворачивания подарка" [24], наш алгоритм правильно строит оболочку и в том случае, когда в массиве есть кратные и коллинеарные точки. Применительно к задаче отсечения расчет выпуклой оболочки может быть полезен, например, при построении тени выпуклого полиэдра Р на ограниченной плоскости f. Можно, конечно, решать задачу внешнего отсечения проекции каждой грани полиэдра контуром плоскости f. Тогда после закрашивания одинаковым темным цветом все теневые полигоны сольются в один общий выпуклый полигон тени. Для достижения той же цели более эффективно будет вычислить точки — проекции вершин полиэдра на бесконечную плоскость, совпадающую с f, построить выпуклую оболочку этих точек, а затем только один раз выполнить внешнее отсечение оболочки замкнутым контуром f и закрашивание полученного полигона цветом тени. Функция cover может быть также полезна как генератор выпуклых полигонов. & Пример 4.13. Построить выпуклую оболочку массива точек р\ н-p\s с тремя кратными точками pi =р\\,ръ=рп np4=ps (см. рис. 4.30). Решение. Анализируя координаты точек, находим самую нижнюю левую начальную вершину оболочки ръ. Переставив ее с точкой р\ и добавив копию в конец массива, получим (нумерация точек сохранена в исходном виде, хотя в действительности она меняется согласно месту точек в массиве) Р= {P3,\p2p\p4ps...p\sp3}. Вертикальная черта отделяет вершины построенной части оболочки от остальных точек массива.
464 Глава 4 Вторую выступающую точку ищем по принципу уменьшения положительного угла ф| между векторами F = [l о]и Wt -Pj-рз. Просматривая точкирг,р\,р*,рь. находим, наконец, точку рэ с углом ф! = 0. После перестановки рэ с рг массив принимает вид Р= {рзрч\ pi р* ... р% ргpw ...pxspi). Следующий угол фг между векторами V-ря-рз и И^- = /?,- — /?9 будет минимальным для выступающей точки pis, обменяв которую ср\, получим следующий состав массива и в его начале — построенную часть оболочки: Р = {psр9pis \рл ...psргpw ...pupipi}. После нахождения четвертой выступающей точки рг и обмена ее с точкой /?4 массив принимает вид Р - {рзрчрпрг \psp6p7psp4piopupi2pi3pi4pi рз}. Обнаружение выступающей точки рт, совпадающей с первой вершиной оболочки рз, завершает работу алгоритма. Окончательный состав полигона оболочки следующий: Р= {рз ря pis рг pi}. Полигон является замкнутым из-за совпадения точек рз и рт. Как видно, благодаря этому совпадению точка рз, специально помещенная в конец массива, не пригодилась. Но если бы точка рп находилась в другом месте, то алгоритм закончил бы свою работу при обнаружении совпадения начальной точки рз с ее копией в конце массива. СЗ 4.2.7.6. Полигонализация массива точек Свойство видимости всех вершин полигона из любой точки его ядра наводит на мысль о возможности такой сортировки массива точек Р - [р\,рг,... ,р„), что все они могут быть соединены замкнутым полигональным непересекающимся контуром и будут видны из некоторой, например, первой точки массива (рис. 4.32). Описываемый алгоритм полигонализации массива точек poly_point(P), блок- схема которого приведена на рис. 4.33, основан на выполнении сортировки точек по возрастанию угла вращения луча/я/?,- V/ = 2, и,/>,-*/», не допуская пересечения ребер строящегося полигона друг с другом и исключая из списка вершиь кратные и содержащие развернутый угол точки. Сначала формируется массив Q = {qi,..., q„,} из in < п точекр, Фр\ и по (1.31) вычисляются углы q>i=ang\c°,Vi)&(-n,n] между векторами [l О] и Vi = qt-p\. Затем точки q, сортируются по возрастании. углов ф„ и к полученной ломаной линии {qt аг... q„,} по краям добавляется точка/л.
Геометрические задачи визуализации 465 У 10 8 6 4 2 0 к Рг ц : ! : Ы . 1р.4! 2 •\ Р„ / / L РГРп 4 6 РхЛ Р\=Р\Л Ру}\ Чр&1 \ \Рь\ \Р*^ 8 10 х Исходные точки Вершины полигона Рис. 4.32 Q poly_point{P) J »i=0 1—► N ч—0- r*2...size(P) > ' V=prp, <Cjj^> / m = m + \,g,„=p, Ф т="Щ A*°S ') Рис. 4.33 Будет ли замкнутый полигон Р= {p\q\ ... q,„p\) решением задачи полигонализа- ции массива точек, как это утверждается в [18]? Ответ утвердительный почти всегда для произвольного набора точек. Однако возможны случаи, нарушающие данный порядок формирования полигона. Соответственно, дальнейшие действия следующие: □ если существуют соседние лучи/я -> cj, и/я -> #,+, с углом вращения Ф,-+|-ф,->л,
466 Глава 4 т. е. больше развернутого, то полигон Р= {p\q\ ... qmp\} является самопересекающимся (рис. 4.34, а). В таком случае можно выбрать другой замкнутый полигон Р - {q\ ... q,pi q^, ... q,„ q\) с ядром в точке q\\ Рис. 4.34 □ если полученный массив Р имеет на одном отрезке прямой группу соседних точек, то вершинами полигона могут быть только концевые точки этого отрезка. Удаление лишних вершин выполняется алгоритмом формирования минимального полигона min_poly{P) (рис. 4.35) в процессе обхода вершин полигона Р по замкнутому контуру. Работа алгоритма начинается с инициализации начального значения индекса т = 1 и выполнения цикла / = 2, size(P) тестирования точек /?, на способность быть вершинами минимального полигона. Совпадающие с /?,„ точки р{ пропускаются, а остальные проверяются функцией (1.35, г) на принадлежность прямой ребра р„,-\Р,„. Если nf1(Pm-uP„„Pl)*®, то после инкрементирования индекса т = т + 1 не коллинеарная с прямой {рт-\,р„,} точкаPj сохраняется как вершина полигонарЯ1. Коллинеарная с отрезком р„,-\Р,„ точка/?, может располагаться относительно него в одном из следующих положений: • спереди (рис. 4.34, б) при условии O,--A»)°O»-A»-i)>0> тогда она заменяет точку/?,,,; • сзади (рис. 4.34, в) при условии (Pi-p„ri)°(Pn,-P„ri)<Q, тогда делаются замены р,„ -> /7,,,-, и /?, -> /?„,; • внутри, тогда она пропускается.
Геометрические задачи визуализации 467 ( min_poly(P) m=\ Рис. 4.35 По завершении обхода в начале массива Р оказываются накопленными m вершин минимального полигона {pi —р„,}. Перед его возвращением выполняется последняя проверка условия nf2{pi,p2,p„,-,) = О, выявляющая возможную коллинеарность точек /?,„-ь pi, рг. При обнаружении данного факта возвращаемый полигон заменяется на {рг ...р,„-\ рг). Функция poly joint может быть полезна как генератор произвольных полигонов для различных тестов и задач. Самостоятельное значение имеет и функция min_poly, которую рекомендуется использовать для удаления из полигона избыточных элементов, затрудняющих, например, расчет нормали к его плоскости. Это кратные вершины (между ними ребра нулевой длины) и вершины, имеющие развернутый угол 180° между примыкающими к ним коллинеарными ребрами. & Пример 4.14. Построить полигон на точках/?! -ь/?!5 из примера 4.13. Решение. Вычислим углы (в градусах) ориентации каждой, кроме р\ \, точки массива относительно/?!: Pi ф/ Рг 149° Ръ -108° Ра 26° Р5 108° Рв -56° Pi -108° Р% 26° Р9 -37° Р\0 90° Pi 2 -90° Р\Ъ 180° Р14 180° Pi 5 90°
468 Глава 4 Угловая сортировка, выполненная MathCAD-программой, расположила точки массива Q в следующем порядке: 4i ф,- Ръ -108° Pi -108° А 2 -90° Ре -56° Р9 -37° Р4 26° As 26° А 5 90° Ао 90° ft 108° Pi 149° A3 180° А 4 180е Так как приращения углов между каждой парой соседних точек меньше л, то замкнутый контур обхода точек массива имеет вид Р - {р\ргрпрпрьр9р4рър\5р\ор5ргрприр\}. Приступая к минимизации этого массива, отбираем точки р\, pi, пропускаем кратную точку pi =pi, добавляем рп. Следующая точка рь коллинеарна отрезкл рърп и лежит впереди него, поэтому точку ри заменяем точкой рь. Она, в свок очередь, заменяется коллинеарной точкой рч, лежащей впереди отрезка рърь. Далее к списку добавляется вершина р4, а кратная точка рь =/м пропускается. Вершина/715, лежащая впереди отрезкар*>р4, заменяет точку р*. Следующими вершинами минимального полигона становятся точки pw, pi (она заменила точку рь, т. к. лежит впереди отрезка рю/?5),/т и ри. Последняя точкар лежит сзади коллинеарного отрезка р\ъри, поэтому в соответствии с рис. 4.34. в последние звенья минимального полигона {...ргрприрх} заменяем на {...ргрмрх}. В результате получаем полигон Р- {p\pip<>P\5piop2pupi}. □ 4.2.7.7. Разрезание невыпуклого полигона Для успешной работы некоторых алгоритмов невыпуклого отсечения необходимо уметь выполнять разрезание невыпуклого объекта на выпуклые составляющие. Эта операция представляет и самостоятельный интерес. Она заключается в построении границ, по которым исходный объект распадается на выпуклые непересекающиеся фрагменты. Желательно, чтобы число фрагментов было минимальным. Разрезание может быть ручным и алгоритмическим. Ручное разрезание заведомо известного невыпуклого объекта, естественно, может свести число фрагментов к минимуму за счет интеллектуальных способностей человека. Если же объект вычисляется в процессе работы программы и заранее неизвестны его конфигурация и даже сам факт выпуклости, то необходимы алгоритмы проверки выпуклости и разрезания невыпуклого объекта на выпуклые фрагменты. Разработаем метод разрезания полигона Р= {pi ...p„pi} хордами— продолжениями его ребер (рис. 4.36). Ясно, что будучи выпуклым, в частности, треугольным, полигон не нуждается в разрезании, т. к. продолжения ребер проходят снаружи него. Невыпуклый же полигон можно начинать резать с любогс невыпуклого угла. Поэтому исходный полигон Р необходимо проверить тестоу выпуклости conv2(P), приведенным в (1.37). Идейная основа этого теста — односторонняя ориентация вершин у выпуклого полигона— пригодна для обнарч-
Геометрические задачи визуализации 469 жения невыпуклого угла Z/7,/7l4,/7l+2 при вершине /?,+, по совпадению знака числа nf 2(/?„/7,+,,/7|+2) с направлением обхода полигона d - dir_test(P). 10 х Далее нужно рассчитать все пересечения лучар,—>/?,+, за точкой pi+l с ребрами А+гА+з* — >РпРи — *PriPi-\ и найти минимальный параметр пересечения 6 > 1, номер к ближайшего пересеченного ребра, ближайшую точку пересечения q=Pi + (pi+\-p№ и линию разрезаpl+l q, по которой полигон Р разделяется на два фрагмента Р\ и Рг. Для простоты формирования списков вершин фрагментов будем после каждого обнаружения выпуклого угла делать левый циклический сдвиг списка вершин полигона Р = {р\рг ...р„р\) (рис. 4.37) функцией LCShift(P) = {/72/73 ...p,pipi). (4.14) >Г> гу»г^)Г\ Рис. 4.37 Теперь, благодаря сдвигам, тестируемая на выпуклость вершина имеет постоянный номер /72, луч /7i/72 проверяется на пересечение с ребрами /73/74,... ,р„-\Р„, а полигон разрезается на два фрагмента ^i = {ptqPk+i -Р„Р'}, Р2= {ргръ...pkqрг}.
470 Глава 4 При совпадении найденной точки q с вершиной полигона Р у одного из фрагментов появятся кратные вершины, которые должны быть удалены. Возможно также совпадение луча с какой-либо стороной разрезаемого полигона (см. рис. 4.36), в результате чего один из фрагментов будет иметь вершину с развернутым углом. Поэтому фрагменты перед дальнейшим разрезанием необходимо минимизировать алгоритмом min_poly (см. рис. 4.35). Описанная процедура разрезания невыпуклого полигона на два фрагмента рекурсивно применяется для полигонов Р\ и Рг. Примерное дерево рекурсии, терминальные вершины которого есть искомые выпуклые полигоны, изображено на рис. 4.38. Выход из рекурсии с записью Р в массив списков Lm осуществляется при условии, что тест выпуклости полигона дал результат conv2(P) = 1. р 1 Л h 1 < 1 р» S Рц г 1 р Ргп рп Ла Рис. 4.38 Реализация всего сказанного в виде рекурсивной функции cut_poly(P, Lm) разрезания полигона Р изображена на рис. 4.39. Функция формирует массив Lm выпуклых фрагментов и возвращает их количество. Перед внешним обращением к функции необходимо инициализировать пустой массив Lm = 0, в который внутри функции будут добавляться выпуклые фрагменты, отрезанные от исходного полигона. Необходимость расчета множества пересечений прямых полностью уничтожает все преимущества апгоритмического метода разрезания при построении функций отсечения outclip2_segm и inclipljsegm. Ручной метод разрезания невыпуклого полигона имеет меньшую трудоемкость, чем алгоритмический. Тем не менее, алгоритм cut_poly незаменим в задачах разрезания полигонов заранее неизвестной конфигурации, которая может быть решена только алгоритмически, а не вручную. & Пример 4.15. Проиллюстрируем работу алгоритма cut_poly на примере разрезания невыпуклого полигона Р- {pi ...pi4pi}, изображенного на рис. 4.36. Тест (1.50) дает положительное направление обхода d = dirjtest(P) - 1. Дерево рекурсивного разрезания полигона показано на рис. 4.38. Решение. Начинаем первый уровень рекурсии с проверки выпуклости угла /-рхргръ. Так как nfHp\,pi,ps) - -6 < 0, то с учетом знака числа с!> 0 заключаем.
Геометрические задачи визуализации 471 что этот угол выпуклый. После левого циклического сдвига вершин исходный полигон принимает вид Р- {ргръ ...рнрхрг}. ( cut_poly{J>,Lm) J P=LCShifl(P) d=dir_test(P), A=0 > ' ■ <0 —<^d-nf2(plj>rp3) — end -^ /=3 ... n-1 \ c=cross_segm(plp2j?ipi+l,t,%v) }П{0<т<1}^>—0- P->Lm <0 ► в=Г, k=i, q=v cutjolyiipfip^ ...p„P,}, Lm) cut_pofy({p2p3... ptqp2), Lm) Возврат size(Lm) Рис. 4.39 Вот теперь из равенства знаков чисел d и п/2(р2,рз,р4) = 8 > 0 следует, что вершина рз является невыпуклой. Для удобства анализа работы алгоритма номера вершин оставлены без изменения. Лучрг->рз пересекается с ребрами рюрм, рхгрхъ, рхърм к рцрх. Из всех точек пересечения ближайшей к рз является точка q\, совершенно случайно совпавшая с вершиной ри. Таким образом, первоначальный полигон разрезался по отрезку P3q\ на два полигона: Р\ - {ргд\р\\р\гр\зрнр\рг},Рг= {рзрьрърбрпрьрърходхрз}.
472 Глава Л На втором уровне рекурсии полигон Р\, имеющий кратные вершины q\=pw и лежащие на одной прямой линии соседние вершины рг, q\ и рп, минимизируется алгоритмом min_poly до вида Р\ - {ргрпрпрмрхрг}. Далее этот полигон разрезается на фрагменты P\\=\p242P\4P\Pli=\P242P\P2i , /12=(^12^1392^12} а другой полигон Рг — на фрагменты Рг\ = {psqsp9pwqip3p4p5}, Р22={РбР1РМзРб} На третьем уровне рекурсии с помощью теста convl обнаруживается, что полигоны Рц, Р\г и Ри— выпуклые и в дальнейшем разрезании не нуждаются. Оставшийся полигон Рг\ на четвертом уровне разрезается на составляющие части ^211 ={Р9ЯАРАР5ЧЪР9} - Р212 ={р\0Ч\РзЧ4Р\о} которые на последнем пятом уровне тестируются как выпуклые. Таким образом, исходный полигон Р оказался разрезан на пять выпуклых фрагментов, которые записались в массив списков в следующей последовательности: ЬП= {Pll,Pl2,Pm,Pl\2,P22}. С] 4.2.7.8. Триангуляция полигона Триангуляцией называется операция разрезания полигона на треугольники. Она часто используется для сведения решения типовых задач (пересечения, отсечения, удаления и т. п.) в области, имеющей сложную конфигурацию, к совокупности задач, решаемых в области треугольника— простейшей геометрической фигуры. Что дает замена многоугольника набором треугольников? □ Значительно упрощается тест ориентации точки q относительно треугольни- к&р\ргръ. Достаточно записать разложение вектора q -pi -Vt+Wx по векторам сторон треугольника У = рг-р\ и W = ръ-р\, затем по метод\ Грама [9, 10] составить систему двух линейных уравнений из скалярных произведений (q-Pi)oV = VoVt + VoWx (q - р{ )о W = V о Wt + W о Wx и найти ее решение — коэффициенты разложения по базису {V,W}: [t x]=[{p-px)oV {p-px)°w] VoV VoW VoW WoW (4.15)
Геометрические задачи визуализации 473 Тогда из (2.58, б) следует, что при {/>0}П{т>0}П{' + т<1} (4.16, a) точка лежит внутри треугольника, при {/<0}U{t<0}U{/ + T>l} (4.16,6) она расположена вне треугольника, а в остальных случаях — на его границе. Обращаемая в (4.15) матрица с определителем |»f \W\2-(Vo W)2 = \V\2 \W\2 sin2(ZVW) = \p2-p.|2\pi-pi\2s\n2(Zpipip2)>0 невырождена при угле Zpspipi, не нулевом и не развернутом, т. е. при неколлинеарности вершин треугольника pi ргръ. П Благодаря минимальному числу сторон треугольного полигона быстро выполняются операции переборного типа, к которым относятся отсечение и удаление. Априорная выпуклость треугольника позволяет существенно упростить все алгоритмы обработки полигонов путем использования только их выпуклых вариантов. □ Структура данных для хранения m треугольников может иметь вид обычной матрицы размерности 3 х 4 х пг, а не более сложно организованных массивов, структур и списков. П Обобщение алгоритма триангуляции плоского полигона на криволинейную поверхность позволяет заменить последнюю сеткой треугольников, для которых значительно проще решаются все задачи визуализации, в том числе закрашивания всех точек треугольной грани в однородный цвет благодаря ее планарности. В принципе триангуляция произвольного полигона может быть выполнена модифицированным алгоритмом cut_poly(P), завершающая часть которого приведена на рис. 4.40, а. Суть модификации состоит в том, что в массив Lin вместо выпуклого и-угольника Р= {р\ ...р„р\) добавляется п - 2 треугольников {pipipspi}, {pipsp4pi},..., {р\р„-\рпр\}, полученных разрезанием полигона диагоналями p\pi,... ,р\р„-\ (рис. 4.40, б). Можно разрезать выпуклый полигон и другим способом (рис. 4.40, в) — на и треугольников {СР\Р2С},{СР2РЪС},..., {Ср„р>с} с дополнительно вычисленной вершиной — точкой геометрического центра полигона 1 " ".-=1 Хотя при этом получается большее число треугольных фрагментов, но зато они имеют менее вытянутую форму, чем при разрезании диагоналями.
474 Глава А Ccul_pol}iP,Lm)J P=mmjoly{P) n=size(P)-\ conv2(P) / i=l .. n-1 Y- end - *— {p\P,+\Pi+2Pt}-*Lm ->T Возврат size(Lm) J+- Рис. 4.40 Недостаток применения алгоритма cut_poly(P) для триангуляции состоит в том. что полигон разрезается хордами, пересечение которых с ребрами создает новые точки. Да и число полученных треугольников далеко от минимального. Рассмотрим более быстрый и экономичный метод триангуляции, в котором полигон рекурсивно разрезается на части диагоналями (рис. 4.41). Задача заключается в поиске диагонали ptpt, удовлетворяющей следующим условиям: □ она является внутренней диагональю полигона; □ она не пересекает и не касается не смежных с ней сторон полигона. 8 - 8 10 х Рис. 4.41
Геометрические задачи визуализации 475 Рекурсивный алгоритм триангуляции полигона Р= {р\ ...p„pi}, реализующий эти условия, приведен на рис. 4.42. Работа функции tri_poly(P, Lm) начинается с минимизации исходного полигона, необходимой для исключения из него кратных и коллинеарных вершин. Если полученный полигон оказался треугольником (л = 3), то он добавляется в возвращаемый список Lm. ( lri_poly(PXm) J P—>Lm P=min_poly(P) n=size(Py\ ^> d=dir test[P), *=3 *=*+! /i=k+] ... n-\ V- end k=i ЧВозврат "V si:e(Lm) J*~ trijolyi {p,pt... pnpl},Lm) trij>oly{lP, -PtP,hLm) Рис. 4.42 Дальнейшие действия выполняются с нетреугольным полигоном. В случае его выпуклости, что быстро проверяется тестом convl(P) — 1, полигон можно сразу разрезать диагональю р\ръ. У невыпуклого полигона сначала ищется вершина, из которой можно провести разрезающую диагональ. Для этого годится не каждая выпуклая вершина, чему пример — точка рп на рис. 4.41. В то же время из любой невыпуклой вершины р, напрямую видна хотя бы одна несмежная вершина^. Поиск невыпуклой вершины выполняется путем циклического сдвига вершин полигона функцией LCShift,
476 Глава 4 определенной в (4.14), до тех пор, пока значение п/2(р„, pi, рг) не станет того же знака, что и направление обхода d = dir_test(P). Благодаря сдвигам невыпуклая вершина и начало разрезающей диагонали всегда будут находиться в точке pi, а доступ к остальным вершинам полигона становится более простым. Второй конец диагонали рк, к е [3, п - 1], должен, во-первых, лежать относительно ребра pipi с внутренней стороны полигона, где значения d и nf2{pi,pi,pk) имеют разные знаки. Во-вторых, отрезок pipk не должен пересекаться или касаться ни с одной из следующих сторон полигона р,р,+|, несмежных с вершинами р\ и рк, откуда следует, что к + 1 < i < п - 1. Благодаря выбору начальной точки pi в невыпуклом угле такая точка рк и разрезающая диагональ pip,-, существуют всегда. Для ускорения процесса поиска после обнаружения пересечения диагональю стороны р,р,+| значение к приравнивается к L Разрезание полигона диагональю pi рк реализуется рекурсивным обращением к функции tri_poly со следующими аргументами-полигонами: Pi = {pipk ...p„pi}, Рг - {pi ...ркр\). Примерное бинарное дерево рекурсии, терминальные вершины которого представляют собой искомые треугольники, показано на рис. 4.43. Функция формирует массив Lm, содержащий выпуклые фрагменты разрезанного полигона, и возвращает их число. Перед внешним обращением к функции необходимо инициализировать пустой массив Lin = 0, в который внутри функции tri_poly будут добавляться треугольники, отрезанные от исходного полигона. & Пример 4.16. Проследим работу алгоритма на примере триангуляции невыпуклого полигона Р- {pi ...pupi} (см. рис. 4.41). Тест (1.50) направления обхода полигона дает значение d= dir_test(P) = 1. Дерево рекурсивного разрезания полигона изображено на рис. 4.43. t + г„ 'и 1 ' ;-*W. * г, 1 S %. > г *щ-: р 1 Рт 1 ~> Р2 % ' Гц \ ' рт Р<> ' *И11 *1 i :4-: 1 рт + Р :2\П ♦ ^21111 % р '' чшг- *_ ^2Ш11 4мш, Рис. 4.43
Геометрические задачи визуализации 477 На первом уровне рекурсии после двух циклических сдвигов по условиям d> О и п/2(р2,рз,р4) = 8>0 находим невыпуклую вершину ръ, которая становится началом полигона: Р= {рър* ...рыр\ргръ). Для удобства анализа работы алгоритма номера вершин оставлены без изменения. Последовательная проверка точек рк на левое (при d= 1) расположение относительно ребра рър* и диагоналей рърк на непересечение с остальными ребрами, начиная с ребра A+iA+2> Дает значение к= 10. Таким образом, исходный полигон разрезался диагональю рърю на два фрагмента: Pi = {рзрю ...рнр\ргръ},Рг= {ръ ...рюръ}. На втором уровне рекурсии у полигона Pi сразу находим невыпуклую вершину ръ и диагональ разрезаниярърп, которой он разрезается на фрагменты Рн = {рърп ...рыр\ргръ), p\l = {рзРюР\\Рз} У полигона Рг находим ближайшую невыпуклую вершину рь и диагональ ptpt, которой он разрезается на фрагменты Рг\ = {рьрър9р\орър*р$рь}, ^22 = {РьРтРъРь) На третьем уровне обнаруживаем, что полигоны Рп и Ргг являются треугольниками и дальнейшему разрезанию не подлежат. Сохраняем их в предварительно инициализированном списке Lm. Полигон Рп, имеющий четыре вершины рг, ръ, рп и рп на одной прямой, минимизируем до Рп = {р\гр\ърир\ргр\г] и разрезаем диагональю рпри на фрагменты PU2= {Pl2Pl3Pl4Pl2} Pin = {pnpupxpipn}, Полигон P2i разрезаем диагональю рьр9 на фрагменты Рги = {рьр9р\орър*р$рь}, P2\2={P(,PZP9P(,}- На четвертом уровне рекурсии полигон Рп\, имеющий три вершины рг,рп,р\* на одной прямой, минимизируем до треугольника pu\={p\aP\P2P\a} и сохраняем в списке Lm. Полигоны Риг и Р212 также являются треугольниками и добавляются в Lm. Оставшийся полигон Рги разрезаем диагональю р\ор* на фрагменты Рг\\\ = {рюр*р5рьр9р1о}. Р2\\2={р\ОРъРлР\о} На пятом уровне обнаруживаем, что полигон Ргпг является треугольником, и записываем его в Lm. Полигон Pmi разрезаем диагональюpiops на фрагменты Ргпп = {р\ор5рьр9р\о}, ^21112= {P10P4P5P10}
478 Глава 4 На шестом уровне рекурсии треугольник Р21112 добавляем в Lm, а Р21111 разрезаем диагональю рюрь на фрагменты Г21111Г {р\оРбР9Р\о), ^211112 ={рюР5Рб/>ю} которые на последнем седьмом уровне добавляем в Lm как треугольники. В результате работы алгоритма полигон Р оказался разрезан на девять треугольников, которые записались в список Lm в следующей последовательности: Lm = {Pin, Р112, Р12, Р211111, Р211112, Р21112, Р2112, Р212, Р22}. □ После небольшой модификации алгоритм tri_poly можно использовать для разрезания произвольного полигона диагоналями на выпуклые, но не обязательно треугольные фрагменты. Суть модификации в том, что проверка треугольности полигона {п = 3} заменяется на проверку его выпуклости {conv2(P)= 1}, а следующее после вычисления dir_test(P) тестирование conv2(P) исключается (рис. 4.44, а). При разрезании полигона диагоналями не возникает новых точек, как это происходит при работе алгоритма cut_poly (см. рис. 4.36). Моделирование показывает, что невыпуклый полигон обычно разрезается диагоналями на несколько треугольников и один выпуклый не треугольный фрагмент. Например, полигон Р на рис. 4.44, б разрезался на шесть треугольников {pupip2pu}, {рмрприрп}, {рзрюрирз}, {рюрзр^рю}, {рбрър9рб}, {рьртрърб} и один пятиугольник {рюр4р5рьр9рю}. Рассмотренные нами алгоритмы разрезания cut_poly, tri_poly и все их модификации имеют общий недостаток: получаемые фрагменты имеют заранее непредсказуемые размеры и форму. Большое различие в габаритах и сильная вытянутость отдельных фрагментов затрудняют решение некоторых задач визуализации, например, сортировки граней по удаленности от наблюдателя (см. рис. 3.5), используемой в алгоритмах удаления невидимых элементов. Разработаем метод триангуляции с контролируемыми размерами получаемых треугольников, длины сторон которых не должны превышать значения h. Идея метода, эскизно намеченная в [19], заключается в поиске у полигона Р = {р\ ...р„р\) выпуклой вершины рт с минимальным внутренним углом V = min {|ф,|}, где ф, = Z(pH -phpi+l -р.) i (рис. 4.45, а), и отрезании от этого угла в зависимости от его величины одного (рис. 4.45, б), двух (рис. 4.45, в) или трех (рис. 4.45, г) треугольников с длинами сторон, не превышающими h. В двух последних случаях нужно так расположить вершины треугольников c,d и е между векторами v и w, чтобы длины всех отрезков не превышали значения h. Предлагается следующая методика вычисления этих точек, основанная на понятии пучка прямых линий (1.33, б). Сформируем параметрический вектор i/(X)=r(X)7*(-W>v), гдег(Х) = (1 -Щх] + Цк\, X е [0,1], (4.17)
Геометрические задачи визуализации 479 длина которого r(k) и угол отклонения у = -XD\\i от вектора v являются линейными функциями К. При изменении параметра в интервале X е [О, 1] этот вектор переходит из положения и(0) = v в положение г<(1) = w, равномерно увеличивая свою длину от |v| до \w\ и угол вращения от 0 до у. Теперь становится возможным расположить вершины отрезаемых треугольников в точках, вычисляемых с помощью вектора (4.17): a=p„ + v,b=pm + w; (4.18, a) с =р,„ +и(0.5); (4.18,6) d = р,„ + и(\ 13), е = ря + и(213). (4.18, в) С tri_poly(PJi.m) ) P=minj)oly(P) n=ste(P)-\ P—>Lm d=dirjest[P), t=3 P=LCShift(P) Рис. 4.44
480 Глава 4 ';'■ 120e<V<180" Рис. 4.45 Для уменьшения общего числа треугольников предлагается при расстоянии между точками а и Ь, меньшем значения h, отрезать всегда один треугольниками^,,,} независимо от величины угла ц/. Так как |v|</z и |>v| < Л, то этот треугольник удовлетворяет габаритному ограничению. Моделирование описанного метода триангуляции показало, что когда длины сторон полигона, примыкающие к вершине р„„ становятся меньше габаритного параметра Л, часто возникает коллизия с отрезанием треугольников. Отрезок ob может пересечь некоторые стороны полигона либо вычисленные по (4.18) точки с, d или е могут оказаться за его пределами (рис. 4.45, д). После отрезания треугольников новый полигон перестает быть частью старого. Он становится самопересекающимся либо изменяет направление обхода на противоположное. Понятно, что дальнейшая триангуляция такого полигона недопустима. Предлагается следующее решение этой проблемы. Перед отрезанием треугольников сохраним копии полигона Р' и списка отрезанных треугольников Lm', а после отрезания проверим обновленный полигон Р на самопересечение тестом selfjtest, рассмотренным в гл. 1. При положительном результате этого теста либо при изменении направления обхода полигона, проверяемого тестом (1.50), восстановим сохраненные в/"и Lm' данные и будем уменьшать в (4.17) длины векторов v, w и отрезать треугольники с новыми вершинами (4.18) до тех пор, пока полигон Р не перестанет самопересекаться или изменять направление обхода. На рис. 4.46 построен алгоритм contri_poly(P, Л) контролируемой триангуляции полигона Р с габаритным параметром Л, который реализует описанные выше идеи. Работа алгоритма начинается с инициализации пустого массива Lm = 0, в
Геометрические задачи визуализации 481 который будут добавляться списки вершин отрезанных треугольников, и вычисления направления обхода полигона D = dir_test(P), необходимого в функции (4.17) и для исключения анализа невыпуклых углов Ф,> 180°. Дальнейший процесс выполняется циклически до отрезания последнего треугольника. После каждого отрезания полигон изменяет свою конфигурацию, число п и список вершин Р-{р\ ...рпр\). Рассмотрим вычисления, выполняемые в одном цикле алгоритма. f conlri_poly{PJi) J Lm=0, D=dir_test[P) p2-> P,n=size{P)-\,\/=n < "-' )- end ■> V = Pm-\ -Pm,W = Pm+\ ~ Pn P'=P. Lm'=Lm V t W ^l=iPn/ fe-ilUo Lp2=b\J{pm+ ,p„+,} \pJ>aPmY*Lm P = Lpt vLp2 ( Возврат Lm J с = рго+и(1/2) {pmc°PmY*bn {pmbcp„,}-*Lm P = LptvcvLp2 К =*., + ! P=P', Lm=Lm' d = pm+u№) e = pm+u(2/3) {pmdapm\-^Lm {pmedpm\-^Lm {pmbepm}^Lm P = Lpx v{d,e}vLp2 Рис. 4.46 &Шаг1. Для унификации вычисления внутренних углов ^A-iAA+i> включая угол Zpnp\pi при вершинер\, добавляем в список Р вершину рг и вычисляем число п = size(P)- 1, при которомр„=р\ ирп+1 =рг.
482 Глава 4 Шаг 2. Вычисляем с помощью функции (1.31) внутренние углы полигона (fc = ang{p,.x -р„ рм -а) V/ = 2, и. Пропуская вогнутые вершины, знаки углов которых совпадают со знаком числа D, находим вершину р„, с минимальным выпуклым углом у = |ф,„| < 180°. При этом индекс т заключен в интервале [2, и]. Шаг 3. На сторонах угла \f разместим точки а и Ь, отстоящие от вершины р,„ не дальше, чем на величину h. Проще всего было бы отложить от точки рт отрезки длиной h, но при этом в конце отрезания некоторого ребра может получиться очень короткий остаток длиной, много меньшей h, что в свою очередь даст очень маленький треугольник. Процедура равномерного разбиения ребер полигона состоит из начальных установок некоторых величин и их циклических настроек. Установочная фаза включает: □ вычисление векторов сторон полигона при вершинер,„: V = pm-\ -р„„ W = pm+l -р,„; □ расчет целых кратностей длин сторон к числу h: К,= И h > *«' ~ щ h □ расчет целой кратности угла у к углу 60° = и / 3: "3V" к = □ формирование корректировочного индекса /, равного 1 при т = л и 0 в противном случае; □ сохранение копий полигона и списка треугольников: Р' = Р, Lm' = Lm. Циклическая фаза разбиения ребер, примыкающих к вершинер„„ включает: □ вычисление векторов сторон треугольников, длины которых не превышают значения Л: v = —, w = —; ftv л1(, □ вычисление по (4.18, а) вершин треугольников, лежащих на ребрах р„,.\Рт и a=p„l + v,b=p„l + w; О формирование двух списков вершин нового полигона, расположенных до и после точки р,„: LP\ ={p\+h-. Pm-i}Uc, Lp2 =bU{pm+i,...,p„+i}. (4.19, a)
Геометрические задачи визуализации 483 Вместо операций объединения формирование списков точек Lp\ и Lpi можно выполнить и другим способом — с помощью условной функции if, проверяющей совпадение точки a српг1 и точки bcpm+t: f Lp\ = if {pm-x = a: {pHl,..., pm_x}, {px+l, ..., pm_x, a}), 1 iP2 =if (Pm+l = b: {pm+i, - , p„+i}, {*, Pm+i, - , P„+i })• Шаг 4. В зависимости от длины отрезка ab и значения к, вычисленного на шаге 3, возможны три варианта отрезания треугольников и формирования списка вершин нового полигона Р (рис. 4.45, б, в, г): □ если \a - b\ < h или к = 1, т. е. у < 60°, то добавляем в массив Lm один треугольник {р,„Ьарп,}, а список Р формируем конкатенацией списков Lp\ и Lpi. полученных в (4.19). После добавления в Lm последнего отрезанного треугольника полигон вырождается в отрезок Р— {p\pip\). Поэтому при выполнении условия size(P) < 4 алгоритм заканчивает работу и возвращает список Lm со всеми содержащимися в нем треугольниками; □ при к = 2, т. е. при 60° < \\i < 120°, вычисляем по (4.18, б) точку с, добавляем в массив Lm два треугольника {р,„сарп1} и {р,„Ьсрп,}, а список Р формируем конкатенацией списка Lp\, точки с и списка Lpi; П при к - 3, т. е. при 120° < \\i < 180°, вычисляем по (4.18, в) точки (/ие,в массив Lm добавляем три треугольника {p,„dap„,}, {p,„edp,„} и {p,„bep„,}, а список Р формируем конкатенацией списков Lpi, {d, е} и Lpi. Шаг 5. Проверяем самопересечение нового полигона Р: s = self_test(P). При s = 0 и dir_test(P) = D переходим на шаг 1. В противном случае: □ инкрементируем коэффициенты разбиения ребер: кг = кг+ \,ки = к№+ 1; □ восстанавливаем копии полигона и списка треугольников: P = P\Lm = Lm'; П переходим на шаг 3. □ По окончании работы алгоритма contri_poly все возвращенные им в массиве Lm треугольники имеют такие же направления обхода, как и у исходного полигона Р. В заключение покажем результаты работы алгоритма контролируемой триангуляции полигона, взятого из примеров 4.15 и 4.16, с разными значениями h (рис. 4.47). Следует отметить, что при задании числа h большим максимальной длины ребра полигона размеры получаемых треугольников ограничиваются лишь расстояниями между соседними вершинами. Таким образом, функцию contri_poly можно использовать также и для разрезания полигона на максимально крупные треугольники, что проиллюстрировано на рис. 4.47, г решением при h = 6. Эта способность изложенного алгоритма решать обычные задачи триангуляции, несомненно, повышает его универсальность и полезность.
484 Глава 4 4.2.8. Дополнительные задачи отсечения в пространстве Представленные в предыдущем разделе алгоритмы имеют интуитивно понятные трехмерные обобщения. Рассмотрим некоторые из Зс1-алгоритмов отсечения, которые могут оказаться полезными при решении различных задач компьютерной графики. 4.2.8.1. Отсечение выпуклого полиэдра полупространством Аналогично определению полуплоскости, данному в разд. 4.2.7.1, назовем полупространством ту часть пространства, во всех точках которой неявная функция плоскости отрицательна, т. t.f(p) < 0. Эту сторону плоскости назовем внутренней. Рассмотрим задачу нахождения области пересечения полупространств. Если эта область не пуста, то она безусловно выпукла как пересечение выпуклых 3d- областей. Решение задачи заключается в поочередном отсечении текущей выпуклой области очередным полупространством (рис. 4.48). В итоге после каждого отсечения область либо не изменяется — когда она целиком лежит в полупространстве, либо сужается, либо становится пустой — если пересечение с полупространством пусто, после чего обработка оставшихся полупространств прекращается. Выберем метод задания границы полупространства. Сравнивая методы описания плоскости, рассмотренные в гл. 1, и варианты вычисления неявной функции f{p) в (1.119), заключаем, что наиболее практичны нормальная форма {ро, N} (шесть чисел) и функция nfN(po, N,p) (семь арифметических операций). Казалось бы, что неявная форма (1.119, а), в которой прямая описывается всего четырьмя элементами вектора F = [А В С D\, а функция nfF(F, р) вычисляется за шесть операций, более предпочтительна. Однако расчет F по (1.66) требует еще пяти операций, что в итоге делает неявную форму невыгодной. Еще большую Ш \
Геометрические задачи визуализации 485 ресурсоемкость имеют параметрическая (1.68) и трехточечная (1.72) формы плоскости и соответствующие им функции (1.119, в) и (1.119, г). Рис. 4.48 Когда отсекаемая область не является замкнутым полиэдром, возникает естественный вопрос о способе описания такой неограниченной области. Для преодоления неопределенности зададим начальный полиэдр BIG_BOX = {Ра ■ BIG, Ga} в виде выпуклой ограниченной области гексаэдра, изображенной на рис. 4.48 пунктиром, с интервалами изменения координат \x\<BIG, \y\<BIG, \z\<BIG, где BIG— достаточно большое конечное число, надежно обеспечивающее пересечение с ВЮ_ВОХ любой возможной плоскости. Матрица координат вершин гексаэдра Ра и массив списков его граней Ga следующие: />□ = 1 -1 1 1 1 1 Pi Pi 1 1 1 1 -1 1 1 Рг 1 -1 Р4 PS -1 -1 1 -1 -1 -1 Рь Рп 1 -1 -1 р% Ga~ {G\, Gi, d, <J4, Gs, G6}, Gi = {1,2,3,4,1}, Gi= {1,4,8,5,1}, (h= {1,5,6,2,1}, (4.20) G4={2,6,7,3,2}, G5={3,7,8,4,3}, G6={5,8,7,6,5}. Таким образом, задача пересечения неограниченных полупространств сводится к поочередному отсечению ими от ограниченного выпуклого полиэдра частей, лежащих с внешних сторон граничных плоскостей.
486 Глава 4 На рис. 4.49 приведен алгоритм clip_side(P, G, ро, N) отсечения полиэдра Н = {Р, G) полупространством с граничной плоскостью {ро, N}. Список Р = {р\, ...,р„} содержит координаты п вершин, а массив G = {G\,..., G„,} — списки т граней полиэдра Н. Работа алгоритма начинается с инициализации пустых списков U= 0 и F= 0, в которых будет накапливаться информация о вершинах и гранях отсекаемого полиэдра, и установки начального значения к = 0 индекса последнего записанного в Uэлемента. (cIip_side(P,G,pBM^) U=F=0, n=si:e(P), к=0 *ч м-л Р- + f,=nMpo,H,Pi) end ^f=\...si:e(G)y>— end М=*+1,я=С.,Г=0 U={uu...,uk} {U,F}=min_top(U,F) F = close _top(U, F) -\' =\..size(s> > ' v=g;- "^J^' '^ 1 >—1 1 <a^>-50-* '=/„./(/„■ -Л) pB.(i-/)+p„/-*t/ k = k + \, к->Г J, \ . <-J^ " P,,-* W=V i k ■>o ^^ U=P, F=G ^Возврат {U,F)J Рис. 4.49
Геометрические задачи визуализации 487 В связи с повышенной сложностью пространственных построений целесообразно как можно быстрее установить факт пересечения плоскости с полиэдром аналогично тому, как это делает тест cross3, определенный в (1.120). Для этого вычисляются значения неявной функции во всех вершинах полиэдра после чего элементы вектора/сортируются по возрастанию: s = sort(f). При 5i s„ > 0 полиэдр расположен относительно плоскости односторонне, возможно, касаясь ее вершиной, ребром или гранью. Если к тому же s\ < 0, то весь полиэдр Н находится внутри отсекающего полупространства и возвращается алгоритмом без изменения как {Р, G}. Иначе при s\ > 0 полиэдр целиком отсекается полупространством, а алгоритм возвращает {0, 0}. В случае s\ s„ < 0 существует хотя бы одна пара вершин {pt,Pj} по разные стороны от плоскости {ро, N}, пересекающей полиэдр минимум по трем граням. Не отсеченные полупространством грани должны входить в искомый полиэдр {£/, F]. Для его расчета организуем цикл i = 1, m обхода граней Gh в котором будем добавлять в список U координаты, а в массив F— списки вершин, оставшихся после отсечения. Перед началом обработки /-ой грани установим в переменной ц = к + 1 индекс начальной вершины этой грани и инициализируем список Г-0 индексов неотсеченных вершин. Центральная часть алгоритма, выполняющая отсечение грани полупространством, заключается в обходе вершин ее полигона согласно списку g = G, и формировании неотсеченного контура, лежащего с внутренней стороны секущей плоскости {ро, N}. В этот контур включаем вершины pg , j; е [1, size{g)], лежащие в полупространстве, а также точки пересечения ребер с плоскостью. Найденные точки добавляем в список U, а индекс к инкрементируем и добавляем в Г. По завершении обхода грани Gh убедившись в непустоте списка Г (при Г=0 вся грань отсечена плоскостью), проверяем замкнутость полученного контура. При щ Ф нц добавляем индекс ц в Г. Далее проверяем число неотсеченных вершин грани. Для того чтобы грань была как минимум треугольной, число элементов ее списка должно быть не менее четырех. В этом случае список Г добавляем в массив F. Число новых точек в списке U, меньшее четырех, бывает при отсечении грани, которая касается плоскости с внешней стороны одной вершиной или одним ребром. Для аннулирования этих вершин устанавливаем индекс к в исходное значение ц - 1, которое он имел перед началом отсечения грани. По окончании обхода всех граней исходного полиэдра из списка U берутся первые к элементов — вершины искомого полиэдра. Массив F содержит списки его граней, но не всех] На завершающем этапе алгоритма clip_side с массивами U и F выполняются две важные операции. 1. Минимизация топологического описания полиэдра. После отсечения граней полиэдра координатный список U всегда имеет кратные точки, т. к. каждая
488 Глава 4 вершина входит в состав не менее трех смежных граней, получаемых независимо друг от друга. Устранение кратности вершин выполняет приведенный на рис. 4.50 алгоритм min_top(P, G) минимизации топологии полиэдра, заданного списком вершин Р= {р\, ...,/>„} и массивом списков граней G = {G\,..., GJ. Г min_top(P,G) J " m=si:e(G), ut=pv k=l , ' end >C Возврат {U.G) ") end -< ^rm > «=cu —►ч y=\..Mze{g) ^,=0^. (СД-У Рис. 4.50 Работа алгоритма начинается с копирования первой точки списка Р в список U и установки к - 1 размера списка простых вершин U. Последующие вершины Pi V/ = 2, и поочередно проверяются на совпадение с простыми вершинами Uj Vy" = 1 ,к . Если совпадение найдено, то во всех списках g-G^ Vjj. = 1,т элементы gy,ye [\,size(g)], равные i, заменяются на/ В противном случае вершина pt является простой, что влечет за собой следующие действия: • инкрементирование индекса к- к + 1; • запоминание простой вершины щ = /?,; • поиск в списках граней <7Й элементов, равных i, и замену их на к.
Геометрические задачи визуализации 489 По окончании отбора простых вершин алгоритм возвращает список вершин U= {m,...,uk} и обновленный массив списков граней G минимизированного полиэдра. 2. Замыкание топологии полиэдра. Дело в том, что при отсечении полигонального объекта по алгоритму clipjside не может появиться новой грани — сечения полиэдра плоскостью. Вершины этой грани рассчитываются алгоритмом независимо друг от друга и в отдельный список не собираются. В результате искомый полиэдр оказывается незамкнутым, т. е. без одной грани в массиве G. Идея нахождения единственной отсутствующей грани основана на следующей закономерности. Если в замкнутом полиэдре некоторое ребро ркр,„ соединяет две грани с номерами i и j, то индексы его концов дважды входят в состав списков G, и Gj как {..., к, т,...} либо {...,т, к,...}. В незамкнутом полиэдре ребро сечения входит лишь в один список грани, что позволяет обнаружить все такие ребра и сформировать из них замкнутый контур. На рис. 4.51 приведен алгоритм close_top(P, G) топологического замыкания полиэдра с формальными параметрами— списком вершин Р = {р\,...,р„} и массивом списков граней G= {G\,..., G,„}. Работа алгоритма начинается с инициализации симметричной квадратной матрицы инцидентности вершин полиэдра I е R"*". Поочередно сканируя содержимое списков g= G, \li = \,m, инкрементируем {gj, g,+,)-bie элементы матрицы /, ведя таким образом подсчет кратностей ребер, соединяющих вершины полиэдра. По окончании сканирования сумма симметричных элементов матрицы инцидентности Ik, + 1,к равна кратности ребра ркр,. Для иллюстрации сказанного допустим, что при отсечении шестигранника, изображенного на рис. 4.52, получены следующие списки вершин и граней: Р = {p\,p2,pi,p*}, G = {G\, Gi, Gi}, Gi = {1,2,3,1},G2={1,2,4,1},Gj={1,3,4,1}. Тогда матрица инцидентности принимает следующий вид: 0 2 10 0 0 11 /= 1 0 0 1 <4-21> 2 0 0 0 Второй этап алгоритма closejiop — формирование двухстрочной матрицы R, столбцами которой являются индексы вершин ребер единичной кратности. Сканируя надциагональные элементы Ц V/ = l,и-1, j = i + \,n, добавляем в матрицу R столбец [/ jY при выполнении условия /„ + /,= 1.
490 Глава 4 С close_top(P,G) J n=sce(P), m=si:e(G) ■^ /=l...#n ^- end — I g-G, -4^7=1...51. > ^Г'/ ' / — I j.1 *y*/rt gjKj+l 4 <'=■-"-■ > end -<(у=,+1...и ^- ( Возврате J Рис. 4.51 Рис. 4.52
Геометрические задачи визуализации 491 Одновременно заполняем единицами вектор z, анализируемый на следующем этапе. Просматривая надциагональный треугольник матрицы (4.21), получим матрицу ребер "2 2 3" R = 3 4 4 и вектор z = [l I i]. Следовательно, грань сечения полиэдра составляют ребра единичной кратности ргръ,ргр* нрзр*. На третьем и последнем этапе неупорядоченные ребра сечения соединяются совпадающими вершинами в полигон (подобная задача на плоскости решается функцией coin, описанной в разд. 4.2.3). Сначала в список g заносятся индексы Rw и Ri\. Тот факт, что первый столбец матрицы R использован, фиксируется установкой значения z\ = 0. Далее и до тех пор, пока вектор z не станет нулевым, т. е. в матрице R не будут использованы все столбцы, выполняется поиск такогоу-го столбца R, для которого г^Ои один из двух элементов Ry или Ry равен последнему индексу в списке g. Оставшийся элемент добавляется к g, а устанавливаемое значение z/ = 0 блокирует использованиеу-го столбца в дальнейшем поиске. При блокировке в матрице R всех столбцов список g готов: он содержит индексы вершин недостающей грани полиэдра. Возвращаясь к задаче отсечения на рис. 4.52, получаем g - {2,3} и z = [0 1 l], затем g - {2,3,4} и z = [o I о], наконец, g={2,3,4,2} и z = [о 0 о]. Последний состав списка g описывает полигон {ргрърьрг} сечения полиэдра плоскостью. Сформированный список индексов вершин новой грани добавляется в массив G, и алгоритм close_top заканчивает свою работу, возвращая обновленный массив G. Завершая решение задачи на рис. 4.52, добавим к массиву граней полиэдра новую грань в виде списка G\ = {2, 3, 4, 2}. На основе метода отсечения полиэдра полупространствами разработан алгоритм convjiedr построения выпуклого полиэдра (рис. 4.53), полезный в различных задачах компьютерной графики, например, для отладки Зс1-тестов и алгоритмов на случайных выпуклых полиэдрах. Алгоритм заключается в поочередном отсечении от исходного выпуклого гексаэдра BIG_BOX= {РП ■ BIG, Gn} внешних частей относительно случайных плоскостей. Для получения всегда непустого решения выберем способ генерирования отсекающих плоскостей, у которых начало координат всегда находится в отрицательных полупространствах. Пусть в пространстве задана или случайно сгенерирована точка q, через которую должна проходить отсекающая плоскость {q, N). Выбрав вектор нормали N'= q, получим отрицательное значение неявной функции плоскости в начале координат: /(Оз) = -q о q < 0 Vq Ф Оз.
492 Глава - ( conv_ hedr J i' [P,G)=BIG_BOX v Выбор <?#03 {P,G}= clip_side(P,G,q,q) <— BIG BIG - —<Гт1п(яГ> Г Возврат {P,G} J Рис. 4.53 Поэтому отсечение полиэдра Н полупространством с граничной плоскостьк {q, q) сохраняет начало системы координат внутри Н. Процесс генерирование плоскостей и отсечения ими полиэдра продолжается до тех пор, пока координаты вершин получающегося полиэдра имеют числа BIG или -BIG. При полнок отсечении от объекта ВЮ_ВОХ его исходных границ функция conv_hedr возвращает искомый выпуклый полиэдр. На рис. 4.54 показано несколько случайны» полиэдров, сгенерированных описанным алгоритмом. Рис. 4.54 Область применения метода отсечения выпуклого полиэдра полупространством обширна: это задачи отсечения объектов границами ограниченных областей видимости (призмы или конуса на рис. 4.13), построения сечений выпуклых объектов плоскостями, расчета ядра полиэдра, пересечения выпуклых полиэдров и т. п.
Геометрические задачи визуализации 493 4.2.8.2. Сечение выпуклого полиэдра плоскостью Задача расчета сечения выпуклого полиэдра плоскостью фактически решается на последнем этапе алгоритма clip_side (см. рис. 4.49), где функция close_top(U, F) формирует полигон сечения, замыкающий топологию неотсеченного полиэдра. Возвращаемый алгоритмом clipjside результат в виде двух массивов {U, F} можно использовать для выделения из него полигона сечения С. Если плоскость и полиэдр пересекаются, то координаты вершин полигона С возвращаются в матрице 1]ф Р среди других вершин неотсеченного полиэдра, а список вершин сечения находится в конце массива списков F*G. Если сечение отсутствует, то алгоритм возвращает либо {0,0}, либо {Р, G}. Так или иначе, для получения полигона С нужна дополнительная обработка возвращаемых массивов Uv\F. На рис. 4.55 показано, как нужно модифицировать заключительную часть алгоритма clipjside (правую часть блок-схемы, приведенной на рис. 4.49) для того, чтобы он возвращал полигон сечения С. В отсутствие пересечения плоскости с полиэдром, т. е. при sis„>0, возвращается пустой полигон. В противном случае выполняется отсечение полиэдра полупространством плоскости {ро, N), после чего список g - Fsi.^Fh записанный в массив F последним, используется для формирования полигона С из точек ug. Vt = 1, size(g). — end С Возврат 0 j и = {щ,...,ик} {V,F}=min_top(V,F) F = close _top(U, F) 8 = Fsize{l) -*v =l...si:e(g) > f "ft "1 ( Возврат С J Рис. 4.55 Задача, казалось бы, решена. Однако то обстоятельство, что модифицированный алгоритм clipjside выполняет избыточные вычисления вершин и граней, не принадлежащих сечению, побуждает к разработке самостоятельного алгоритма, на-
494 Глава 4 ходящего только точки пересечения полиэдра с плоскостью, составляющие вершины полигона С. Такой алгоритм cut_hedr(P,G,po,N) построения сечения полиэдра H={P,G] плоскостью {ро, N] приведен на рис. 4.56. Его работа начинается с инициализации полигона С-0 и тестирования пересечения полиэдра с плоскостью. Отсортировав по возрастанию значения неявной функции во всех вершинах полиэдра f^nfN(p0,N,p^Vi=ln, принимаем решение о необходимости расчета сечения. При si sn > 0 сечение отсутствует, а алгоритм возвращает С-0. Если числа si и s„ имеют разные знаки, то вершины полиэдра находятся по разные стороны секущей его плоскости. С cut_hedr(P.G,pa,ff) J n=size(P), C=R=0, k=0 1—^ 1=1...« ^>- V fi=nfN(pu,N,Pi) end >0 —>Г Возврат С J ]'—>Si=\...si:e(G)\— end fTG, U=0 z,=0, n=2 ■0—' end -^j=2..M:e(g) ^X— 1^=^-,, v=gy r-0 >0> t=fw/ifw-fv) pw{\-t)+Pvt^>U L-<Hd> rK *i? У ■о ► end Рис. 4.56
Геометрические задачи визуализации 495 Полигон сечения С формируется из отрезков я,6;, по которым плоскость пересекает полигональные грани выпуклого полиэдра. По мере нахождения этих отрезков будем записывать их концевые точки в столбцы матрицы R следующего формата: RJcii a2 ... ak lb b2 ... bk " Перед началом цикла расчета отрезков пересечения плоскости с гранями инициализируем пустую матрицу R — 0, а перед началом обработки грани G, — пустой список точек U = 0. В процессе обхода ребер грани добавляем в U вершины, лежащие в плоскости сечения, и точки пересечения ребер с этой плоскостью. После обхода грани при условиях, что в списке U ровно две точки и они в любом сочетании [щ u2 Y или [и2 щ Y не встречаются ни в одном из столбцов R<J> , формируем из точек U новый столбец матрицы R. Кратный отрезок в сечении полиэдра появляется при касании двух смежных граней с плоскостью по их общему ребру. А если какая-нибудь грань касается плоскости единственной вершиной, то ее список U будет иметь всего одну точку. Для исключения ошибок обработка данной грани завершается без изменения матрицы R. На завершающем этапе из отрезков-столбцов непустой матрицы R (их в ней не менее трех) формируется полигон сечения С. Метод соединения отрезков совпадающими концами до получения замкнутого контура использован нами в функции closejtop. Теперь отличие в том, что матрица R состоит не из индексов, а из векторов. Для иллюстрации работы алгоритма на рис. 4.54 построены сечения случайных полиэдров случайными плоскостями. 4.2.8.3. Расчет ядра полиэдра Ядро полиэдра Н— это множество точек К, из которых видны все вершины полиэдра (рис. 4.57, а). Любой выпуклый полиэдр совпадает со своим ядром (рис. 4.57, б), но не каждый невыпуклый полиэдр имеет ядро (рис. 4.57, в). В обиходном смысле ядро— это то, что остается от неограниченного пространства после отсечения его полупространствами плоскостей граней полиэдра. По этому способу на рис. 4.57, г построен алгоритм kern_hedr(P, G) расчета ядра полиэдра Н - {Р, G} с матрицей вершин Р и массивом списков граней G. Вначале устанавливаются исходные параметры отсекаемого полиэдра К= ВЮ_ВОХ. Затем в цикле i = 1, sizeyfj) выполняется внешнее отсечение К плоскостями всех граней полиэдра Н\ П формируется полигон /-ой грани полиэдра П = side(P, G, i) и вычисляется вектор ее нормали N = погт(П); П выполняется отсечение полиэдра К = {£/, G) полупространством этой грани с помощью функции clipjside{U, F, П\, N);
496 Глава 4 П проверяется размер матрицы U. Если на каком-то шаге результат отсечения окажется пустым, то ядро полиэдра отсутствует, а алгоритм возвращает пустой массив U = 0. -> и Q kern hedr(P,G) О {U,F)=B1G_B0X X^*=l..jte(G) ^>— end n = side{P,G,i) N-norm(n) fJ.F}=clip_side(fJ,F,n„N) 0r«- C Возврат {U,F} J Рис. 4.57 Для того чтобы отсечение плоскостью грани выполнялось с внешней стороны. нормаль к грани всегда должна быть внешней. Это достигается выбором положительного направления нумерации вершин грани, если смотреть на нее снар\- жи полиэдра. Дополнительное условие предъявляется к описанию грани, имеющей форму невыпуклого полигона (например, задней шестиугольной грани полиэдра Н на рис. 4.57, а). В ее списке G, первые три вершины должны составлять выпуклый угол. Только тогда определенная по трем точкам нормаль (1.118) будет внешней. 4.2.8.4. Пересечение выпуклых полиэдров Аналогично плоской задаче пересечения полигонов реализация булевой функции А & В пересечения выпуклых полиэдров А и В основана на отсечении объек-
Геометрические задачи визуализации 497 та В полупространствами граней объекта А. В результате получим объект А &В, принадлежащий как А, так и В, т. е. являющийся пересечением этих объектов. Из этих соображений на рис. 4.58, а построена блок-схема алгоритма kern_hedr(A, GA, В, GB) расчета пересечения выпуклых полиэдров {A, GA) и {В, GB). Алгоритм возвращает пересечение объектов А &В, если оно существует (рис. 4.58, б), либо пустой массив координат, если А и В лишь касаются друг друга или вообще не пересекаются. Принципиальное требование к объекту А, плоскостями граней которого выполняется отсечение объекта В, является внешняя ориентация нормалей ко всем граням GAi. Внешняя ориентация нормалей к граням объекта В не обязательна. Г cross_hedi\A,G„,fi,Gt) J 1 " n = size(A), c= — Vo, X^i=\...size(Glt)J>— end n=side(A.Ga,i) N = погт{П) s = sgp(nfN(nl,N,c)) {B,Gh}=clip_side(B,Gb,n,, -s-N) 0*1<- Гвозврат {B.Gb)J Рис. 4.58 Идентификация направления нормалей выполняется методом внутренней точки, описанным в разд. 3.2.2. У выпуклого полиэдра со списком вершин А = {а\, ...,«„} легко вычислимой внутренней точкой является геометрический центр 1 " ",-=! Сформировав по (1.116) полигон /-ой грани П' = side(A,GA,i) и вычислив по (1.117) нормаль N - погт{П), определим знак .у числа nfN(IJ\,N,c), где П\ — первая вершина полигона П. При s = -1 точка с находится в отрицательном по-
498 Глава 4 лупространстве грани, ее нормаль — внешняя, а отсечение объекта В плоскостью {П\, N} будет выполняться с внешней стороны. В противном случае s= I, г. для отсечения должна быть использована антинормаль, равная -N. Если окажется, что после очередного отсечения матрица вершин полиэдра В стала пустой, то дальнейший перебор граней объекта А теряет смысл, и алгоритм заканчивает работу, возвращая пустой результат. Для иллюстрации работоспособности алгоритма на рис. 4.58, в построен каркасный полиэдр А &В— пересечение двух случайных выпуклых полиэдров А и В. сгенерированных алгоритмом conv_hedr. 4.2.8.5. Выпуклая полиэдральная оболочка массива точек Допустим, в пространстве задано произвольное число п точек /?, V/ = 1, и. Выпуклая полиэдральная оболочка массива точек Р = {р\, ...,р„} представляет собой выпуклый полиэдр минимального объема, охватывающий все точки массива наподобие покрова из эластичной ткани. По отношению к оболочке точки массива делятся на внутренние и граничные, принадлежащие вершинам, ребрам или граням оболочки. Граничные точки, образующие вершины, назовем выступающими. Задача построения полиэдральной оболочки заключается в отборе из всех точек/?, некоторых выступающих точек и построении на них полигонов граней с одновременным формированием матрицы вершин оболочки U и массива списков граней G. Алгоритм cover3(P), решающий задачу построения выпуклой 3(1-оболочки, представлен на рис. 4.59. Прежде всего он проверяет возможность существования оболочки с помощью теста (1.81). Если размерность пространства, натянутого на точки массива Р, меньше трех, то расширенная п х 4-матрица вершин Р = Pi Pi Рп имеет неполный ранг, меньший четырех. При этом оболочка, обтягивающая точки, не имеет объема, поэтому алгоритм возвращает пустой результат {0, 0}. При наличии принципиальной возможности построения оболочки ее формирование выполняется в три этапа. 1. На первом этапе ищутся три неколлинеарные точки {pt,Pj,Pki, плоскость которых не пересекает оболочку и потому способна быть плоскостью ее первой грани. Условие неколлинеарности точек по тесту (1.79, а)— существование вектора нормали N=(Pj-pu*(pk-pj)*03.
Геометрические задачи визуализации 499 С со\егЦР) J (возврат {0,0) J rang(P)I>—<4- n=si:e(P), /я=0 < '=' -2 У end - end —^ /=(+1. ..и-1 \* Х^ А=у+1...и \- end - C = MAP2{phN,03,z°) Q = PC W(T I—1 и \ Г *\ ' ' •" ? c *°^cc> l7!-|7!+l,Om-?,JW32 H =cover(p)M2i, V = HC~l m=size(U \ (C0 )(. = i Vi = 1, #n {{/, C}=gran{P,U,G,u0u,) ( Возврат min_top(U,G) J Рис. 4.59 Для исключения повторных сочетаний индексы точек перебираются в интервалах i = 1, и - 2, у = / +1, и -1 и A = j +1, и. Искомая плоскость будет найдена тогда, когда из всех точек массива не будет найдено ни одной пары точек, лежащих от плоскости по разные стороны. Это легко проверяется тестом cross!, определенным в (1.120). В качестве параметра/— имени функции расчета ориентации точки относительно плоскости — наиболее экономично использовать функцию/(р) = nfN{ph N,p), определенную в (1.119, б). На втором этапе формируется полигон первой грани полиэдральной оболочки как выпуклой полигональной оболочки точек, лежащих в плоскости {ph N}. Вычислив матрицу преобразования С = MAP2(phN,03, z°), рассчитаем координаты Q = PC всех точек массива Р в новой системе координат, в которой плоскость [ph N} является фронтальной. Затем отберем в массив О точки qt = [х, yt zj, имеющие координаты z, = 0. Из этих точек с помощью алгоритма cover (см. рис. 4.31) сформируем выпуклую оболочку Н. Обратным преобразованием
500 Глава 4 получим полигон U= {и\,..., и„,\ вершин первой грани оболочки в исходной системе координат. Список вершин первой грани устанавливаем в первом элементе списка G, равном Gi = {1,..., т). Для корректного обращения с функцией cover, работающей с точками на плоскости ху, в алгоритме сохегЪ используются матрицы 1 0 Ol М2з = „ . „ . М32= 0 1 =МЪ, 1 0 0 0 1 0 , Л/32 = [1 0] 0 1 [о oj 23 0 1 0 ' 32 = /и23- L0 °. преобразующие точки из R2b R3 и обратно с сохранением координат хну: [х у]М23=[х у 0], [х у z]m32=[x у]. 3. На третьем этапе запускается поиск второй грани оболочки, примыкающей к первому ребру первой грани шт. Затем к ней нужно будет присоединить новые примыкающие грани, и так до тех пор, пока оболочка не станет замкнутой. По окончании формирования полиэдра оболочки алгоритм минимизирует ее топологию функцией min_top (см. рис. 4.50) и возвращает параметры полиэдральной оболочки {U, G). Процесс присоединения новых граней оболочки к уже существующим имеет рекурсивный характер и реализует простой способ включения света во всех комнатах здания, соединенных друг с другом коридорами. По этому способу при входе в темную комнату нужно включить в ней свет и начать обход по периметру, отмечая двери, открываемые для входа в комнаты следующего уровня. Войдя в освещенную комнату, следует вернуться назад и перейти к следующей неотмеченной двери. В конце обхода всех дверей текущей комнаты нужно вернуться через ее первую дверь в комнату предыдущего уровня и продолжить обход ее неотмеченных дверей. Процесс автоматически завершится, когда будут отмечены все двери первой комнаты. На рис. 4.60 представлен рекурсивный алгоритм gran(P, U, G. ab) формирования из точек списка Р грани, примыкающей к отрезку ab. Алгоритм получает на входе список Р, отрезок ab, массивы вершин U— {tvi,..., и,,,} и списков граней G= {G\,..., Gy} текущей оболочки, а возвращает ее обновленную модель {U, G}. Методика нахождения примыкающей грани следующая. 4. На первом этапе в списке Р ищется такая точка ph что плоскость {a, N} с нормалью N=(b-a)x(Pi-a)*03 удовлетворяет двум условиям: • во-первых, она не совпадает ни с одной из уже имеющихся граней G У/' = 1,у. Проверка совпадения плоскости {a, N} с плоскостью у'-ой грани 17 = side{U,G,j), имеющей нормаль В' = попп(П), выполняется с помощью теста (1.105, а). При \N х Н\ = 0 и N о (П\ - а) = 0 плоскость {a, N), совпадающая с плоскостью П, не может нести новую грань;
Геометрические задачи визуализации 501 ^ gran(P,U,G,ab) ) n = size(P\ m = size(U\ y=size(G) O^ry- end C=MAP2(a,h/,03,z°) Q = PC, k = 0 ►^Возврат {(J,G)У+- <— * *4 ' x~" У ' — £=^+1,0,=(7, Л/ц end —i H =cover(0)M2, n = HC'l,k=size(n) S /=!...* у— end — — Л,-»{/, m=m+\. (py+iy=m *< i=l.../t-l >— end {(J,G}=grcm(P,U,G,n,nM) Рис. 4.60 • во-вторых, она не пересекается с оболочкой, т. е. среди элементов списка Р нет ни одной пары разносторонних точек. Это легко проверяется тестом cross! с аргументом/(р) = nfN(a, N,p). При cross! =■ 1 плоскость {a, N} пересекает оболочку и не может быть плоскостью грани выпуклого полиэдра. Если после перебора всех значений i = 1, и не будет найдено ни одной плоскости {a, b,pj), удовлетворяющей перечисленным условиям, то функция gran возвращает параметры полиэдра без изменения. Это первое условие выхода из рекурсии по отсутствию новой грани, примыкающей к отрезку аЬ. 2. На втором этапе формируем полигон (у+ 1)-ой грани полиэдральной оболочки как выпуклую полигональную оболочку точек, лежащих в плоскости {a, N]. Вычислив матрицу преобразования C = MAP2[a,~N,03,z°), найдем координаты Q = PC
502 Глава 4 всех точек массива Р в новой системе координат, в которой плоскость {a, N} является фронтальной. Затем отберем в массив О точки qt =[х, yt г,] с координатами г, = 0. Из этих точек с помощью алгоритма cover сформируем выпуклую оболочку Н. Обратным преобразованием Я = НС~Х получим полигон 17= {IJi,..., Пк) вершин новой грани в исходной системе координат. Точки Д добавляем в массив U, а индексы их расположения в этом массиве устанавливаем в элементе Gy+I = {т + 1,..., т + к}. 3. На третьем этапе организуем циклическое обращение функции gran самой к себе в форме {U, G) = gran{P, U, G, Д, Д+|) V/ = 1, А — 1. Это означает разветвление дерева рекурсии на А:- 1 направление по числу сторон полигона Л. Некоторые из этих ветвей окажутся тупиковыми по первому условию выхода из рекурсии. Другие ветви, возможно, сами будут ветвиться. Для исключения захода в грань предыдущего уровня рекурсии выполняем проверку на несовпадение отрезка Д Д+i с входным отрезком либо в прямом аЪ, либо в обратном Ъа порядке следования концевых точек. По второму условию выхода из рекурсии — завершению цикла перебора ребер грани — функция gran возвращает обновленную модель оболочки {U, G). & Пример 4.17. Проследим работу алгоритма coverZ на примере построения полиэдральной оболочки массива семи точек р\ +рт, из которых рг \\pt+pi являются выступающими, точка ръ— внутренней, точки pi и pn+pi— компланарными, а р\ + рз — коллинеарными (рис. 4.61, я). Рис. 4.61
Геометрические задачи визуализации 503 Перебирая индексы / = 1,5, j = / + 1,6 и k = j +1,7, тестируем тройки {phPj,pk) на способность нести плоскость грани выпуклого полиэдра: □ тройка точек {р\,рг,ръ} коллинеарна; О плоскости всех троек {р\,р2,ри} -г {p\,pi,pi} и {р\,ръ,рь} -s- {р\,ръ,рп} пересекают множество Р; П наконец, находим подходящую тройку точек {p\,pt,ps}. В ее плоскости лежат еще две точки рь и рт, так что полигональная оболочка пяти точек, формируемая алгоритмом cover во вспомогательной системе координат, имеет вид U- {piptpipspi} = {u\mmmm), а список первой четырехугольной грани равен Gi = {1, 2, 3, 4, 5}. Начиная поиск грани, примыкающей к первому ребру pipe, функция gran находит точку рг, а алгоритм cover формирует полигон {рьргртрь} = {шит mm) второй треугольной грани Gi= {6,7,8,9}. На втором переходе ищется третья грань, примыкающая к первому ребру второй грани рьрг. Результат поиска — точка /м и плоская оболочка трех точек {рьрьргри} = {шоиишит} треугольной грани Gi - {10, 11, 12, 13}. Третий переход на уже существующую грань G\, примыкающую к первому ребру третьей грани р4рб, является тупиковым, а следующий переход дает примыкающую к ребру ргр* четвертую грань {р^ръргр*} = {wi4Wiswi6Wi7} со списком вершин См = {14, 15, 16, 17}. Аналогично, пятый переход через ребро Р4р5 на грань G\ является тупиковым, а шестой переход через ребро psp2 открывает пятую треугольную грань {pspipipb} = {u\SimU20U2\} со списком вершин Gs - {18, 19, 20, 21}. Оба перехода с этой треугольной грани на G2 и Gi являются тупиковыми. Они завершают обход Gs и возвращают алгоритм через четвертую и третью грани (их обход также оказался завершенным) на грань G2. Оставшийся тупиковый переход через ребро pipi на грань Gs возвращает поиск на первую грань G\, а алгоритм — в функцию covert со списком вершин U= {pipepupspi \рьр2ртрь \р4рьргрь\р4рьр2р\\рьр2р1рь} = {и\ ... ш\} и списками граней G\ ■*■ Gs. После минимизации топологии этого полиэдра получим следующую модель выпуклой полиэдральной оболочки (рис. 4.61, б): U- {ртрърьрьрг} = {ш игюшиь), G - {Gi, Gi, G3, G4, Gs}, Gi = {1,4, 3, 2, 1}, G2 = {2, 5, 1, 2}, G3 = {3, 5, 2, 3}, G4={3,4,5,3},Gs={4,l,5,4}. Q
504 Глава 4 4.3. Методы удаления Удаление невидимых линий и поверхностей является, пожалуй, наиболее сложной задачей визуализации. Она заключается в построении на экране дисплея проекций лишь тех графических объектов— линий, поверхностей, тел,— которые видны наблюдателю с его точки зрения (см. рис. 2.56, 2.67). Невидимость объектов обусловлена двумя причинами. Во-первых, некоторые из них находятся вне поля зрения наблюдателя — сбоку или сзади от него. Исключением этих объектов из списка визуализации занимается задача отсечения. Объекты второй группы могут быть полностью или частично заслонены (экранированы) другими непрозрачными объектами, расположенными ближе к наблюдателю. Идентификация таких объектов и реалистичное изображение их на экране дисплея составляют задачу удаления невидимых элементов. Необходимость решения этой задачи неизбежно возникает при переходе от каркасной модели объекта с прозрачными ячейками к модели с непрозрачными гранями. Это существенно повышает реалистичность и информативность восприятия объекта. Например, типичное изображение куба каркасом из двенадцати ребер со всеми прозрачными гранями (рис. 4.62, а) не позволяет однозначно судить о его действительной ориентации относительно наблюдателя. Удаление невидимых ребер помогает избавиться от неоднозначности восприятия объекта (рис. 4.62, б, в), даже если ячейки каркаса не закрашены, т. е. бесцветны или монохромны. Рис. 4.62 Эффект экранирования дальних объектов ближними легко объясним с позиций обоих методов трассировки лучей, рассмотренных в разд. 1.3.4. Пусть вдоль некоторой определенной прямой в глаз наблюдателя направлены прямые лучи, излученные источниками или отраженные поверхностями, которые можно рассматривать как источники вторичных прямых лучей. Лишь луч от самого ближнего к наблюдателю источника не встретит на своем пути преград и благополучно достигнет своей цели, а глаз увидит в данном направлении точку имеющую цвет источника луча. Остальные прямые лучи того же направления поглотятся или рассеются на встреченных объектах (рис. 4.63). Полагая, что из глаза наблюдателя вдоль той же прямой испущен обратный луч. проследим его путь до первого пересечения с ближайшей непрозрачной поверхностью. Точки пересечения с остальными объектами, "нанизанные" на продол-
Геометрические задачи визуализации 505 жение обратного луча, оказываются экранированными, поэтому глаз их не видит (рис. 4.64). 4г^ <^Щ\ Рис. 4.63 ~г О Рис. 4.64 Несмотря на кажущуюся очевидность и простоту, удаление невидимых линий и поверхностей является достаточно сложной задачей визуализации, требующей расчета пересечений множества графических объектов друг с другом с привлечением больших машинных ресурсов. Поэтому существует целый ряд разнообразных алгоритмов ее решения, включая и методы, опирающиеся на аппаратные средства. Алгоритмы удаления классифицируются по следующим признакам (рис. 4.65). П Во-первых, по типу объектов. Здесь водораздел проходит между объектами с разным числом степеней свободы, т. е. между линиями и поверхностями. Необходимость в удалении невидимых линий возникает при работе как с сугубо двухмерными Зс1-объектами, например, тонкими нитями или осями координат— равноправными элементами сцены,— так и каркасными поверхностями с непрозрачными ячейками, пересекающимися по ребрам-отрезкам, некоторые из которых могут быть невидимы (см. рис. 4.47). Конечно, подавляющее число объектов машинной графики обладает некоторой поверхностью, отчего и методы, ориентированные только на удаления линий, представляют меньшинство в общей массе алгоритмов данного назначения.
506 Глава 4 Рис. 4.65 О Второе, чем различаются алгоритмы удаления — это используемые модели объектов, из которых основными являются аналитические (явные и неявные). параметрические и полигональные. Применение аналитического описания поверхностей f(p) = О иногда бывает предпочтительнее для быстрого решения задач ориентации и пересечения как этапов общей задачи удаления. Большинство алгоритмов удаления работает с поверхностями, представленными системой полигональных плоских граней, в основном, треугольников. Параметрическую поверхность, описываемую векторной функцией p(th т^), можно рассматривать как частный случай полигональной сети, состоящей из четырехугольных ячеек — полигонов {р^pi+hjpM.j+\ phj+\ Py}. □ Третий признак классификации — по способу выбора рабочего пространства: • объектные алгоритмы работают в физической системе координат сцены. Элементы объектов — вершины, ребра, грани, объемы — расчленяются на фрагменты, позволяющие упорядочить их по удалению от наблюдателя. Результат представляет собой список видимых элементов, вычисленных с машинной точностью, никак не связанной с растровыми свойствами картинной плоскости. В связи с этим объектные алгоритмы иногда называют непрерывными. Изображение видимых объектов, полученное в объектном окне, переносится на экран дисплея (см. рис. 2.56) простым пересчетом по (2.28) объектных координат в экранные пикселы. Трудоемкость простейших объектных алгоритмов, сравнивающих положение каждого из No объектов с оставшимися объектами, оценивается квадратичной зависимостью N0 . Недостаток непрерывных методов — и\ достаточно высокая сложность; • экранные алгоритмы выполняют удаление проекций невидимых элементов объектов в системе координат экрана. Путем перебора по строкам, столбцам или в ином порядке конечного числа пикселов экрана находят точки
Геометрические задачи визуализации 507 пересечения сканирующего луча со всеми объектами сцены. В результате на луче, соединяющем наблюдателя с (/,/)-ым пикселом (ге[0, и-1], j е [0, m - 1]), формируется набор конкурирующих точек. Пиксел закрашивается цветом точки, ближайшей к наблюдателю (см. рис. 4.64). Степень детализации генерируемого изображения ограничена разрешающей способностью экрана (п пикселов по горизонтали и m по вертикали), из-за чего экранные алгоритмы называют дискретными. Всем им свойственны ошибки дискретизации, особенно явно проявляющиеся при масштабном увеличении изображения. Ресурсоемкость простейшего дискретного алгоритма, сравнивающего проекцию каждой из No граней с каждым из пт пикселов, пропорциональна произведению Notun и, например, при п = /и«512 намного превышает трудоемкость объектного алгоритма с числом объектов No ~ 1000. В связи с бурным развитием технологии СБИС и резким удешевлением электронной памяти вопрос ресурсов практически снят с повестки дня. Это позволило относительно простым дискретным алгоритмам визуализации (не только удаления, но также закрашивания пикселов, геометрического и цветового сглаживания) внедриться в программное обеспечение видеоадаптера каждого современного персонального компьютера (об этом подробнее чуть ниже); • гибридные алгоритмы работают как с самими объектами в пространстве, так и с их экранными проекциями, объединяя преимущества и отстраняясь от недостатков простейших алгоритмов, неся в себе целый ряд разного рода оптимизаций. Большинство алгоритмов удаления включает в себя сортировку. Главная сортировка ведется по геометрическому расстоянию от поверхности, ребра или точки объекта до точки наблюдения. Смысл сортировки по глубине в том, что чем дальше расположен объект от наблюдателя, тем больше вероятность, что он будет полностью или частично заслонен другим объектом, более близким к наблюдателю. Дополнительная сортировка объектов по горизонтали и/или вертикали позволяет оценить действительную возможность перекрытия проекций объектов на экране дисплея. Весьма эффективно в этом смысле применение габаритных тестов и охватывающих оболочек различной степени иерархии: от оболочек отдельных объектов до оболочек кластеров — групп пространственно связанных объектов. Для повышения эффективности визуализации путем учета предыстории состояния сцены часто используется свойство ее когерентности, т. е. тенденции неизменяемости параметров в малой области. Выделяют несколько видов когерентности: □ когерентность в картинной плоскости: если данный пиксел соответствует проекции некоторой грани, то, скорее всего, соседние пикселы также соответствуют точкам этой же грани; П когерентность в объектном пространстве: если данная грань видима, то соседняя грань также видима; □ временная когерентность при создании анимации: свойства видимости объектов в соседних кадрах, вероятнее всего, сохраняются.
508 Глава 4 Громадный объем вычислений предъявляет жесткие требования к аппаратному обеспечению компьютера — процессору, оперативной памяти и системной шине, по которой данные передаются в видеоадаптер, а также к самому видеоадаптеру. В последнее время появились специализированные устройства обработки изображений — графические ускорители, решающие задачи визуализации на аппаратном уровне и делающие экранные алгоритмы предпочтительнее объектных. Поскольку центральный процессор не всегда способен достаточно быстро обработать громадный поток данных, эта задача перекладывается непосредственно на специализированную плату-акселератор, имеющую "на борту" собственный графический процессор и дополнительную память для буферизации данных. Применение графических ускорителей позволяет распараллелить и тем самым ускорить процесс обработки информации. Взаимодействие "ускоряемой" программы с тем или иным набором микросхем осуществляется с помощью драйверов, а на программном уровне — графических библиотек. Из наиболее популярных библиотек можно назвать Direct3D в составе пакета DirectX, OpenGL и QuickTime3D. Графические Зс1-библиотеки, или так называемые интерфейсы программных приложений (API — Application Programming Interface), предназначены для того, чтобы с помощью некоторых общих методов обработки графических данных облегчить и ускорить процесс создания приложений, использующих трехмерную графику— объемные объекты, свет, оптические эффекты, перспективу, деформации и т. д. При работе над тем или иным графическим эффектом программисту необходимо обратиться к библиотечной функции, передать ей требуемые параметры и получить готовый результат. Многие графические библиотеки, например, Direct3D, рассчитаны на комбинированную работу как с акселераторами, так и с центральным процессором. Если акселератор в системе не найден или не поддерживает данную функцию, то библиотека "переложит" всю работу на центральный процессор и эффект все равно будет достигнут, правда, за счет несколько большего времени. В зависимости от сложности сцены (числа ее элементов), типа объектов (выпуклые или невыпуклые), наличия пересечения объектов друг с другом, степени компромисса между желаемой скоростью и реалистичностью визуализации существующие алгоритмы удаления более или менее учитывают эти и другие особенности. Следует ясно понимать, что не придумано еще универсального метода решения задачи удаления. Разработка нового алгоритма, аккумулирующего достижения отдельных методов, нередко выливается в чрезвычайно громоздкую процедуру, медленно работающую даже с простыми сценами. Понятно, что для обработки информации в реальном времени с частотой более 30 кадров в секунду, например, в программах авиатренажеров или "крутых" компьютерных игр (между прочим, двигателей компьютерного прогресса), такие алгоритмы не годятся. С другой стороны, в компьютерном кинематографе временной фактор отходит на второй план: здесь более важна глубокая проработка оптических эффектов, позволяющая достичь небывалой реалистичности или, наоборот, фантастичности изображения. По мере создания более быстрых алгоритмов и способных их реализовать видеокарт всегда будут возникать новые потребности в скорости, детальности и минимальной стоимости обработки данных.
Геометрические задачи визуализации 509 4.3.1. Предварительная обработка моделей объектов Есть два принципиальных подхода к уменьшению времени, затрачиваемого на визуализацию сцены в целом и решение задачи удаления в частности как наиболее сложной задачи визуализации. Во-первых, это максимально возможное сокращение вычислений; во-вторых, распараллеливание вычислительного процесса. Не вдаваясь в детали реализации второго метода с помощью многопроцессорных и транспьютерных систем [11], а также конвейерной организации вычислений [36], рассмотрим некоторые тактические приемы, позволяющие ускорить процесс вывода изображений за счет сокращения вычислений. 4.3.1.1. Выбор мировой системы координат Весьма эффективным средством упрощения векторных и матричных вычислений является удачный выбор МСК xyz, с которой связываются положения наблюдателя и проективной плоскости. Как показано в разд. 2.2.5.3, пюкой системой является СК наблюдателя xKyHzH. В СКН, играющей роль МСК, основные геометрические элементы и соотношения приобретают следующие наиболее простые формы. П Плоскость проецирования совпадает с фронтальной плоскостью ху. На ней организуется регулярное симметричное окно-отсекатель с координатами центра и габаритными размерами Хи = уи - 0, -g <х <g, -v <у < V. Через это окно наблюдатель как бы смотрит на окружающий его мир (см. рис. 2.67). Габариты окна g и v либо задаются априорно, либо определяются габаритами left < Хъ < right, up <уъ< down экранного окна вывода (см. рис. 2.10) и масштабным множителем цэ: right-left down-up *=—^T~'v=-^— (422) Соотношения (2.28) между проекцией p' = [x' у о] некоторой точки на картинную плоскость и ее экранной проекцией рэ = [хэ уэ о] принимают следующий вид: left + right , up + down , *э= J + Иэ*' Уз= 2 ^'' <423) , _ хэ - 0.5(left + right) , _ 0.5(ир + down)-уэ х — , у — . (4.24)
510 Глава 4 П В случае дальнего наблюдателя вектор его направления & = [о 0 l] ориентирован вдоль оси z, матрица проецирования равна матрице Of из (2.60), орто- графическая проекция точки р = [х у z] есть р' = [х у z']=[x у О], а экранные координаты проекции рассчитываются по (4.23) при х' = х и У=у. Во многих алгоритмах удаления требуется восстановить положение точки р по ее экранной проекции/>э (рис. 4.66). Благодаря простоте ортографического проецирования координаты точки равны координатам проекции (4.24): х = х\у=у'. (4.25) Ж^ Рис. 4.66 Для восстановления z-координаты нужна некоторая дополнительная информация о поверхности, которой принадлежит точка р. В случае неявного описания поверхности неявным уравнением f(x, у, z) — 0 находится его аналитическое или численное решение г = ц>(х,у). При параметрическом описании поверхности векторной функцией р(1,т)=[х((,т) y{t,x) z{t,z)} составляется система двух нелинейных уравнений х(/,т)=х', (4.26) аналитическое или численное решение которой относительно параметров г и т определяет недостающую координату z(t, т).
Геометрические задачи визуализации 511 В частном случае плоскости, не параллельной оси z, получим несколько вариантов расчета z-координаты в зависимости от способа описания плоскости в разд. 1.2.1: • при неявном описании матрицей [А ВС £>] с коэффициентом С ф О (плоскость не параллельна оси z) из уравнения Ах + By + Cz + D = О получим Ax + By + D z~ с ; (4.27, а) • при нормальном описании плоскости точкой Ро=1*о Уо 2q J и вектором нормали N = [NX Ny NzJ, не ортогональным оси z, из (4.27,а) и соотношений А = Nx, B = Ny,C=N:*0,D = -Nxxo - Nyyo - N._ zo получим :z0' {x-x0)Nx+(y-y0)N У . N^ (4.27, 6) при параметрическом описании плоскости точкой po=l*o Уо Z0J и не~ параллельными векторами F = [FX Vy Vz\ и W = [Wx Wy Wz\, плоскость которых не параллельна оси z, путем подстановки координат вектора нормали /V, = Vy wy vz wz , Ny = vz wz v* wx , N,= yx wx Vy Wy *0 в (4.27, 6) получим \ O+Lx-Xq y-y0 -yo\ -1 Wx Wy vz w, (4.27, e) В CKH с вектором S = z° сортировка глубины точек p, по убыванию скалярных произведений dt = -pf ° S превращается в сортировку аппликат z, (см. рис. 3.4). Аналогичное упрощение происходит при нахождении лицевых граней полиэдра с помощью теста Nj° S> 0, который в СКБ становится простым анализом знаков аппликат внешних нормалей Nzi. Грань является лицевой при выполнении условия Nzi > 0. □ Ближний наблюдатель находится в точке S = [о 0 F] оси z на фокусном расстоянии 0 < F< оо от картинной плоскости (рис. 4.67).
512 Глава 4 Рис. 4.67 Центральное проецирование выполняется по (2.88) с помощью матрицы Ц{ 10 0 о 0 10 о 0 0 0 -1/F 0 0 0 I либо по аналогичным (2.107) координатным формулам Fx , Fy х =- У =- (4.28) F-z F-z Экранные координаты проекции точки находятся по (4.25). Восстановление координат {х, у, z) точки р по ее экранным координатам {Хэ, уэ} начинается с вычисления по (4.24) значений л-' и у'. При неявном описании f(x, у, z) — 0 поверхности, пересекающейся с лучом зрения в точке р, координаты последней находятся решением системы двух линейных уравнений, полученных из (4.28), и нелинейного уравнения поверхности: Fx + x'z = x'F, Fy + y'z=y'F, (4.29) f{x,y,z) = 0. При параметрическом описании поверхности функциями x(t, т), y(t, т) и z(t, т) координаты лежащей на ней точки находятся решением системы двух в общем случае нелинейных уравнений Fx{t,T)+x'z(f,T)=x'F, (4.30) Fy{t,x)+y'z(t,z)=y'F относительно параметров {/, т} и подстановкой их в функцию z(t, т).
Геометрические задачи визуализации 513 В частном случае плоской поверхности получим несколько вариантов расчета координат точки р в зависимости от способа описания плоскости: • при неявном описании плоскости матрицей [А ВС Ь\: Fx + x'z = x'F, Fy + y'z = yF, Ax + By + Cz + D = 0 [x у z]=[x'F y'F -D] F 0 A 0 F В x у С (4.31,0) Без применения матричных операций после ручных преобразований выражение (4.31, о) принимает вид CF + D , CF + D , Ax'+By' + D х = - ■ - - ,*. У = —. . . „, „„У ■ г= , , „ , „„*'■. (4.31,6) Ax' + By'-CF Ax'+By-CF- Ax'+By'-CF • при нормальном описании плоскости {ро, N} применяем формулы (4.31) с коэффициентами A = Nx, В = Ny, C = N:,D = -ро о N; (4.32) • при параметрическом описании плоскости {ро, V, W] вычисляем нормаль 7V= Vx Ww применяем формулы (4.31) с коэффициентами (4.32). Также представляет интерес решение (1.102, о) задачи пересечения луча р' + Vt, проведенного из точки р' = [х' у' о] в направлении наблюдателя V=S-p' = [~x -у' F], с плоскостью {ро, N}: p = p>+(po-p)°"vJ?-Po)°»p>+(po-p)°NS. И VoN (S-p')oN {S-p')oN (4.33) В СКН с ближним наблюдателем S сортировка точек /?, по уменьшению их дальностей d, превращается в сортировку по уменьшению длин векторов (S-pi)oN (4.34) Основной недостаток выбора СКН в качестве рабочей системы — необходимость пересчета в нее координат всех объектов и матриц преобразований, задаваемых обычно в СК сцены. Подробное обсуждение особенностей работы в этой субъективно неподвижной системе координат приведено в разд. 2.2.5.3. 4.3.1.2. Построение охватывающих оболочек Метод оболочек получил широкое распространение в системах машинной графики благодаря резкому сокращению трудоемкости решения задач трассировки лучей и визуализации. Суть метода в том, что сложный Зс1-объект с большим числом разнообразных (полигональных или криволинейных, плоских или объ-
514 Глава 4 емных, выпуклых или невыпуклых) ячеек окружается (вручную или автоматически) виртуальной выпуклой оболочкой существенно более простой формы, чем объект. Назначение оболочки: П локализовать часть пространства, содержащего объект; П заменить выполнение вычислительных операций со сложной поверхностью объекта операциями с его простой оболочкой. Модели оболочек добавляются к списку моделей объектов сцены либо составляют отдельный список оболочек. Оболочки обновляются после каждого геометрического преобразования, приводящего к изменению их моделей. Трудоемкость метода оболочек пропорциональна суммарному числу граней оболочек всех объектов сцены Nr = NoHro, где «го— среднее число граней оболочки одного объекта. Уменьшение трудоемкости оценивается коэффициентом простоты оболочек "г где пг — среднее число граней объекта. Вот лишь некоторые задачи компьютерной графики, в которых применение охватывающих оболочек наиболее эффективно в смысле экономии машинных ресурсов: П практически все алгоритмы, использующие трассировку лучей. Метод трассировки лежит в основе некоторых алгоритмов удаления. Расчет пересечения лучей с объектами сцены занимает от 75% до 95% всех вычислений [33], причем большая часть расчетов при малой степени заполнения сцены объектами выполняется бесполезно по причине прохождения большинства лучей мимо всех объектов. Поэтому при обработке сцены желательно как можно раньше исключить такие лучи из рассмотрения путем быстрой оценки их непересечения с простыми оболочками; П обработка столкновений движущихся объектов. При этом проверяется взаимное проникновение элементов одного объекта внутрь другого (см. рис. 2.68). что связано с расчетом попарных пересечений ребер с гранями и выполнения тестов ориентации точек относительно полигонов и полиэдров. С помощью оболочек можно быстро обнаружить заведомо непересекающиеся объекты; П в системах анимации, моделирования и автоматизированного проектирования сложных многозвенных конструкций практикуется эскизное изображение звеньев сложной формы в виде охватывающих их оболочек-параллелепипедов (рис. 4.68, а). Это повышает эффективность проектирования и ускоряет вывод по сравнению с каркасной моделью (рис. 4.68, б), не говоря уж о сплошной (рис. 4.68, в), за счет исключения трудоемкой визуализации сложных поверхностей и оптических эффектов. Аналогичный прием используется в программах архитектурного и ландшафтного дизайна, заменяющих на стадии эскизного проекта сложные архитектурные сооружения условными
Геометрические задачи визуализации 515 "коробками" для ускорения композиционных, транспортных, акустических, инфляционных (солнечное освещение), аэродинамических и других инженерных расчетов. Наиболее распространены три типа оболочек: П сферические; П габаритные; П полигональные. Кроме геометрической формы оболочки характеризуются: П способом построения — ручным, полуавтоматическим или автоматическим; П плотностью облегания объекта; П сложностью модели — числом ее параметров и трудоемкостью применения; П зависимостью параметров оболочки от геометрических преобразований охватываемого объекта. Сферические оболочки Сферическая оболочка (рис. 4.69, а) строится автоматически и отличается от других оболочек минимумом параметров, простотой построения и использования, но, с другой стороны, невысокой плотностью облегания. Положение сферы в пространстве однозначно задается точкой центра с и радиусом г. В первом приближении, достойном его простоте, центр сферической оболочки объекта с вершинами/?, можно принять в его центре тяжести
516 Глава 4 а радиус оболочки равным г = тах|/?, - с|. Аффинные преобразования вращения и переноса, не изменяющие форму объекта, не влияют на значение г, тогда как масштабирование объекта приводит к изменению радиуса оболочки. Таким образом, у сферической оболочки любого движущегося жесткого объекта изменяются только координаты центра с. Расчет пересечения прямой линии p(t)=po + Vt с квадратичной поверхностью (см. разд. 1.2.3) сводится к решению квадратного уравнения (1.55), для составления которого нужно иметь матрицу F квадратичной формы поверхности из (1.124). Однако тест пересечения луча со сферой интересуют не сами точки пересечения и даже не значения параметра t в этих точках, а лишь факт наличия или отсутствия пересечения. Достаточно вычислить расстояние от точки с до прямой {ро, V), равное по (1.84) d = \{c-p0)x^\, и сравнить его с радиусом г. При d > г луч и сфера гарантированно не пересекаются. Рис. 4.69 Так же просто с помощью двух сферических оболочек с параметрами {с\,п} и {сг, п) оценивается взаимная ориентация объектов 1 и 2 (рис. 4.69, б). Тестом заведомого непересечения этих объектов является выполнение условия d = \с\ - сг\ >г\+ п. Некоторые авторы [11] предлагают вместо сферической использовать эллипсоио- ную оболочку, оси которой ориентированы вдоль осей координат. Конечно та-
Геометрические задачи визуализации 517 кая оболочка может дать чуть более плотное облегание объекта, но при этом теряются все преимущества сферической оболочки. Выполнение операций с не самым простым квадратичным объектом, каким является эллипсоид, — слишком дорогая цена такой замены. Габаритные оболочки Габаритная оболочка объекта с вершинами p,=[jc, .у, zt] строится автоматически как описанный шестигранник, форма которого зависит от положения наблюдателя. В сцене с дальним наблюдателем, имеющим вектор направления S = г°, оболочка принимает форму регулярного параллелепипеда, грани которого параллельны координатным плоскостям СКН (рис. 4.70). Габаритные координаты объекта Xmin = mm{Xi},yimn = min{^,}, Zmin = min{z,}, Лтах = max{x,},^max = max {}>/}, Zmax = max{z,} Рис. 4.70 определяют принадлежащее его оболочке замкнутое пространство ' Утях ]}n{ze[zmin,zmax]}. При диагональном расположении сильно вытянутого объекта его габаритная оболочка имеет очень малую плотность облегания. Для получения полиэдральной модели параллелепипеда {О, G) из модели куба (4.20) вычислим его центр с — 0-5 L-*min + xmax J'min + .Углах zmin + 2тах J
518 Глава 4 и полудлины сторон dx = 0.5(Л"тах - Aran). (iy = 0.5(j;max -/пи), cl. = 0.5(Zmax - Zmin). Тогда матрица вершин оболочки и массив списков граней равны О = PnM(dx, dy, dz)T(c), G = Ga. В алгоритмах удаления, использующих трассировку лучей для сортировки точек по глубине сцены, габаритные оболочки-параллелепипеды применяются для быстрого обнаружения объектов, не пересекаемых лучами. Габаритный тест пересечения объекта с прямой p3+z°t, проходящей через экранную точку р3 параллельно боковым граням оболочки, состоит в вычислении по (4.24) координат точки/?' в системе координат наблюдателя и проверке условия frmin <х< *тах }П Ьтт < У < Ушах } (4-35) их принадлежности прямоугольной проекции оболочки. Расположение начала луча вне габаритного прямоугольника означает гарантированное непересечение объекта лучом. Оболочки-параллелепипеды широко применяются в габаритных тестах взаимной ориентации графических объектов, сводящихся к простой проверке пересечения интервалов их координат. Примерами использования габаритных оболочек для быстрого обнаружения заведомо непересекающихся объектов служат функции gabZ_test и gab3_poly, определенные в (1.123). В сцене с ближним наблюдателем, находящимся в точке S = Fz°, габаритные оболочки объектов имеют форму усеченных пирамид с вершинами S (рис. 4.71). Задняя и передняя прямоугольные грани оболочки параллельны плоскости проецирования и лежат, соответственно, в плоскостях Zmin = min{z,}, Zmax = max{z,}. Плоскости боковых трапециевидных граней образуют (левая с правой, а нижняя с верхней) минимальные углы раствора по горизонтали и вертикали. В результате все точки объекта заключены между этими плоскостями. Тангенсы углов наклона плоскостей gmin, gmax, Vmin, 1'max к оси z и габаритные координаты прямоугольной проекции оболочки на плоскость ху находятся следующим образом: £п = min mm F-z, Ух Fg{ 8п = max = max i F-Zi У* F-: (4.36, a) nun ' Лтах Smax' Утт ^min> Утгк ^n
Геометрические задачи визуализации 519 Полиэдральная модель усеченной пирамиды {О, G) включает массив списков граней куба G = Ga из (4.20) и матрицу вершин о = £min" Sm'in" Smax" £max" £min" £min" £max" ^max H где vmax^ zmax .H vmin# zmin Vrnin^7 vmmh H = F- Zmin, h = F- Zn Рис. 4.71 £max" vmin# Эти данные можно использовать для визуализации оболочки как любого другого полиэдра, а также в иных целях, например, при решении различных задач пересечения. В алгоритмах, использующих трассировку лучей для сортировки точек по расстоянию до ближнего наблюдателя, габаритные оболочки-пирамиды применяются для быстрого обнаружения объектов, не пересекаемых сканирующими лучами, сходящимися в центре проецирования. Габаритный тест пересечения объекта с прямой р' + (S-p')t, соединяющей точку/?' е ху с наблюдателем S, заключается в проверке условий frmin < х < х'тах } П {y'min <у'< у'тах } (4.36, б) ее принадлежности прямоугольной центральной проекции оболочки. Расположение начала луча вне габаритного прямоугольника означает гарантированное непересечение объекта с этим лучом. Оболочки-пирамиды применяются в габаритных тестах взаимной ориентации графических объектов, сводящихся к проверке пересечения их угловых интервалов \gm\n, gmax], [vmin, Vmax] и координатных интервалов [zmin, Zmax]. Например, ана-
520 Глава 4 логично тесту (1.123, а), использующему оболочку-параллелепипед, строится перспективный вариант габаритного теста ориентации точки q = [х у z] с угловыми координатами х у g= fv= F — z F-z относительно объекта P, имеющего пирамидальную оболочку с параметрами (4.36, а): gab3_test(q, P)={gi kmin.gmax]}U{v<2 [vmin,vmax]}ll{zg [zmin,zmax]}. Недостатки габаритной оболочки заключаются, во-первых, в зависимости ее параметров от преобразований объекта; во-вторых, как уже говорилось, в малой плотности облегания объекта при вытянутости его формы и диагональном расположении относительно координатных плоскостей. Полиэдральные оболочки Полиэдральная оболочка строится как выпуклый полиэдр {О, G) несложной формы, плотно облегающий объект. Как правило, такая оболочка строится один раз и претерпевает синхронно с объектом все геометрические преобразования. Способ построения оболочки, в основном, ручной— путем интерактивного выставления вокруг объекта точек о, (вершин оболочки) и формирования на них граней GjC непрерывным тестированием: П выпуклости получаемого полиэдра {О, G) функцией conv3(0, G) из (1.121); П нахождения всех вершин объекта р, в пределах границ выпуклого полиэдра {О, G) с помощью функции conv3_test(ph О, G) из (1.122). Автоматизация построения плотной полиэдральной оболочки возможна при наличии у объекта симметрии или если имеется алгоритм синтеза выпуклых полиэдральных оболочек массива точек. Для поверхности, полученной вращением некоторой образующей линии р0(х)= (х0(т) у0(т) О] вокруг оси у, можно интерактивно задать на плоскости ху минимальное число точек о, так, чтобы ломаная линия {о\ ог... о„) огибала образующую, нигде с ней не пересекаясь (рис. 4.72). Непрерывное вращение этой ломаной вокруг оси у дает криволинейную поликоническую боковую поверхность (рис. 4.73, а). Для получения полиэдральной оболочки впишем каждый усеченный конус в правильную усеченную пирамиду с по ^ 3 боковыми гранями. Поскольку у правильного «о-угольника соотношение радиусов описанной и вписанной окружностей равно [13] sec(vj/0), где ц1о — п/ Но, то вершины оболочки лежат на меридианах поверхности вращения ломаной линии \p\o\... о'„}, полученной растяжением полилинии {о\ ог... о„} вдоль оси х в sec(vy0) раз. Угол между образующими меридианами равен 2\\1о, следовательно, вращение каждой точки о\, не являющейся полюсом, дает п0 вершин оболочки, рассчитываемых по формуле P,j =fy(2WK Vy = l,«0.
Геометрические задачи визуализации 521 Рис. 4.72 Благодаря осевой симметрии расположения этих точек четырехугольные грани оболочки являются планарными. ч -V Рис. 4.73 Таким образом, с учетом верхней и нижней /ь-угольных граней топологические параметры полиэдральной оболочки в полном соответствии с формулой Эйлера (3.101) равны Пв-П По, «г = (л - 1)/2о + 2, Лр = (2/2 - 1)«о. Если одна из крайних точек о\ либо оп является полюсом, то Ли = (Л - 1)Ло + 1, Лг = (Л - 1)Ио + 1, Лр = 2(Л - 1)Ло. Наконец, если обе эти точки выбраны на оси вращения, то Лв = (Л - 2)Ло + 2, Лг = (Л - 1)//о, Яр = (2л - 3)Ио. Для иллюстрации изложенного метода на рис. 4.72 построены две полиэдральные оболочки одного и того же объекта вращения при л0 = 4 (б) и л0 = 6 (в).
522 Глава 4 Полностью автоматический синтез полиэдральной оболочки может быть выполнен с помощью алгоритма со\>егЗ, описанного в разд. 4.2.8.5 (см. рис. 4.59). Достаточно сформировать массив Р вершин объекта, перечисленных в произвольном порядке, и алгоритм возвратит модель выпуклого полиэдра {О, G) = cover3(P), плотно обтягивающего объект по выступающим вершинам. Недостатки автоматического метода: П задание большого числа точек криволинейной поверхности для увеличения плотности ее облегания дает слишком много граней оболочки, что нарушает принцип ее простоты по сравнению с объектом; П задание слишком малого числа точек криволинейного объекта приводит к выпячиванию его отдельных частей из построенной "оболочки", которая в этом случае таковой не является. Выходом из этой ситуации является добавление выступающих точек к списку вершин построенного полиэдра и повторный расчет оболочки. Кластерные оболочки Дальнейшее развитие метода оболочек, повышающее эффективность визуализации, основывается на понятии кластерных групп пространственно связанных объектов и приводит к построению иерархического дерева оболочек. Начальный уровень иерархии состоит из одного кластера сцены, чья оболочка охватывает все ее содержимое. Например, сцена компьютерной игры в футбол состоит из объектов второго уровня иерархии — поля, двух ворот, игроков наподобие фигуры, изображенной на рис. 4.68, и мяча. Тело человека не является единым объектом и состоит из соединенных между собой относительно подвижных частей (головы, шеи, туловища, рук и ног) — объектов третьего уровня иерархии. Кластер группы конструктивно связанных объектов имеет собственную оболочку. Процедура кластеризации выполняется до получения терминальных вершин иерархического дерева — неделимых объектов со своими оболочками. Построенные кластерные оболочки обрабатываются в иерархическом порядке, начиная с кластера сцены. Если луч не пересекает его оболочку, то он не может пересечь и ни одного из входящих в него объектов, что позволяет сразу исключить их из списка обработки. В противном случае на пересечение с лучом проверяются оболочки кластеров следующего уровня иерархии. Если луч не пересекает некоторую оболочку, то ее кластер и все содержащиеся в нем объекты и кластеры исключаются из дальнейшего анализа. В случае пересечения кластера лучом описанная процедура обхода кластерного дерева рекурсивно повторяется до тех пор, пока не будут рассмотрены все объекты. Когда луч пересекает оболочку некоего объекта, тот заносится в список активных объектов. По завершении обхода дерева число элементов в списке активных объектов, как правило, намного меньше общего числа объектов сцены, подвергаемых обработке.
Геометрические задачи визуализации 523 Кластеризация значительно сокращает расчет пересечений лучей с оболочками и в целом повышает эффективность алгоритма визуализации сцены. Трудоемкость метода кластерных оболочек пропорциональна log(TVr) << Nr при Nr» 1. 4.3.1.3. Разбиение граней В предыдущих разделах мы изучили алгоритмы разбиения (разрезания) плоского полигона на выпуклые фрагменты и треугольники (cut^poly, tri^poly, contri^poly). Там же было кратко сказано о месте операции разбиения в арсенале инструментов компьютерной графики. Приведем еще некоторые аргументы в пользу выполнения разбиения на предварительной стадии визуализации объектов: П насколько это возможно, рекомендуется избегать операций с невыпуклыми объектами, существенно более сложных в сравнении с алгоритмами обработки выпуклых фигур. Однократные затраты на выпуклое разбиение, например, алгоритмом cut_poly, невыпуклых взаимно перекрывающихся или пересекающихся полигонов (см. рис. 4.15) несравнимы с многократным решением задачи визуализации этой конструкции в различных ракурсах; П определенные трудности обычно вызывает визуализация неплоской грани. Во-первых, нормаль к ее поверхности не имеет постоянного направления, из- за чего цвет закраски этой грани индивидуален в каждой ее точке (см. рис. 3.45—3.47). Во-вторых, неплоская грань типа косой плоскости при определенном ракурсе наблюдения может экранировать саму себя и проецироваться на картинную плоскость невыпуклым и, возможно, самопересекающимся полигоном (см. рис. 3.29, б). Аппроксимация такой грани системой треугольников — всегда плоских полигонов — избавляет от перечисленных проблем. Для этого можно использовать, например, алгоритм tri_poly; П некоторые алгоритмы удаления правильно работают с равновеликими гранями, близкими по форме к правильным полигонам (равносторонним треугольникам и квадратам), но не всегда верно отображают грани вытянутой формы, намного отличающиеся друг от друга габаритными размерами (см. рис. 3.5). Решение становится возможным после разбиения таких граней на примерно равновеликие фрагменты желаемой формы. Для этого можно использовать, например, алгоритм contri_poly; П в зависимости от удаленности наблюдателя один и тот же объект под разными углами зрения может выглядеть как мелко, так и крупно. Если в используемом алгоритме визуализации не применяется никаких методов сглаживания, то приближение наблюдателя к криволинейной поверхности делает ее изображение крупноячеечным, как бы сотканным из лоскутков с четко различимыми границами. В этом случае целесообразно разбивать поверхность на фрагменты с постоянными угловыми размерами. При этом линейные размеры фрагментов изменяются пропорционально расстоянию от наблюдателя до поверхности; П одной из основ САПР объектов с распределенными параметрами является метод конечных элементов [19,20], основанный на разбиении объекта на большое число мелких частей. В области конечного элемента определенные
524 Глава 4 свойства объекта считаются постоянными, а их изменение происходит на границах элементов. Таким образом, разбиение играет в системах проектирования сложных распределенных объектов основополагающую роль. В сценах с подвижным наблюдателем весьма эффективно адаптивное разбиение, смысл которого заключается в следующем. С дальней дистанции мелкие детали объекта не различимы (сливаются) из-за конечного углового разрешения здорового глаза человека 8Р « Г = 0.00028 рад, обусловленного ненулевым расстоянием между светочувствительными рецепторами. Для осмысления этой малой величины достаточно сказать, что круглый диск диаметром d. - 0.25 мм виден под углом 8р с расстояния d. /8Р«1 м. Значит, поверхности удаленных объектов можно разбивать на малое число крупных граней. При "наезде" наблюдателя на объект предельное линейное разрешение ЛР = гЬр — промежуток между различимыми точками — уменьшается пропорционально расстоянию г от наблюдателя до объекта (рис. 4.74). ■ш Рис. 4.74 Вторым фактором, ограничивающим линейное разрешение изображения на экране дисплея, является конечный размер пиксела графического режима, в котором работает прикладная программа. В режиме с максимальным разрешением видеоадаптера можно принять диаметр пиксела равным d. = 0.25 мм. Тогда с учетом масштабного коэффициента цэ, вычисленного по (2.26) или (2.27,6), получим предельное линейное разрешение ЛР = \iid.. Объединяя обе оценки и принимая во внимание, что самый малый различимый элемент имеет размер Ар, а минимальный просвет между элементами также равен ЛР, получим следующую оценку минимального габаритного параметра разбиения: /zmin = 2max{/-5P, цэ</.}- (4.37) Таким образом, выбор размера ячеек разбиваемой поверхности должен осуществляться из условия Л > Amin, не забывая при этом, что значение Amin дает предельно малые размеры различимых элементов изображения и делает визуализацию чрезвычайно трудоемкой. На практике, конечно, можно задавать параметр А в несколько раз большим.
Геометрические задачи визуализации 525 Алгоритм адаптивного разбиения имеет явно выраженные фрактальные свойства в смысле бесконечности процесса приближения модели, составленной из плоских граней, к реальной гладкой поверхности. Выделим основные типы поверхностей разбиения: П параметрические p(t,x), определенные в узловых точках Py-pUj,^ сетки t € {to,..., t„), т € {то,..., т,„} (рис. 4.75, о), и полигональные, заданные списком точек-вершин Р — {р\ ...ркр\) в порядке обхода границы поверхности по замкнутому контуру (рис. 4.75, б). Рис. 4.75 Переход от параметрического описания к полигональному заключается в формировании замкнутого контура из к — 2(и + т) граничных точек: Р = {/700/710 ...рпорп\ ..-/7,,,,,/7^1,,,, ..-/70,,,/70.,,,., .../70о}. (4.38) При этом возможно слияние нескольких вершин в общем полюсе, порождающее кратность этих точек и необходимость ее устранения перед началом разбиения. Обратное преобразование полигональной поверхности в параметрическую, в общем случае, невозможно из-за ее произвольной формы и нерегулярного распределения вершин по контуру полигона; П плоские и объемные в зависимости от определяемой по (1.81) размерности пространства, натянутого на точки поверхности. Разбиение плоских граней на более мелкие плоские же грани имеет целью приведение их размеров к одному порядку для облегчения решения задачи удаления, а также разрезание невыпуклых граней на совокупность выпуклых фрагментов. Еще одна и, пожалуй, главная причина, по которой объемные поверхности подвергаются разбиению по алгоритму триангуляции,— это получение моделей с плоскими гранями. Параметрические поверхности симметричных объектов — в основном, тел вращения — могут быть разбиты на плоские грани и более чем треугольной формы. Благодаря симметрии все вершины такой грани удовлетворяют в (1.81) условию т = 2.
526 Глава 4 Дробление параметрической поверхности целесообразнее всего выполнять в пространстве параметров {t, т} с последующим прямым расчетом точек поверхности p(t, х). Следует помнить, что нелинейности в координатных функциях x(t, х) -;- z(t, т)— источник искажений формы ячеек, построенных в пространстве {t, т}, при их отображении на криволинейную поверхность. Рассмотрим некоторые способы разбиения параметрической сетки. П Уменьшение (не обязательно кратное) интервалов дискретизации Af,- = Г.-и - Г,-, Дт, = т7-+| - т,-. Фактически на прежнюю поверхность натягивается новая, более густая сетка, что увеличивает число ячеек и уменьшает их размер. Например, при кратном уменьшении Af, в N, а Дт, в М раз каждая ячейка дробится на N ■ М прямоугольных ячеек (рис. 4.76, а). П Разбиение каждой прямоугольной ячейки диагоналями на два или четыре треугольника, причем во втором случае центр параметрической ячейки находится в точке 6,у = 0.5[^ + ti+i Xj + т,+1 J (рис. 4.76, б). П Переход от параметрической сетки к граничному прямоугольнику с четырьмя вершинами и его триангуляция по алгоритму contri_poly с желаемым значением И, выбираемым с учетом (4.37) (рис. 4.76, в). t4 К tt 'с к II -1J_ .и. -J.J. _L1. i ' ' -U1. -Li. Дт ' i i J_i_ _i_i_ _i_u ' i i .LJ. .1.-1- .LJ. p 'j \ (Ч-1.Л, (U) (<+UL (U> К ,('+1,7+0 (',y+i) Д'+1.У+1) (U+D б Рис. 4.76
Геометрические задачи визуализации 527 Эффективность описанных методов разбиения объемной параметрической поверхности обусловлена решением задачи фактически в двумерном пространстве ее параметров и простотой прямого расчета положения фрагментов в пространстве по известной зависимости p(t, т). К недостаткам метода можно отнести искажения формы фрагментов при переходе из плоского параметрического пространства на криволинейную поверхность. Особую осторожность нужно соблюдать при разбиении параметрических прямоугольных ячеек, примыкающих к полюсам поверхности, на которой они имеют форму треугольников (см. рис. 1.50, о, в—ж). При разбиении такой ячейки на два треугольника один из них вырождается в отрезок со всеми вытекающими отсюда сложностями его визуализации как грани. Сложность разбиения полигональной поверхности, заданной граничным контуром Р= {р\ ...pkpk+^=p\), зависит от ее планарных свойств, т.е. близости к плоскости. Ориентация плоской грани характеризуется единым для всех ее точек вектором нормали N, заданным в нормальном описании {ро, N], либо вычисленным по параметрическому описанию {ро, V, W) как N— Vx W, либо построенным по любым трем неколлинеарным точкамpi,pjир, как N = но/та( {/?,,/?,,/?,}). Точки объемной поверхности некомпланарны, но если она не очень выпуклая, то по методу Ньюэла [25] строится аппроксимирующая плоскость {p\,Ncp} с нормалью к к ^ср = 5Х =(P\-Pk)x(P2\-P\)+T;(P'-Pi-\)X(Pi+l-P')' /=1 /=2 полученной усреднением нормалей Ni = norm({pH,pi,pi+l}) к плоскостям треугольников при вершинах полигона (рис. 4.77). Оптимальная аппроксимирующая плоскость {ро, N}, наименее удаленная от совокупности точек {/7i, ...,рк), строится по алгоритму (1.90). Рис. 4.77
528 Глава 4 Промелькнувшее выше определение поверхности "не очень выпуклая" означает, что локальные нормали /V,- к вершинным треугольникам составляют с прямым и обратным направлениями усредненной нормали jVCp не слишком большие углы, скажем, не более 30°. Наличие нормалей, почти ортогональных к направлению TVcp, означает, что полигональная поверхность может иметь складку, т. е. описываться неоднозначной функцией z' — ц>(х', у') в системе координат x'y'z', в которой аппроксимирующая плоскость является фронтальной. Однозначное описание поверхности объемной грани гарантирует, что любые ортогональные к плоскости {p\,NCp} (или {/7о,/V}) прямые пересекают поверхность один, а грань— не более одного раза. Рассмотрим два метода, благодаря которым становится возможным применение алгоритмов двухмерного разбиения объемных граней, как параметрических, так и полигональных. 1. С помощью матриц (2.60) или простым обнулением одной из координат массив точек поверхности S проецируется на некоторую координатную плоскость МСК. Для минимизации проективных искажений выбирается такая плоскость, нормаль которой ю° — один из ортов х°, у0 или z° — составляет с нормалью плоскости (аппроксимирующей плоскости) грани наименьший угол, а со-ая координата нормали имеет наибольший модуль |/VM|. Второй причиной выбора плоскости, например, ху, может служить наличие явного описания поверхности, например, z — ц>(х, у). Далее выполняется разбиение орто графи ческой проекции S', результатом чего является массив проекций точек разбиения Q'. Последнее, что нужно сделать, — это получить точки массива Q на исходной поверхности путем расчета пересечения с ней проецирующих прямых q] + id°t (рис. 4.78, о). При выборе проективной плоскости ху с нормалью со0 = z° это делается по (4.25)—(4.27). Недостатки ортографического проецирования объемной грани заключаются, во-первых, в возможности получения на проекции самопересекающегося полигона, недопустимого для работы алгоритмов разбиения. Как иллюстрация сказанного на рис. 4.78, о построены три ортографические проекции кусочной полигональной поверхности, из которых одна— профильная проекция 51 — является самопересекающейся. Отсутствие самопересечений — третье ограничение в выборе проективной плоскости. Тест self_test(P) проверки плоского полигона Р на самопересечение приведен в гл. 1. Во-вторых, восстановление точек разбиения грани по их ортографическим проекциям вносит масштабные искажения тем большие, чем больше угол наклона нормали плоскости грани /Vk проективной плоскости. 2. Разбиение выполняется в плоскости (аппроксимирующей плоскости) самой грани {/7о, /V} (рис. 4.78, б). Преобразование поверхности S в систему коорди-
Геометрические задачи визуализации 529 нат x'y'z', в которой плоскость разбиения является фронтальной, выполняется с помощью матрицы CK=MAP2{p0,N,O3,z°). а б Рис. 4.78 Вычислив проекцию S' = SCKOf, делаем ее разбиение, а полученный массив точек Q ' на плоскости х'у' преобразуем на плоскость {ро, N} по формуле Если исходная поверхность S плоская, т. е. совпадает с {ро, N}, то ее разбиение фактически готово: Q = Q"- В случае объемной поверхности восстановление точек q, массива Q на исходной поверхности производится путем расчета пересечения с ней проецирующих прямых q" + Nt. При неявном описании поверхности грани выражением f{p) — 0 решается скалярное уравнение относительно параметра t. При параметрическом описании p(t, 0) решается система трех скалярных уравнений q'+Nt = p(x,Q) относительно параметров t, х и 0. Так или иначе, после нахождения числа t получим точку пересечения qt =q"+Nt. С сожалением приходится констатировать, что применение алгоритмов разрезания плоских фигур для разбиения объемной поверхности связано с численным решением нелинейных уравнений пересечения, что вкупе с проективными искажениями делает данный метод весьма трудоемким.
530 Глава 4 4.3.1.4. Отбраковка нелицевых граней и нормировка векторов Процесс создания реалистичного изображения сцены можно представить как графический конвейер, на который различные объекты ставят свои элементы — точки, отрезки, полигоны — для последующей обработки. Пройдя через участки геометрических преобразований в пространстве, проецирования на картинную плоскость, отсечения окном вывода, элементы поступают на этап удаления, где определяется их взаимное экранирование и степень видимости наблюдателем. В результате из видимых фрагментов формируется растр изображения в желаемой цветовой палитре— цветной, черно-белой, в градациях серого и т. п. Одновременно с расчетом растра выполняется цветовой расчет (тонирование по [36]), после чего готовая картинка из буфера кадра выводится на экран. Сразу после размещения объектов сцены в пространстве становится возможным определить, какие графические элементы не будут видны наблюдателю целиком по причине их полного экранирования другими элементами. Эти элементы целесообразно немедленно отбраковать (снять с конвейера), чтобы не тратить машинные ресурсы на их дальнейшую бесполезную обработку. Когда отбраковка касается граней, то эти грани называются нелицевыми, т. е. не обращенными "лицом" к наблюдателю. Задача идентификации и отбраковки нелицевых граней имеет два аспекта: алгоритмический и геометрический. Алгоритмический аспект имеет следующий смысл: если используемый алгоритм удаления не основан на изображении только лицевых граней, примером чего является описанный в разд. 3.1.1.2 алгоритм художника, то отпадает сама необходимость их обнаружения, не говоря уж об удалении из конвейерного списка. Таким образом, не для всех алгоритмов удаления отбраковка лицевых граней может быть одинаково полезна, хотя, несомненно, вреда она не принесет, сократив размер списка обрабатываемых граней. Геометрический аспект основан на том соображении, что у любой поверхности как границы раздела пространства есть две стороны. Мы сейчас не будем вникать в строгое топологическое определение стороны поверхности, а используем обиходное понятие сторон листа как двумерных сущностей, кратчайший переход между которыми выполняется путем прокола листа. Какую из двух сторон назвать внешней (наружной), а какую внутренней? Может ли быть лицевой внутренняя сторона? Ответы на эти вопросы зависят от вида модели объекта, его замкнутости и позиции наблюдателя. Внешней условно назовем сторону поверхности замкнутого объекта, видимую наблюдателем из неограниченного подпространства (рис. 4.79, а). У объекта, описываемого сплошной Зё-моделью, внутренняя сторона поверхности вообще отсутствует в том смысле, что ее нельзя увидеть изнутри по причине отсутствия внутренней полости. При разрезании сплошного тела с помощью булевой операции исключения, которую можно выполнить функцией inclipbjiedr, его поверхность изменяется, но всегда остается внешней (рис. 4.79, б). Таким образом, лицевые (в смысле— потенциально видимые) участки поверхности сплошного тела могут располагаться только на ее внеш-
Геометрические задачи визуализации 531 ней стороне, а описания внутренних поверхностей в моделях данного класса отсутствуют. а 6 в Рис. 4.79 Внутренняя сторона поверхности замкнутого граничного объекта существует, может иметь цвет, отличающийся от цвета наружной стороны, но остается невидимой, пока поверхность непрозрачна. Установление ненулевого процента прозрачности какой-либо ее части делает обе ее стороны доступными для наблюдения (см. рис. 1.75, 4.73). При разрезании граничного объекта он становится незамкнутым, что эквивалентно замкнутому граничному объекту с полностью прозрачными гранями разреза (рис. 4.79, в). Так или иначе, лицевые участки замкнутой граничной поверхности могут располагаться на обеих ее сторонах, а модель объекта данного класса должна содержать двустороннее описание граничной поверхности. Определения внешней и внутренней сторон поверхности незамкнутого объекта бессмысленны, т. к. обе стороны могут быть видны одновременно и никакой из них нельзя отдать предпочтение (см. рис. 1.50, 2.60, 3.10, 4.79, б). Модель незамкнутой криволинейной поверхности всегда должна быть двусторонней, и на каждой стороне могут быть одновременно как лицевые, так и нелицевые участки. Признаком лицевой ориентации /-ой грани или касательной плоскости к выпуклой поверхности является острый угол \j/, между векторами внешней нормали TV, и направления на наблюдателя £, (см. рис. 3.3, я), а самым простым ее тестом — положительный знак скалярного произведения 7V, о S; > 0. Более того, как говорилось в разд. 4.3.1.1, при выборе системы координат, в которой вектор дальнего наблюдателя равен S = z°, отбраковка превращается в простой анализ знаков аппликат внешних нормалей /V,,-. Что означает термин "двустороннее описание" поверхности или грани? Для простоты обычно пренебрегают толщиной листа, разделяющего пространство. Таким образом, определяющие бесконечно тонкую поверхность точки на противоположных ее сторонах совпадают. Лишь нормали N к внешней и -N к внутренней сторонам имеют противоположные направления (рис. 4.80). Следовательно, модели противоположных сторон поверхности могут использовать общее параметрическое p(t, т) или полигональное Р-{р\ ...р„р\} описание, но разные нормали, либо общий вектор нормали и два знака 1 и -1, с которыми он должен применяться каждой из сторон.
532 Глава 4 т -N В заключение необходимо отметить, что небольшое ускорение визуализации может быть достигнуто с помощью предварительной нормировки И всех векторов V (имя К— обобщающее, вместо него может быть любое другое обозначение вектора), модули которых \V\ используются более одного раза. Сокращение времени достигается за счет: П исключения многократных вычислений квадратного корня |к| = v''° ^ — достаточно медленной операции, выполняемой с помощью разложения в степенной ряд; П отсутствия необходимости в не самой быстрой арифметической операции деления, т. к. длина нормированного вектора И равна единице. Укажем несколько типовых случаев использования нормированных векторов: П расчет расстояний между различными графическими элементами; П трассировка лучей и расчет по (1.146)—(1.162) оптических эффектов (отражений и преломлений) на произвольных поверхностях и, в частности, на плоскостях; П вычисление угла между векторами по (1.31) либо косинуса угла cos Этот расчет необходим, например, для нахождения лицевых граней и закраски поверхности по (3.8) на основе закона диффузного отражения Ламберта. В связи с этим рекомендуется сразу после вычисления нормировать вектор направления S дальнего наблюдателя и векторы нормалей TV, ко всем граням полиэдров и во всех необходимых точках криволинейных поверхностей. Переходим к изучению методов удаления невидимых элементов. Разработано великое множество алгоритмов удаления. Часть их описана в книгах [2, 5, 11, 18, 19, 20, 23, 25, 31, 33—36], другая часть — в библиографии к ним, остальные менее популярные методы оказались вне пределов упоминания, что, однако, не лишает
Геометрические задачи визуализации 533 их права на существование. Одни алгоритмы просты, но применимы только в частных случаях; другие— более универсальны, но и трудны для понимания, сложны в программировании и требуют больших машинных ресурсов. Многообразие методов удаления, их названий (функциональных и именных) и продолжающаяся разработка новых методов свидетельствует об активности и перспективности исследований в этом направлении. Наиболее обстоятельное, полное, детальное (объем списка эпитетов стремится в бесконечность) изложение различных методов удаления приведено в книге Д. Роджерса [25]. Здесь же автор не претендует на открытие новых алгоритмов, а всего лишь предпринимает попытки оригинального решения задач этого класса в надежде, что его решения будут востребованы. Будем полагать, что все отрезки о,й, и лицевые грани Lp/, подвергаемые анализу на видимость, собраны в двух общих списках Ls = {a\ b\ ... a„b„},Lm = {Lp\ ... LpJ независимо от их принадлежности отдельным объектам. Использование иной организации данных будет оговорено в каждом конкретном случае. 4.3.2. Удаление невидимых линий Элементарный способ (называть его алгоритмом слишком амбициозно) изображения выпуклого каркасного тела с непрозрачными плоскими гранями, полностью экранирующими собственные невидимые ребра (см. рис. 4.62, б, в), заключается в выводе экранных проекций контуров всех лицевых граней на том основании, что каждое ребро, принадлежащее видимой грани, также является видимым. При этом ребра между двумя лицевыми гранями рисуются дважды. Вовсе не факт, что дополнительные вычисления, необходимые для исключения кратного вывода ребер, будут выгоднее, чем их отсутствие. Если видимые ребра некоторого k-ro выпуклого полиэдра необходимы для дальнейшей работы, то из них нужно сформировать список Lsk, в котором кратные элементы, естественно, недопустимы. Для этого просматриваются списки вершин граней l4>i=\pa-Ptn,Pa) WeX*, где Хк — список индексов граней к-го объекта в массиве списков Lm, и по алгоритму, приведенному на рис. 4.1, я, вычисляется объединение ребер лицевых граней выпуклого полиэдра Lsk = U \j\pijPij+\\ (4.39) в котором по сравнению с простой конкатенацией кратные отрезки отсутствуют. Рассмотрим общую задачу определения видимости отрезков, произвольно расположенных относительно плоских полигональных граней. Отличие этой задачи от
534 Глава 4 предыдущей состоит в допущении пересечения отрезков с гранями и их частичной видимости вследствие частичного экранирования (см. рис. 2.68). Вначале разработаем алгоритм экранирования (shielding) отдельно взятого отрезка ab отдельно взятой полигональной выпуклой гранью Р= {р\ ...рпр\) в зависимости от их ориентации относительно друг друга и наблюдателя. Обозначим вектор направления отрезка У= Ь-а. Будем рассматривать два типа наблюдателя: П бесконечно удаленного в постоянном направлении Н - S от всех точек отрезка (рис. 4.81,«); П ближнего, расположенного в точке S в направлении H = S-a от точки а (рис. 4.81,5). Рис. 4.81 Первое, что делает отрезок невидимым,— это его совпадение с лучом зрения, что быстро проверяется тестом \VxH] = 0. Такой отрезок имеет вырожденную в точку экранную проекцию и должен быть исключен из анализа экранирования всеми гранями. Второй особый случай касается совпадения луча зрения с плоскостью грани. Это вырождает ее проекцию в отрезок нулевой площади, который не в состоянии экранировать никакой другой объект. К тому же, если все грани сцены прошли предварительную обработку, то совпадающая с лучом грань не является лицевой и будет отбракована. Обратные лучи, проведенные из глаза наблюдателя до точек не параллельного им отрезка ab, лежат в шоскости зрения П = {a, N) с нормалью N= V * Н. Экранирование отрезка гранью Р возникает при одновременном выполнении двух условий: П грань пересекается с плоскостью зрения. Отрезок их пересечения cd можно найти по алгоритму сечения полиэдра бесконечной плоскостью cut_hedr(P, G, a, N)
Геометрические задачи визуализации 535 (см. рис. 4.56), использующему список G={Gi}, состоящий из одной грани G\ = {1,..., п, 1}. Достоинство этого алгоритма— предварительное тестирование пересечения по (1.120) и возвращение пустого списка при отсутствии пересечения. Это означает, что отрезок ab не экранируется полигоном Р, или, другими словами, экранируется пустым отрезком; П обратные лучи, проведенные от наблюдателя до точек отрезка ab (но не дальше!), по пути пересекают хотя бы часть или весь отрезок cd. Расчет отрезков, экранирующих ab, проведем в следующем порядке. £7 Шаг 1. Аналогично (4.15) найдем параметры разложения векторов c-a= Vtc + Hxc,d-a = Vtt, + Hxtl в базисе {V, Н): IS* П 1л I/ 1Г> Л 1л f-J I/ л I/ I/ ГУ #-7 •с "с I'd xd_ (c-a)oV (с-а)°Н (d-a)oH (d-a)oH VoV VoH VoH HoH (4.40) Шаг 2. Выполним внешнее параметрическое отсечение отрезка cd областью видимости т > 0, при необходимости смещая параметры задних точек с или d на границу т = 0: П при {тс > 0}П{т</ > о} весь отрезок «/расположен от наблюдателя не дальше, чем отрезок ab, поэтому значения параметров, вычисленные в (4.40), не изменяются; П при {тс >0}П{т</ <0} (этот случай изображен на рис. 4.81) ближняя часть cd расположена со стороны точки с, поэтому смещению подвергаются параметры точки d: bd xdb tc+itd-tcY 0 П при {тс < о}П{т</ > о} смещаются параметры точки с: Ь тс] = td+{tc-td)—^- (4.41, а) (4.41,6) П при {тс < о}П fed < °}U (тс < °}П fed - °) весь отрезок cd отстоит от наблюдателя дальше, чем ab, т. е. экранирование отсутствует. Шаг 3. При наличии эффекта экранирования спроецируем ближнюю к наблюдателю часть сечения грани плоскостью {a + Vtc + #т„ а + Vt,, + Нх,,} на прямую отрезка ab: П при дальнем наблюдателе параллельное проецирование дает точки a = a + Vtc, Р = а + Vt,,; (4.42, а)
536 Глава 4 П при ближнем наблюдателе по правилам центрального проецирования получим a = a + V- 1 , $ = a + V td 1-¾ (4.42, б) На рис. 4.82 приведен алгоритм shield_segm_conv(ab, Р, S, mod) экранирования отрезка ab плоской полигональной выпуклой гранью Р- {р\ ...р„р\). Наблюдатель задается вектором S и типом удаленности mode {О, 1}, равным нулю при бесконечном и единице при конечном удалении. Алгоритм возвращает экранирующий отрезок на прямой, проходящей через точки а и Ь, либо пустой отрезок при отсутствии экранирования. ( shield_segm_conv(ab,P£,mod) J V = b-a, H=S-moda cd=cut_hedr(P\\ size(P)\a,V*H) 'c Tcl Г(с-а)°^ (c-a)oH fd ij\l(d-a)<>H (d-a)°H VoV VoH so- ( Возврат 0 ) Рис. 4.82 Вспоминая, что в нашей коллекции есть алгоритм cross_poly расчета пересечения двух плоских полигонов (см. рис. 4.15), используем его для решении задачи экранирования отрезка ab произвольным, в том числе и невыпуклым полигоном Р= {р\ ...рпр\) (рис. 4.83). Смысл идеи в том, что все отрезки, по которым Р пересекается с полигоном (не плоскостью!) видимости 77, экранируют отрезок ab и
Геометрические задачи визуализации 537 не нуждаются в параметрическом отсечении по формулам (4.41). Достаточно для каждого отрезка c,rf, из списка Ls', возвращенного функцией cross_poly(P, П, 3, Ls') = 1, найти по (4.40) параметры концевых точек {/„, т„-} и {/<Л)т,,,}, спроецировать эти точки по (4.42) на прямую отрезка ab и сформировать конкатенацию полученных отрезков а, р,. ( shield_segm_conv(ab,PJS.mod) ) V=b-a, H=S-mod-a cd =cul_hedr(P,{\,..., size(P)\a,VxH) 0 ^^ (c-a)°V (c-a)°H (d-a)oH (d-a)oH ( Возврат 0 ) ( Возврат ф J Рис. 4.83 Что касается способа задания полигона видимости, то для ближнего наблюдателя это треугольник П = {abSa}, а для дальнего — полубесконечная полоса. Аналогично способу представления полуплоскости (см. разд. 4.2.7.1) зададим достаточно большое число BIG, заведомо превышающее максимальную глубину сцены. Тогда полосу видимости можно заменить конечным полигоном П- {a,b,b + BIG -S,a + BIG S,a}. Описанный метод реализован в виде алгоритма shield_segm{ab, Р, S, mod) экранирования отрезка ab плоской полигональной гранью Р- {pi ...рпр\} с наблюдателем, задаваемым параметрами S и mod е {0, 1} (рис. 4.84). Алгоритм возвращает список экранирующих ab отрезков, лежащих на прямой, проходящей через точки а и Ь, либо пустой список при отсутствии экранирования.
538 Глава 4 ( shield_segm(ob,PJS,mod) J <niodZ>— 1 П ={a,b,b+ BIG S,a + BIG S.a} V V = b-a, H=S~moda Ls'=0, Ls"=0, с - cross _ poly(P, /7,3,1/) i r n=fa,b,S.a} end cd = Ls' lc тЛ Г(с-я)оК (с-а)оЯ Л/ *J l(d-a)oH (d-a)oH Ls'=Ls'v\a + V tr \-modx,. ■a + V V K< 1- =>K V°H H H°H Ij -mod-Tj f Возврат Ls" J Рис. 4.84 Несмотря на простую блок-схему, алгоритм достаточно трудоемок, т. к. основан на сложном алгоритме cross__poly. Поэтому в задачах визуализации объектов, все грани которых являются выпуклыми полигонами, рекомендуется использовать более простой и быстрый алгоритм shield_segm_conv. Завершим раздел разработкой алгоритма удаления отрезков списка Ls= {ciibh..., a„bn), экранированных плоскими полигональными гранями, составляющими массив списков Lm — {Lp\,...,Lp„,}. Если грани этого массива не проходят отбраковку, то читатель должен самостоятельно дополнить алгоритм расчетом их нормалей TV, = norm{Lp^, скалярных произведений ст, = N,,« S и работать только с лицевыми гранями, для которых ст, > 0. Каркасное изображение сцены создается как самостоятельными отрезками, так и ребрами лицевых граней. Есть еще отрезки взаимного пересечения граней, отсутствующие в исходных данных. Они рассчитываются по алгоритму cross_poly. Все эти отрезки объединяются в общий список Lso. Для каждого отрезка Ls0j, не совпадающего с лучом зрения, формируется список экранирующих отрезков L&,-, после чего исключение Ls0j -> Ls3i; добавляется в список видимых отрезков La>. На основе сказанного разработан и представлен на рис. 4.85 алгоритм hide_segm(Ls, Lm, S, mod) удаления отрезков списка Ls, экранируемых полигональными гранями списка Lm с наблюдателем, задаваемым параметрами S и
Геометрические задачи визуализации 539 mod е {О, 1}. Алгоритм возвращает список отрезков в границах их видимости наблюдателем в объектном пространстве. Chide segm(Ls, M,S,mod) ) V m = size (Lin), Lsa V = Ls, LsB = 0 <z 1.../И >— end P=Lp, <^J=l...size(P)-ib— end Ls'= 0, с =cross_ poly\P, Lpr3, Ls') Ls0 = Ls0 U Ls' ( Возврат LiB \* >"<^ /=1 ...si:e(Lsc) Ъ—— end —' N = (b-a)x(S-moda) ►^ j=\...m у end — — Ls3=Ls3[Jshield_segm{ab,Lpl,S,mod) ab—iLs^-^Ls <■ Рис. 4.85 4.3.3. Удаление невидимых граней Простейший способ изображения выпуклого сплошного полиэдра заключается в произвольном порядке вывода экранных проекций всех его лицевых граней и представляет собой один из вариантов метода Робертса (см. разд. 3.1.1). Благодаря выпуклости объекта его грани видимы либо невидимы целиком. Все невидимые грани являются нелицевыми, и на этом основан принцип их отбраковки, рассмотренный в разд. 4.3.1.4. Смежные грани пересекаются друг с другом только по общим ребрам, а несмежные грани не пересекаются. Таким образом, у выпуклых полиэдров исключена частичная видимость граней. Рассмотрим общую задачу определения видимости плоских полигональных граней, произвольно расположенных относительно друг друга. Она решается при изображении как отдельных невыпуклых тел, возможно, имеющих отверстия и
540 Глава 4 самопересечения, так и совокупности пересекающихся тел. В отличие от выпуклой задачи здесь возможна частичная видимость граней вследствие их взаимного экранирования, в том числе и за счет пересечения друг с другом (см. рис. 2.68). Сначала изучим эффект экранирования отдельно взятой плоской грани Q другой плоской гранью Р в зависимости от их ориентации относительно друг друга и наблюдателя. Экранирование поверхности подобно оптическому эффекту образования тени и заключается в попадании части или всей поверхности Q в теневую зону Н, находящуюся за гранью Р. В итоге наблюдатель видит лишь часть грани Q, находящуюся вне теневой зоны. В случае дальнего наблюдателя область Н представляет собой незамкнутую призму с основанием Р (рис. 4.86, а), а при ближнем наблюдателе это будет незамкнутая усеченная пирамида с передней гранью Р и без задней грани (рис. 4.86, б). Задача экранирования эквивалентна внутреннему отсечению полигона Р областью Н. Рис. 4.86
Геометрические задачи визуализации 541 Единственное, что мешает использовать для такого отсечения алгоритм inclip3__poly, разработанный в разд. 4.2.5,— это бесконечная протяженность теневой зоны в глубину сцены. Аналогично ранее примененному методу представления неограниченных полупространств зададим достаточно большое число BIG, заведомо превышающее максимальную глубину сцены. Тогда бесконечная теневая зона полигона Р= {р\ ...р„р\) заменяется конечным полиэдром Н= {О, G} с параллельными передней и задней гранями. Координаты его 2л вершин, составляющих массив О = {о\,..., ог„}, в зависимости от типа наблюдателя, задаваемого параметром mod е {О, 1}, вычисляются следующим образом: {/?. при i < п; i \ (4 43) pH„-BIG\S-mod- /?,_„;при г>«. Грани полиэдра Н опишем массивом G — {G\, Gi, G$,..., G„+2} со списками [ G] ={l, ..., «, l}, G2 ={ln,2n-\, ...,n + \,2n\ i (4.44) [ G2+1 = {«, n + i, mod(w + /' +1, n), mod(/ +1, n\ i} V/ = 1, n. Введем вспомогательную функцию shadow(P, S, mod) формирования параметров полиэдра теневой зоны грани Р - {р\ ...р„р\) с наблюдателем, задаваемым параметрами S и mod е {0, 1}. Функция возвращает рассчитанные по (4.43) матрицу координат полиэдра О и по (4.44) массив списков граней G. Вот теперь, при наличии конечного полиэдра Н, можно использовать его в качестве внутреннего отсекателя грани Q, экранированной гранью Р. После вычисления параметров теневого полиэдра {О, G} - shadow(P, S, mod) и отсечения им полигона Q по алгоритму inclip3_poly(Q, О, G, U, F) получим список полигонов — видимых фрагментов Q. На рис. 4.87 приведен алгоритм hide_poly(Lm, S, mod) удаления полигональных граней списка Lm, невидимых наблюдателем, задаваемым параметрами S и mod е {0, 1}. Алгоритм возвращает список полигонов— видимых фрагментов исходных граней. Алгоритм рассчитывает попарное экранирование m граней массива списков Lm= {Lpt,..., Lp,„} путем внутреннего отсечения граней Q = Lp, \/i = l,m теневыми полиэдрами граней Р- Lpj V/ = \,m, j*i. В зависимости от размера и содержимого вспомогательного списка Lm', возвращенного алгоритмом inclipZ_poly, возможны следующие варианты действий: П если список Lm' пустой, то грань Q полностью экранирована гранью Р (рис. 4.88, а) и удаляется из списка Lm; П если Lm' содержит один элемент, то это может быть либо полигон исходной полностью видимой грани Q (рис. 4.88, 6), либо один видимый фрагмент час-
542 Глава 4 тично экранированной грани Q (рис. 4.88, в). В первом случае, т. е. при Lm' = Q, алгоритм переходит к проверке экранирования полигона Q следующей гранью Р, а во втором элементы списка Lm' добавляются в список Lm, а Q из него исключается; ( hidej>oly(LmJS,mod) J ( Возврат Lm j end -^ 7=1 ». У* P = Lpr 1/=0, F = 0 {0,G}=shadotv(P,S,mod) Lm'=mclipi_poly(Q,0,G,U, F) fi=OVk = l.size(Lm') Lm'-^t Lm >1 41 4 0 | Рис. 4.87 П если в списке Lm' более одного элемента (рис. 4.88, г), то все видимые фрагменты частично экранированной грани Q добавляются в список Lm, a Q из него исключается. При любом изменении размера или содержимого списка граней Lm, выполненном в результате отсечения, алгоритм переходит на начало обработки обновленного списка. Если перед очередным циклом обработки список Lm содержит единственную грань, то алгоритм заканчивает работу с возвратом этой грани.
Геометрические задачи визуализации 543 По окончании обработки список Lm содержит не экранирующие друг друга полигональные фрагменты видимых наблюдателем граней, которые алгоритм возвращает как результат своей работы. Далее эти полигоны можно проецировать на экран или использовать в последующих расчетах. Рис. 4.88 Рассмотренный алгоритм hide_poly содержит важный элемент оптимизации, позволяющий сократить число переборов пар {Q, Р) с помощью флажков полной видимости граней. Флажок /'-ой грани/ является ее неотделимым атрибутом, таким же, как число и координаты вершин, цвет, нормаль и другие параметры. Он участвует во всех списковых операциях вместе со своей гранью. Перед началом обработки граней все т флажков сбрасываются в ноль. Грань Q = Lph не экранированная ни одной гранью Р = Lphj ф i, является полностью видимой наблюдателем, поэтому после перебора всех граней Р флажок f, устанавливается в единицу. Больше эта грань не будет участвовать в проверках экранирования и в отсечении ни как объект Q, ни как экран Р. Новые полигоны, добавляемые в Lm, снабжаются своими флажками полной видимости, устанавливаемыми в ноль. В конце обработки списка Lm флажки всех его полигонов становятся равны единице. В заключение хочется еще раз подчеркнуть, что автор не ставил своей целью энциклопедический охват всех существующих алгоритмов удаления, которые можно найти во многих книгах по компьютерной графике, а попытался проторить свою, пусть и неширокую, тропинку в безбрежном пространстве решений проблем визуализации сложных геометрических объектов.
544 Глава 4 На сегодняшний день наиболее эффективное решение графических задач обеспечивает конвейерная архитектура, реализованная как программными, так и аппаратными средствами [36]. В будущем, совершенно очевидно, графические СБИС станут работать быстрее, степень их интеграции многократно возрастет, а стоимость уменьшится. Это является предпосылкой тотального наступления методов распараллеливания графических вычислений, обеспечивающих более высокое качество изображения, учет большего числа источников света и глубину проработки разнообразных световых эффектов. Следовательно, пользователь такой графической системы получит возможность включать в отображаемую сцену больше объектов с самыми разнообразными оптическими свойствами, которые будут моделироваться так же, как они происходят в природе — быстро и параллельно.
Заключение Поздравляю тебя, вдумчивый читатель, с тем, что ты успешно дочитал до конца мою книгу! Надеюсь, что она не показалась тебе слишком заумной, непонятной и скучной. Ведь первоначально она задумывалась как небольшое внутривузов- ское методическое пособие по основным геометрическим понятиям и взаимоотношениям объектов на плоскости и пространстве, адаптированным к использованию в компьютерной графике. Но лишь выйдя из-под клавиш и начав самостоятельное существование, рукопись, как и полагается своенравному чаду, перестала слушаться своего создателя и начала диктовать свои требования по дальнейшему развитию. В результате она разрасталась, захватывала все новые и новые темы, пока не стала такой, какой ты, читатель, ее видишь перед собой. И ведь неймется, негодной, так и заставляет автора дополнять, исправлять, придумывать новые примеры... Пришла, в конце концов, пора остановить этот бесконечный процесс и представить на суд общественности сей скромный труд, весьма далекий от совершенства. Я надеюсь, что книга будет полезна как для первоначального знакомства с основами компьютерной геометрии и графики, так и для кропотливого изучения ее материала студентами, преподавателями, программистами и научными работниками — теми, для кого она создавалась. Главным посылом, который подвигнул меня заняться сочинительством, была неудовлетворенность уровнем и содержанием книг по компьютерной графике, изданных как десять лет назад, так и продаваемых в настоящее время. Вся литература по вычислительной геометрии и компьютерной графике отчетливо делится на три группы: 1. Книги теоретического плана [24], посвященные глубокому анализу свойств геометрических объектов и алгоритмов. К сожалению, материал подобных научных трудов, при всем огромном уважении к их авторам, не усваивается средним студентом технического вуза, и большой труд оказывается затрачен впустую. 2. Книги, рассчитанные на неподготовленного читателя, в которых рассматриваются простейшие геометрические соотношения и алгоритмы, а решение более- менее сложных задач дается на уровне добрых пожеланий [2, 5, 23, 31, 33, 34, 35]. Даже в таких основательных изданиях, как [25], и то можно встретить "советы" такого типа: "... разрезать невыпуклое тело плоскостью, несущей выбранную грань" (с. 204). Как это сделать не на словах, а с помощью конкретного алгоритма — ни слова, ни намека. Приведенная выдержка взята из предлагаемого Д. Роджерсом алгоритма разрезания невыпуклого полиэдра, по которому невозможно написать программу без какого-либо домысливания. 3. Книги, посвященные описанию общеизвестных графических программ, большую часть которых занимает обучение пользованию кнопками меню и
546 Заключение изображение различных окон и экранных форм. Конечно, это очень интересно, но хотелось бы не только видеть результат нажатия какой-нибудь кнопки, но и знать, как он получился, т. е. по какому алгоритму рассчитан. Надеюсь, читатель понимает, что овладение компьютерной графикой на уровне внешних визуальных эффектов есть не истинное знание этой науки, а лишь навык работы с конкретной прикладной программой. Суть происходящих в ней информационных процессов глубоко скрыта за видимой легкостью получения результата одним щелчком мыши. В своей книге я попытался нащупать "золотую середину" между излишней академичностью и дилетантством, сделав ее доступной и полезной широким слоям студентов, программистов и научных работников. В Заключении хотелось бы заострить внимание читателя на тех моментах новизны, которыми данная книга отличается от других изданий. Что касается содержания книги в целом, то это иллюстрация практически всех изучаемых алгоритмов блок-схемами, по которым можно поводить пальцем, проследить порядок выполнения операций в зависимости от различных условий, другими словами, заставить работать несколько механизмов усвоения читателем материала книги. В главе 1: □ приведен полный систематизированный свод основных геометрических соотношений между графическими элементами на плоскости и в пространстве; П разработано множество различных тестов, позволяющих максимально быстро установить необходимые свойства графических объектов и взаимоотношения между ними; □ рассмотрен комплекс основных задач геометрической оптики и лучевых методов построения оптических эффектов как на плоской, так и на криволинейной поверхности. В главе 2: □ обоснован метод парных точек, позволяющий вычислять матрицы сложных преобразований объектов и системы координат по их начальным и конечным состояниям без разложения на элементарные преобразования; □ в зависимости от количества известных точек в начальном и конечном положениях объекта предложено три алгоритма расчета матрицы преобразования; □ разработаны экономичные итеративные и рекуррентные кинематические алгоритмы перемещения объектов с не полностью определенными элементами движения; □ подробно излагаются теория и методы построения параллельных и центральных проекций; □ разработаны проективные алгоритмы сложных преобразований, в том числе, построения проекций пространственных линий на плоскость, стереографических проекций, свойства и методы построения различных картографических проекций, алгоритмы изображения динамичных сцен от первого лица и. наконец, проективные методы построения оптических эффектов на плоскости.
Заключение 547 В главе 3: □ приведена полная схема классификации поверхностей, представляющая методы конструирования их математических моделей и реалистичного изображения на плоскости; □ предложены алгоритмы построения разверток линейчатых поверхностей; □ разработан экономичный рекуррентный алгоритм построения каналовых поверхностей на основе метода парных точек; □ рассмотрены методы построения кубических сплайновых кривых и поверхностей, в том числе и в рекуррентной форме, позволяющей снизить порядок обращаемых матриц до четвертого; □ изучаются свойства, методы получения и изображения фрактальных множеств, включая фрактальные ломаные линии и полигональные сети. В главе 4: □ разработаны алгоритмы выполнения логических операций со списками отрезков; □ разработан пакет алгоритмов отсечения различных графических элементов на плоскости и в пространстве и на этой основе метод логического конструирования трехмерных объектов; □ предложена коллекция алгоритмов решения классических задач вычислительной геометрии, связанных с отсечением на плоскости и в пространстве, включая отсечение полигона полуплоскостью, а полиэдра— полупространством, а также построение выпуклых оболочек и разрезание полигонов; П предложены оригинальные алгоритмы удаления невидимых линий и граней, основанные на алгоритмах пакета отсечения. С окончанием работы над книгой у меня осталось чувство ее незавершенности, недосказанности всего, что задумывалось и просилось быть раскрытым. К моменту выхода книги в свет накопилось несколько тем, которые мне хотелось бы увидеть во втором издании, если оно когда-нибудь состоится. Вот что планируется добавить: □ в раздел 2.1— задачу построения квадратичной поверхности, описываемой произвольным неявным уравнением второго порядка, сводящуюся к вычислению матрицы сложного аффинного преобразования канонической поверхности, тип которой идентифицирован по инвариантам заданной поверхности; □ в раздел 2.2— задачу преобразования Зё-объектов, позволяющую свести косоугольное и центральное проецирование к параллельному с помощью пред- проективных искажений; □ в раздел 2.2.5— задачу проецирования на криволинейные поверхности, решаемую методом преобразования системы координат, включая наложение текстур; □ раздел 2.3— восстановление состояния трехмерного объекта по его параллельным и перспективным, включая стереографические, проекциям;
548 Заключение □ ъраздел 3.1.3 — развитие теории кусочно-определенных поверхностей; □ в раздел 3.1.4— развитие теории сплайновых поверхностей; П ъраздел 3.1.5 — алгоритмы фрактального сжатия данных; П в разделы 4.2.7 и 4.2.8— алгоритмы решения новых задач отсечения на плоскости и в пространстве; □ главу 5 "Оптические задачи визуализации", посвященную детальному изучению основных физических и психофизических понятий света, цвета и их свойств в объеме, необходимом для обоснования цветовых систем и решения оптических задач визуализации — построения различных моделей освещенности, алгоритмов закрашивания поверхностей, расчета сложных оптических эффектов; П главу 6 "Анимация", посвященную разработке алгоритмов построения динамических полиморфных объектов и сцен в реальном времени; □ другие темы и задачи, которые созреют к моменту подготовки второго издания книги. Я не могу не поблагодарить главного редактора издательства "БХВ-Петербург" Кондукову Екатерину Владимировну и заведующую редакцией Кузьмину Анну Сергеевну за принятие ответственного решения об издании моей книги, за терпение, благожелательность и требовательность, проявленные ими при подготовке книги. Буду рад получить от читателей критические замечания по материалу книги, сообщения об ошибках или опечатках, любые пожелания об улучшении содержания и оформления ее будущих изданий. Мой адрес e-mail: nea@mail.nnov.ru. почтовый адрес: 603600, Нижний Новгород, ул. Минина, 24, Нижегородский государственный технический университет, кафедра "Вычислительная техника", Никулину Евгению Александровичу. Всегда готов к взаимовыгодному сотрудничеству. С уважением ко всем читателям Евгений Никулин
Список литературы 1. Агостон Ж. Теория цвета и ее применение в искусстве и дизайне. — М.: Мир, 1982.—184 с. 2. Амерал Л. Машинная графика на языке С. В 4-х кн. Пер. с англ. — М.: Сол Систем, 1992. 3. БерлянтА. М. Картография: Учебник для вузов.— М.: Аспект Пресс, 2001. —336 с. 4. Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Рус. яз., 1989. — 335 с. 5. Вельтмандер П. В. Машинная графика: Учеб. пособие в 3-х кн.— Новосибирск: Новосибирский гос. ун-т, 1997. 6. Вернер А. В., Кантор Б. Е., Франгулов С. А. Геометрия. Ч. I. Учебное пособие. — СПб.: Специальная литература, 1997. — 352 с. 7. Вернер А. В., Кантор Б. Е., Франгулов С. А. Геометрия. Ч. II. Учебное пособие. — СПб.: Специальная литература, 1997. — 320 с. 8. Воеводин В. В. Линейная алгебра. — М.: Наука, 1980. — 400 с. 9. Воеводин В. В., Кузнецов Ю. А. Матрицы и вычисления. — М.: Наука, 1984. —318 с. 10. Гантмахер Ф. Р. Теория матриц. — М.: Наука, 1988. — 548 с. 11. Иванов А. П., Батраков А. С. Трехмерная компьютерная графика. — М.: Радио и связь, 1995. — 224 с. 12. Кнут Д. Искусство программирования. В 3-х томах.— М.: Издательский дом "Вильяме", 2001. 13. Корн Г., Корн Т. Справочник по математике (для научных работников и инженеров). — М.: Наука, 1978. — 832 с. 14. Кривошеев М. И., Кустарев А. К. Цветовые измерения. — М.: Энергоатом- издат, 1990. —240 с. 15. Кухлинг X. Справочник по физике. — М.: Мир, 1983. — 520 с. 16. Ландсберг Г. С. Оптика. — М.: Наука, 1976. — 928 с. 17. Луизов А. В. Цвет и свет. — Л.: Энергоатомиздат, 1989. — 256 с. 18. Майкл Ласло. Вычислительная геометрия и компьютерная графика на C++: Пер. с англ. — М.: Бином, 1997. — 304 с. 19. Математика и САПР. В 2-х кн. Кн. 1. Пер. с франц. / Шенен П., Коснар М., Гардан И. и др. — М.: Мир, 1988. — 204 с.
550 Список литературы 20. Математика и САПР. В 2-х кн. Кн. 2. Пер. с франц./Жермен-Лакур П., Жорж П. Л., Пистр Ф., Безье П. — М.: Мир, 1989. — 264 с. 21. Пайтген Х.-О., Рихтер П. X. Красота фракталов. Образы комплексных динамических систем. — М.: Мир, 1993. — 176 с. 22. Плис А. И., Сливина Н. A. MathCAD 2000. Математический практикум для экономистов и инженеров: Учеб. пособие. — М.: Финансы и статистика, 2000. — 656 с. 23. Порев В. Н. Компьютерная графика. — СПб.: БХВ-Петербург, 2002. — 432 с. 24. Препарата Ф., Шеймос М. Вычислительная геометрия: Введение. — М.: Мир, 1989. —478 с. 25. Роджерс Д. Алгоритмические основы машинной графики. — М.: Мир, 1989. —512 с. 26. Роджерс Д., Адаме Дж. Математические основы машинной графики. — М.: Мир, 2001. —604 с. 27. Уилкинсон Дж. X. Алгебраическая проблема собственных значений. — М.: Наука, 1970. —564 с. 28. Физические величины: Справочник//Составители: А. П. Бабичев, Н. А. Бабушкина, А. М. Братковский и др. / Под ред. И. С. Григорьева, Е. 3. Мейли- хова. — М.: Энергоатомиздат, 1991. — 1232 с. 29. Фокс А., ПраттМ. Вычислительная геометрия. Применение в проектировании и на производстве. — М.: Мир, 1982. — 304 с. 30. Фостер Дж. Обработка списков: Пер. с англ. — М.: Мир, 1974. — 71с. 31. ХирнД., Бейкер М. Микрокомпьютерная графика.— М.: Мир, 1987.— 352 с. 32. Хорн Р., Джонсон Ч. Матричный анализ. — М.: Мир, 1989.—655 с. 33. Шикин Е. В., БоресковА. В. Компьютерная графика. Динамика, реалистические изображения. — М.: ДИАЛОГ-МИФИ, 1995. — 288 с. 34. Шикин Е. В., БоресковА. В. Компьютерная графика. Полигональные модели. — М.: ДИАЛОГ-МИФИ, 2000. — 464 с. 35. Эйнджел Й. Практическое введение в машинную графику.— М.: Радио и связь, 1984.—136 с. 36. Эйнджел Э. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд. — М.: Издательский дом "Вильяме", 2001. — 592 с.
Е. А. Никулин КОМПЬЮТЕРНАЯ ГЕОМЕТРИЯ И АЛГОРИТМЫ МАШИННОЙ ГРАФИКИ А Рассматриваются геометрические и алгоритмические основы компьютерной графики, математические модели объектов на плоскости и в пространстве, законы геометрической оптики и алгоритмы построения оптических эффектов, методы геометрических преобразований, анализ и синтез моделей, алгоритмы отсечения и удаления на плоскости и в пространстве. Пособие предназначено для студентов вузов и специалистов, интересующихся компьютерной графикой и занимающихся разработкой графических программ. Графические элементы на плоскости и в пространстве Лучевые и проективные методы построения оптических эффектов Методы построения и изображения поверхностей Логическое конструирование трехмерных объектов Комплекс алгоритмов отсечения и удаления на плоскости и в пространстве 4 БХВ-Петербург 198005, Сан.т-Пет-рбург, Измайчтаск Ч гр., 29 Е-гадИ: nai(®bh/.ru Irterwt www.bhv.ru теп.: (812)251-42-44 ИНТЕРНЕТ^АГШН Ч ISBN 5-94157-264-6 .slili'J