Як я можу виконати тест на трикутник всередині багатокутних сіток?


10

введіть тут опис зображення У мене (V1, V2, V3)на звичайній сітці трикутника вибрано 3 вершини . Для цих 3 вершин я обчислив між ними геодезичну відстань і шлях (використовуючи Дейкстру) і сформував поверхню, що нагадує трикутник, як на малюнку вище.

Тепер у мене є вершини, які лежать на кожному шляху і можуть обчислити геодезичні відстані від заданої вершини.

Що я хочу зробити, це отримати вершини чи трикутники, які лежать у районі, подібному до трикутника. Як я можу це зробити?


2
Якщо припустити, що барицентричний підхід робить те, що, на мою думку, це робиться, було б досить повільно з великими наборами. Уявіть набір із 9 мільйонів вершин із лише 9 вершинами у бажаному наборі. Чому ітерація всього набору, коли v1, v2 та v3 надають всю необхідну інформацію. Відповідь на заливку буде найшвидшим гнучким рішенням. Хоча негнучко, якщо ви можете припустити, що у геометрії є такі, як у вас зараз, тоді сканування було б найшвидшим підходом.
Ендрю Вілсон

Ви абсолютно праві в питаннях ефективності. Я хотів би використовувати такий підхід у великих сітках, тому те, що я шукаю, - це ефективний метод. Насправді я не знайомий ні з алгоритмами заповнення, ні з алгоритмами заливки скану, я роздивлюсь їх. Дякую.
mkocabas

3
Заливка графіка розпочнеться у вузлі, відвідайте кожен сусідній вузол, якщо гранична умова дотримана та не відвідувана, позначте її як відвідувану та повторіть (рекурсія). Поправка: позначте кожен вузол на шляху як відвіданий і почніть з вузла всередині набору. Потім просто використовуйте перевірку відвідування як граничну умову.
Ендрю Вілсон

Дякую за детальне пояснення. Я вважаю, що альго затоплення є більш розумним, але я хочу здійснити і лінію заливки, і розгортку, а потім порівняти показники.
mkocabas

Відповіді:


4

Існує альтернативний метод, який спирається на заливку. Спочатку розташуйте свої крайові дані в циклі, де краї утворюють петлю проти годинникової стрілки. Потім почніть з довільної точки на циклі та оберіть краї, що з'єднуються з цією точкою. Використовуйте вихідний граничний край і перетинайте його з іншим вихідним краєм, якщо він вказує у напрямку обличчя нормально, то це край повинен бути включений, якщо не відкинути його. Від цього краю продовжуйте, поки ви не потрапите на граничний край, після чого закінчите заливку. Продовжуйте продовжувати відвідувати граничну вершину краю, яка ще не відвідується.


Я не знайомий з алгоритмом заповнення заливів. Твоє пояснення мені здається трохи складним. Не могли б ви надати гідну посилання? Дякую.
mkocabas

Я отримав рішення, прочитавши деякі. Дякую.
mkocabas

3

Я вже коментував використання заливної заливки і як це було б краще, оскільки це гнучкіше, але іншим можливим рішенням є сканування. (Я кажу, що це можливо, оскільки це робить багато припущень щодо вашої геометрії, але для конкретного набору та багатьох подібних він би працював.)

Для вашого прикладу з 3 балами: Знайдіть вершину перетину від відрізка v1, v2 та лінії, на якій лежить v3. (Вершина ліворуч від v2) Ми будемо називати цю вершину v4.

For every vertex pair a,b down v1,v4 and v1,v3 
    For every vertex from a to b
        Mark as in the set
For every vertex pair a,b down v3,v2 and v4,v3
    For every vertex from a to b
        Mark as in the set

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

Це називається скануванням, оскільки (на зображенні вище) ви одночасно спускаєтесь по червоній та зеленій лініях, а потім червоні та сині лінії одночасно скануєте лінії в процесі руху.

Це рішення було б дуже швидким, якщо існує індексна схема, що часто буває. Інакше знадобиться розрахунок, щоб визначити, яка сусідня вершина лежить на прямій.

Найсмішніше - сканування, барицентричне тестування (у вікні, що обмежує трикутник), і заливка - це всі способи малювання трикутників у 3d-рендерінгу.


2

Я думаю, що ви можете обчислити деякі обмежені поверхнею барицентричні координати для кожної точки на поверхні, а потім використовувати їх для перевірки всередині або зовні трикутника.

У мене немає точного алгоритму під рукою, але я знайшов цей наступний документ, який, здається, обробляє саме такі координати.

Барицентричні координати на поверхнях


Дякуємо за відповідь та довідковий документ. Я спробую реалізувати запропонований метод.
mkocabas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.