Как найти контурные линии для алгоритма удаления скрытой линии Аппеля


10

Ради интереса я пытаюсь сделать каркасный просмотрщик для DCPU-16 . Я понимаю, как сделать все, кроме как скрыть линии, которые скрыты в каркас. Все вопросы здесь, касающиеся SO, предполагают, что у вас есть доступ к OpenGL, к сожалению, у меня нет доступа ни к чему подобному для DCPU-16 (или к любому виду аппаратного ускорения).

Я нашел довольно хорошее описание алгоритма Аппеля в Google Книгах . Однако есть одна проблема, с которой мне трудно разобраться.

Аппель определил контурную линию как ребро, разделенное лицевым и обратным многоугольником, или неразделенный край лицевого многоугольника, который не является частью замкнутого многогранника. Край, разделяемый двумя фронтальными многоугольниками, не вызывает изменения видимости и поэтому не является контурной линией. На рис. 8.4 ребра AB, EF, PC, GK и CH являются контурными линиями, а ребра ED, DC и GI - нет.

Рис. 8.4

Я понимаю правила алгоритма и то, как он работает, если у вас есть контурные линии, однако я не понимаю, что мне нужно сделать, чтобы определить, является ли ребро " общим для лицевого и обратного многоугольника", или неразделенный край лицевого многоугольника, который не является частью замкнутого многогранника "с точки зрения кодирования. Я могу посмотреть на форму и узнать, какие линии являются контурными линиями в моей голове, но я понятия не имею, как перенести это «понимание» в кодированный алгоритм.


Обновить

Я добился определенного прогресса в определении контурных линий. Я нашел эти две лекционные заметки из курса Университета Буффало по компьютерной графике.

введите описание изображения здесь

Рассмотрим края. Они делятся на три категории.

  1. Край, соединяющий две невидимые грани, сам по себе невидим. Это будет удалено из списка и проигнорировано.
  2. Кромка, соединяющая две потенциально видимые грани, называется материальной кромкой и требует дальнейшей обработки.
  3. Ребро, соединяющее потенциально видимую грань и невидимую грань, является частным случаем «материальной кромки» и также называется «контурной кромкой».

Используя две вышеупомянутые части информации, я могу приблизиться к возможности записать это как код, но мне еще предстоит пройти долгий путь.



1
Проверьте этот ответ на вычисление нормального треугольника. Точечное произведение вектора нормали с вектором прямой видимости определяет, является ли треугольник фронтальным.

Ответы:


3

Чтобы правило «-facing» сохранялось, вы должны убедиться, что все грани правильно ориентированы. Используйте, например, правило правой руки, это означает, что вершины грани должны быть пронумерованы таким образом, чтобы положительное вращение в плоскости грани соответствовало нормальному направлению вне многогранника. (Понятно?) Или, проще говоря, каждое лицо должно прийти со своей направленной наружу нормалью.

Висячие грани, то есть не принадлежащие замкнутому многограннику, можно рассматривать как имеющие неопределенную ориентацию.

Теперь вычисление частей ребра, которые скрыты контурным многоугольником, является основным курсом. Эта проблема очень близка к проблеме отрезания отрезка по многоугольному окну в 2D. Сначала рассмотрим линию поддержки отрезка и найдите пересечения с многоугольником. Используя правило четности, вы можете легко определить части внутри и снаружи многоугольника.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.