3.7 Полезные приемы
Предложенный здесь метод настолько прост, что
требовать от него большого совершенства не приходится. Так, например,
он не может четко работать с полыми объектами, он "не любит", когда
встречаются грани, представляющие иэ себя невыпуклый многоугольник и
т.п. Зато он работает настолько быстро, что небольшие погрешности могут
быть и не очень критичными, а в динамичной игре и не очень заметными.
Тем не менее, на несколько несложных, но важных моментов мы здесь
все-таки укажем.
Принцип декомпозиции.
Рис. 45 Декомпозиция на треугольники
Этот принцип состоит в тон, что грани
трехмерного тела упрощаются до треугольников и вместо описания сложной
грани мы вводим несколько описаний треугольников (см. рис.45).
Треугольники - достаточно удобные фигуры уже хотя бы тем, что они всегда вы пуклы- Рутинную работу по декомпозиции граней своего объекта можно произвести
вручную, при подготовке данных для программы, а
можно ее и не производить, а поручить компьютеру, ограничившись
описанием граней в виде многоугольников. Правда, при таком подходе
компьютер может оказаться иногда в тупиковой ситуации, например, на
рис. 46 показано, как он может "выдумать" несуществующий треугольник.
Методика борьбы с этим явлением состоит в том, что надо взять себе за
правило проводить разбиение всегда иэ одной и той же вершины, например
иэ той, которая значится в списке первой, а первой ставить ту вершину,
которая Вам удобна. Для слу чая, представленного на рис.47 такое
описание будет иметь вид: 6,1,2,3,4,5.
Рис. 47 Правильная декомпозиция
Для варианта, представленного на рис.48. Вам ни
вручную, ни автоматически не удастся найти приемлемого способа
декомпозиции иэ одной вершины. Здесь нужен специальный алгоритм. И он
существует. Суть его следующая:
- берутся две соседние вершины многоугольника, например 1 и 8 (рис.48) .
Рис. 46 Неправильная декомпозиция
берутся их соседние вершины. Для т.8 - это вершина 7, а для т.1 - это вершина 2.
проводятся возможные диагонали. Для т.8 - это 8-2, а для т. 1 это 1-7.
иэ этих двух диагоналей выбирается кратчайшая.
"Побеждает" диагональ 1-7, проведенная иэ вершина 1, а вершина 8 иэ
дальнейшего рассмотрения выпадает.
вместо выпавшей вершины "встает" ее соседка (вершина 7) и алгоритм повторяется для другой пары вершин 1 и 7.
так далее, пока все вершины не будут исчерпаны.
Шаг
|
Рассматриваемые
|
Рассматриваемые
|
Кратчайшая
|
Выпадающая
|
|
вершины
|
диагонали
|
диагональ
|
вершина
|
1
|
8,1
|
1-7, 8-2
|
1-7
|
8
|
2
|
7,1
|
7-2, 1-6
|
7-2
|
1
|
3
|
7,2
|
7-3, 2-6
|
2-6
|
7
|
4
|
6,2
|
6-3, 2-5
|
6-3
|
2
|
5
|
6,3
|
6-4, 3-5
|
6-4
|
3
|
<4
|
|
|
3
|
|
|
~ ~ - - , _ _
|
/
|
|
5
|
6
|
N
|
|
8
|
7
|
1
|
|
|
|
|
ч 1
|
|
|
_ _ -
|
—
|
|
|
1
|
|
|
2
|
Рис. 48 Алгоритм декомпозиции сложной фигуры
Как видите, этот путь позволяет проводить
автоматическую декомпозицию сложных фигур на треугольники. Если в
программе очень много плоских фигур (граней тел) и они непрерывно меняют
свою форму, то вручную делать декомпозицию на треугольники не %
всегда возможно и пользуются таким или подобным алгоритмом.
Принцип фиктивных ребер. Это еще один полезный прием, который часто применяют в векторной графике
С полыми телами при описанной выше технологии
лучше дел не иметь, но иногда все-таки это может быть необходимым. Как
же поступать, если такая задача стоит и обойти ее не удается, см.
например объект на рис. 49.
8
6
Рис. 49 Описание полого объекта.
Сложная грань имеет внутренний вырез. В
этом случае вводится понятие фиктивных ребер Они соединяют точку
внешнего контура с точкой внутреннего, как и настоящие ребра, они
включаются в описание грани, но при работе программы на экране не
изображаются Чтобы в описании грани сразу было видно, какое ребро
является фиктивным, а какое - нет, то при задании фиктивных ребер
ставится знак "минус" перед вершиной Тогда, например, верхняя грань
тела, показанного на рис.49, будет описываться следующим образом.
1,2,3,4,5,6,7,-12,13,14,15,12,-7,8,9,10,11
Программа должна сама разобраться, что если стоит "минус".
то сторону рисовать не надо, а надо просто перейти к новой координате .
С помощью такого приема можно изображать не
только внутренние полости, но и просто отрезки прямых, например
декоратив ные. Обратите также внимание на особенность порядка обхода
точек во внутреннем отверстии: 12,13,14,15. Как Вы видите, они
обходятся по часовой стрелке, хоть и лежат на видимой поверхности. Дело
в том, что наше правило обхода "против часов", которое мы ввели выше,
было неполным. Движение должно осуществляться такин образом, чтобы при движении от предыдущей лючки к последующей, "тело" фигуры оставалось бы слева. Для внешних контуров это и дает обход против часовой стрелки, но для внутренних (хоть и видимых) движение оказывается "по часам"
Использование фиктивных ребер может значительно расширить Ваши возможности по изображению трехмерных тел.