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. Как Вы видите, они обходятся по часовой стрелке, хоть и лежат на видимой поверхности. Дело в том, что наше правило обхода "против часов", которое мы ввели выше, было неполным. Движение должно осуществляться такин образом, чтобы при движении от предыдущей лючки к последующей, "тело" фигуры оставалось бы слева. Для внешних контуров это и дает обход против часовой стрелки, но для внутренних (хоть и видимых) движение оказывается "по часам"
Использование фиктивных ребер может значительно расширить Ваши возможности по изображению трехмерных тел.