LINUX.ORG.RU
ФорумTalks

[CG][Алгоритмы]Сглаживание полигонов

 


0

0

Итак, прошу уважаемых лорчан разработать алгоритм (отличная разминка для мозгов).

Имеется полигональная модель. Кто не вкурсе - полигон это пространственный многоугольник, ограниченный ребрами, состоящий из граней. Отличие грани от полигона - у грани всегда 3 вершины, у полигона может быть много (да, полигон может быть не плоским, а кривым)

Каждый полигон и вершина модели пронумерованы, каждое ребро также имеет численный ID (от 1 до их количества). Собственно можно считать, что номера никак не связаны. Полигону может быть присвоено несколько групп сглаживания. Ребро, находящееся между полигонами с хотя бы одной общей группой сглаживания, становится сглаженным. Ребро, находящееся между двумя полигонами не имеющими общих групп сглаживания, становится твердым.

Итак, задача - основываясь на заданном наборе ребер (допустим, ребра номер 1, 5, 8, 9, 10 и 12), которые должны быть твердыми, присвоить полигонам минимально возможное количество груп сглаживания.

Возможно - получить список ребер, принадлежащих полигону, полигонов ребру, полигонов вершине, вершин полигону, вершин ребру и ребер вершине.

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


>Кто не вкурсе - полигон это пространственный многоугольник, ограниченный ребрами, состоящий из граней.

ага, спасибо, а то ЛОР так бы никогда и не узнал...

k0l0b0k ★★
()

>>полигон это пространственный многоугольник, ограниченный ребрами, состоящий из граней. Отличие грани от полигона - у грани всегда 3 вершины, у полигона может быть много (да, полигон может быть не плоским, а кривым)

Из-под могилы Леонарда Эйлера доносятся глухие стоны.

mclaudt
()

> у грани всегда 3 вершины,

у полигона может быть много (да, полигон может быть не плоским, а кривым)


Суровая русская геометрия, чо.

melkor217 ★★★★★
()

Поверим условиям наслово, что решение существует, не проверяя их на консистентность. Работаем только с ребрами на границе «полигонов».

Обозначим «полигоны» буквами A, B, C..

Пронумеруем все ребра, которые должны сгладиться 1, 2, 3,... N Ребра, которые должны быть твердыми, начинаем нумеровать с N+1

Например, N = 14. Тогда, например, геометрия запишется (не проверял на консистентность, для схемы достаточно, также номера больше N опущены):

A: 3 5 6 7 8 11
B: 6 8 11
C: 3 5 7 12
D: 1 2 4 9 10 12 13 14
E: 1 2 4 
F: 9 10 13 14

Ищешь пару у которой наибольшее количество общих гладких ребер (D и F). Присваиваешь найденной паре и набору гладких ребер вспомогательный индекс 1. Вычеркиваешь у этих пар общие ребра (9 10 13 14) и повторяешь поиск. И т.д.

Получаешь ряд шагов:

1:  DF (9 10 13 14)
2:  AB (6 8 11)
.......
И т.д.
Теперь, казалось бы, можно каждому шагу назначить свою группу сглаживания.

Но это будет неоптимально, можно ещё уменьшить число групп, так как может оказаться, что если например, пара «полигонов» из шагов, например, 5 KL (блаблабла) не имеет ни одной общей твердой грани с парой, например, 8 FR (блаблабла), то можно порешить этих двух зайцев одной группой (если бы они имели хоть одну общую твердую грань, то этого сделать было бы нельзя, так как при назначении обеим парам одинаковой группы сглаживания она бы сгладилась). Поэтому делаем следующим образом.

Имеем список:

1 DF
2 AB
3 ...
100. CY
Назначаешь первой паре группу №1 и шерстишь остаток списка в поиске пар, которые не имеют с ней общих твердых граней, и тоже им назначаешь группу №1 и вычеркиваешь их. Далее первой паре из оставшегося списка назначаешь группу №2 и все повторяется. И т.д.

Все, че тут думать-то.

</thread>

mclaudt
()
Ответ на: комментарий от mclaudt

Это, конечно, для случая, когда набор твердых ребер необходим и достаточен, то есть всем неуказанным в условии твердости ребрам полагается обязательно быть мягкими.

mclaudt
()

>Отличие грани от полигона - у грани всегда 3 вершины

man треугольник

Siado ★★★★★
()
Ответ на: комментарий от oguretz

Ага, ну да, там чуток исправить вторую часть.

Имеем список:

1 DF
2 AB
3 ...
100 CY

Назначаешь первой паре группу №1 и шерстишь остаток списка, последовательно выбирая пары для приобщения к группе №1 так, чтобы результирующее множество «полигонов» из пар группы №1 в совокупности не имело ни одной общей твердой грани. Дойдя до конца, вычеркиваешь все эти пары, присвоенные первой группе. Далее уже первой паре из оставшегося списка назначаешь группу №2 и все повторяется. И т.д.

Все работает.

mclaudt
()
Ответ на: комментарий от oguretz

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

mclaudt
()
Ответ на: комментарий от mclaudt

Ага и для полного счастья там везде в объяснении нужно сделать

s/грань/ребро/g

Ибо после такого

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

моя словарная база сегфолтнулась и восстановлению не подлежит ;(

mclaudt
()
Ответ на: комментарий от mclaudt

>В чем рисовал, если сам?

блендер+гимп

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

Не понимаю, что за проблема распарсить это? Полигон может быть прямоугольным. Разбивается на 2 треугольника, ребро между которыми скрывается для удобства работы и сглаживания.

oguretz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.