OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 93
Текст из файла (страница 93)
Функции Р Другая часть блока 11иТеззСа11ЬасК(тоЬ), 1(иге»са(1Ьас«(соь), 11итеззса11Ьас«(гоо), )ШТеззСа\1Ьас«(СоЬ), 11иТе55Са11Ьас«(соЬ), Мозаичное представление многоугольников 421 обратной связи для вершин и объединения (согпЬ(пе); гевз.с инициализации !п! 1() */ 6СО ТЕ55 ЧЕКТЕХ, чегсехСа11Ьас«); 6СО ТЕ55 ВЕ61К, Ьеп(пса11Ьас«): 6СО ТЕ55 ЕНО, епдса11Ьас«); 6СО ТЕ55 Еййо«, еггогСа11Ьас«); 6СВ ТЕ55 СОНВ1ИЕ, сошЬ(песа11Ьас«); 422 Глава 11 ° Мозаичное представление и поверхности второго порядка Листинг 11.2 (продолжение) ( сопвС 6)боаЫе 'ро]псег; ро1п(ег = (6(боаЫе *) чегсех; В[Со[огЗбч(ра]псег+3); Х['чегСехЗбч(чеггех); ) чо1б САССВАСК сапы пеСа[\Ьаск(6(боаЫе соогбв[3], 6СбоаЫе "чегСех баСа(4], 6(1[оаС не!вас[4], 6(боаЫе '*баСаоиС ) ( 6ьбааЫе 'чегсех; !пс чегСех = (6(боаЫе *) па[[ос(6 * в!аеас(6(боаЫе)); чегтех[О) = сбегав[0]; чегсех[1) = саогба[1]; чегсех[2) = соогба[2]; тог (1 = 3; ! < 6; 1++) чегсех(1] = ив[ВЫ (8] ' чег(ех ба(а[0][1! + ие]вас[1] * чегсех баса[1][!] + ие! аЫ (2] * чегсех баСа[2] [1] + ие!ВЫ [3] ' чеггех бага[3][!]: 'баеаоаС = чегеех; ) Листинг 11.2 также демонстрирует использование функции обратной связи 6И ТЕ55 СОМВ[МЕ.
К этой функции происходит обращение всякий раз, когда алгоритм тесселяции, анализируя входные контуры, обнаруживает пересечение я принимает решение о создании вершины. Она же вызывается, когда тесселятор решает объединить две вершины с практически одинаковыми координатами. В листинге 11. 2 новая вершина является линейной комбинацией четырех существующих — оегсех Нага[0..3].
Коэффициенты комбинирования находятся в массиве весов сбе[й)сг~0..3$ сумма этих весов равна 1.0. В массив соагс[в помещаются координаты новой вершины. Зарегистрированные процедуры обратной связи должны выделить память для другой вершины, выполнить взвешенную интерполяцию данных на основе данных пеггех !соса и ше!я)сг и вернуть указатель на новую вершину в переменной сса(а(лас Функция соа~нпеСа[[ЬасК() из листинга 112 интерполирует ВСВ значения цвета.
В начало массива из шести элементов помещаются хп у- и г-координаты, а взвешенные средние КСВ-компонентов заносятся в последние три элемента. Данные, определяемые пользователем Зарегистрированы могут быть функции обратной связи шести различных типов. Поскольку для каждой функции имеется две версии, всего получается 12 вызовов. Для первой версии данные определяются пользователем. Эти данные передаются приложением в функцию В1итевзВеВ]про[уйоп() и далее проходят, ос.
таваясь неизменными, каждую процедуру обратной связи "ВАТА. С 610 ТЕ55 Р)озанчное представление многоугольников 423 3161М ВАТА заданные пользователем данные могут быть применены для отдельных многоугольников. Если указаны обе версии процедуры обратной связи, используется вызов изег с?ага, а другой игнорируется.
Таким образом, хотя существует 12 вариантов, одновременно активны могут быть не более шести из них. Тпк, в листинге 11.2 используется плавное затенение, и процедура чегсехСа11озсх() зшгает НОВ-цвет для каждой вершины. Если вам нужно реализовать освещение и плавные переходы при выводе теней, для функции обратной связи следует указывать нормаль к поверхности для каждой вершиггы. Вместе с тем при необходиностн в освещении и «плоском» (однотонном) затенении достаточно указать только одну нормаль на многоугольник, но не для всех вершин. В атом случае вам следует выбрать функцию 610 ТЕ55 ВЕ61М ОАТА и передавать координаты вершины и нормаль к поверхности по указателю иьег с(а(а.
Свойства мозаичного разбиения Перед тем как выполнить тесселяцию и воспроизведение, вы можете использопать к1игеззРгорегсу() для установки свойств, имеющих отношение к алгоритку тесселяции. Самое важное и сложное из зтнх свойств — правило «намотки» (гчгпс?гпй гп?е), определяющее, что следует считать находящимся «внутри» многоугольника, а что — «снаружи».
чу к1оте з з Р горе гсу(О??)геззе?асог *Мзгоф, С? еппш рпгре»ПА О?х?оное оа?ие); Устанавливает значение (оа?ие) свойства (ргорегпу) для объекта разбиения (ГезгоЬ~). Свойство указывается константами 610 ТЕ55 ВООМОАРу ОМ(у, 6СО ТЕ55 ТОСЕКАМСЕ или 6(0 ТЕ55 И1М01М6 РОСЕ. Если указано свойство 610 ТЕ55 ВООМОАРУ ОКСУ, его значением может быть 61 ТРОЕ или 61 РА15Е. В первом случае многоугольники не разбиваются на многоугольники с заполнением; рисуются лишь контуры, разграничивающие внутреннюю и внешнюю части многоугольника. Значение по умолчанию— 61 ГА(5Е. (См. к1отеззногша1() для получения более подробной информации.) Если указано свойство 6СО ТЕ55 ТОСЕКАМСЕ, его значением является расстояние между двумя вершинами, удовлетворяющими требованию близости расположения.
Такие вершины могут быть объединены функцией обратной связи 610 ТЕ55 СОМВ1МЕ. Чтобы выяснить максимальное расстояние между вершинами, нужно умножить значение допуска на наибольшую разницу координат для поступивших на обработку вершин. Возможность объединения вершин поддержана не во всех реализациях, позтому значение допуска следует расценивать как рекомендованное. Допуск по умолчанию равен нулю. Свойство 610 ТЕ55 И1М01М6 КОСЕ определяет, какая часть многоугольника является «внутренней», а какая — «наружной» и, соответственно, не подлежащей заполнению, Аргумент оа?ие здесь может быть одним из следующих значений: 6СО ТЕ55 И1М01М6 000 (по умолчанию), 6СО ТЕ55 И1М01М6 МОМЕЕКО, 600 ТЕ55 И1М01М6 РО51Т?УЕ, 6СО ТЕ55 И1М01М6 МЕОАТХУЕ или 610 ТЕ55 И1МОХМ6 АВ5 6ЕО ТИО.
424 Глава 11 ° Мозаичное представление и поверхности второго порядка Число «витков» и правило «намотки» Для одиночного контура число «витков» (т»1пс11пд пц1пЬег) точки — это знаковое число оборотов вокруг нее при однократном обходе контура (обходу против часовой стрелки соответствуют положительные значения, по часовой стрелке — отрицательные). В случае нескольких контуров отдельные числа витков складываются.
Эта процедура связывает целое знаковое число с каждой точкой плоскости. Заметьте, что число витков одно и то же для всех точек отдельно взятой области. На рис. 11.2 показаны три набора контуров и их числа витков для точек внутри этих контуров. В левом наборе контуры обхолятся против часовой стрелки, соответственно, каждая вложенная область добавляет елиницу к числу витков. На среднем рисунке два внутренних контура обходятся по часовой стрелке, и их число витков декрементируется и становится отрицательным. Рис. 11.2.
Примеры контуров дпя демонстрации понятия числа витков Правило намотки классифицирует область как внутреннюю, если число витков соответствует категории: четное, не нуль, положительное, отрицательное или «абсолютное значение, большее или равное 2». Обычно четные и ненулевые числа свидетельствуют о «внутреннем» характере области.
Остальные варианты имеют ограниченное применение для СЯО- (сопзггпс11»е зо11о яеотеггу — конструктивная блочная геометрия) операций над многоугольниками. Программа-пример севзн1пп. с из состава установочного пакета Орепб1. демонстрирует использование правила намотки. На рис. 11.3 отображены четыре набора контуров. Темные участки на рисунке представляют внутренние области. Обратите внимание на то, как влияет на интерпретацию контура направление его обхода.
Правила намотки в конструктивной блочной геометрии Больше других бывают востребованы параметры 6И ТЕ55 И1й01й6 000 и 6ЕО ТЕ55 И1й01й6 йОй1ЕйО. Они находят применение в наиболее типичных случаях затенения. Правила намотки также применяются в конструктивной блочной геометрии (СБО), где онн облегчают поиск объединений, разностей или пересечений (булевы операции) нескольких контуров.
Мозаичное представление многоугольников 425 Рис. 11.3. Как правила намотки определяют внутренние области Для начала сделаем допущение, что для каждого контура число витков равно О для любой внутренней области и равно 1 для всех внешних областей. (Контур пе должен быть самопересекаюшимся.) Согласно этой схеме контуры «против часовой стрелки» соответствуют внешним границам многоугольника, а контуры «по часовой стрелке» вЂ” дырам. Контуры могут быть вложенными, причем вложенный контур должен быть ориентирован противоположно наружному.
42В Глава 11 ° Мозаичное представление и поверхности второго порядка Если оригинальные многоугольники не удовлетворяют этим допущениям, они могут быть предварительно преобразованы к этой форме посредством тесселяции со включенным свойством бьц ТЕ55 ВООМОАМУ ОМЕР. При этом возвращается список «правильных» контуров. Если вы создадите два объекта разбиения, то с помощью обратной связи можете осуществлять между ними обмен данными. К многоугольникам представленной формы применимы следующие СЗС-операцин: ° Объединение (пшоп). Для вычисления объединения нескольких контуров нарисуйте все входные контуры как отдельно взятый многоугольник.
Число витков в каждой результирующей области — это количество ее оригинальных многоугольников. Объединение может быть получено с помощью правил намотки 6ЕО ТЕ55 И1М01М6 МОМЕЕВО или 610 ТЕ55 И1М01Мб РО51Т1ЧЕ. Заметьте, что в первом случае вы получите тот же результат, как если бы изменили ориентацию всех контуров на обратную. ° Пересечение (!птегзесс!оп). Действует при условии одновременной обработки двух контуров.
По результатам рисуется один многоугольник. Для извлечения результата используйте 6ЕО ТЕ55 И1М01Мб АВ5 6ЕЦ ТИО. ° Разносп («ШЕегепсе). Допустим, что нужно вычислить разницу А г(((г" (В швов С цшоп О). Нарисуйте многоупиьник, составленный из немодифицированных контуров А, с сопутствующими контурами В, с и 0 с обратным порядком вершин. Для получения результата используйте правило 610 ТЕ55 И1М01Мб РО51Т1ЧЕ.