Ради интереса я пытаюсь сделать каркасный просмотрщик для DCPU-16 . Я понимаю, как сделать все, кроме как скрыть линии, которые скрыты в каркас. Все вопросы здесь, касающиеся SO, предполагают, что у вас есть доступ к OpenGL, к сожалению, у меня нет доступа ни к чему подобному для DCPU-16 (или к любому виду аппаратного ускорения).
Я нашел довольно хорошее описание алгоритма Аппеля в Google Книгах . Однако есть одна проблема, с которой мне трудно разобраться.
Аппель определил контурную линию как ребро, разделенное лицевым и обратным многоугольником, или неразделенный край лицевого многоугольника, который не является частью замкнутого многогранника. Край, разделяемый двумя фронтальными многоугольниками, не вызывает изменения видимости и поэтому не является контурной линией. На рис. 8.4 ребра AB, EF, PC, GK и CH являются контурными линиями, а ребра ED, DC и GI - нет.
Я понимаю правила алгоритма и то, как он работает, если у вас есть контурные линии, однако я не понимаю, что мне нужно сделать, чтобы определить, является ли ребро " общим для лицевого и обратного многоугольника", или неразделенный край лицевого многоугольника, который не является частью замкнутого многогранника "с точки зрения кодирования. Я могу посмотреть на форму и узнать, какие линии являются контурными линиями в моей голове, но я понятия не имею, как перенести это «понимание» в кодированный алгоритм.
Обновить
Я добился определенного прогресса в определении контурных линий. Я нашел эти две лекционные заметки из курса Университета Буффало по компьютерной графике.
Рассмотрим края. Они делятся на три категории.
- Край, соединяющий две невидимые грани, сам по себе невидим. Это будет удалено из списка и проигнорировано.
- Кромка, соединяющая две потенциально видимые грани, называется материальной кромкой и требует дальнейшей обработки.
- Ребро, соединяющее потенциально видимую грань и невидимую грань, является частным случаем «материальной кромки» и также называется «контурной кромкой».
Используя две вышеупомянутые части информации, я могу приблизиться к возможности записать это как код, но мне еще предстоит пройти долгий путь.