2009-01-02 26 views
26

Szukam algorytmu lub biblioteki (lepiej), aby rozbić wielokąt na trójkąty. Będę używał tych trójkątów w aplikacji Direct3D. Jakie są najlepsze dostępne opcje?Triangulacja wielokątna z otworami

Oto co znalazłem do tej pory:

  1. Ben Discoe's notes
  2. FIST: Fast Industrial-Strength Triangulation of Polygons
  3. wiem, że CGAL zapewnia triangulacji ale nie jestem pewien, czy obsługuje otwory.

Byłbym bardzo wdzięczny za opinie osób, które wcześniej miały doświadczenie w tej dziedzinie.

Edytuj: To jest wielobok 2D.

+0

Czy potrzebujesz 2D (trójkąty) lub 3D (czworościan)? –

+0

To jest wielobok 2D –

Odpowiedz

18

Jonathan Shewchuk's jest fenomenalny; Używałem go do automatyzacji triangulacji w przeszłości. Możesz poprosić o próbę uniknięcia małych/wąskich trójkątów itp., Więc wymyślisz "dobre" triangulacje, zamiast tylko triangulacji.

+0

Mogę potwierdzić, że Trójkąt jest naprawdę świetnym narzędziem. Zdobył również prestiżową "Nagrodę J. H. Wilkinsona dla oprogramowania numerycznego", przyznawaną tylko raz na 4 lata. – batty

+0

Zmieniając wybraną odpowiedź na tę, ponieważ faktycznie to mam. –

+0

Jedną z największych zalet jest to, że Triangle bardzo ułatwia tworzenie oddzielnych buforów wierzchołków i indeksów triangulacji. Kocham to! –

2

Możesz stosunkowo łatwo dodać otwory. Zasadniczo trianguluj do wypukłego kadłuba punktów wejściowych, zgodnie z CGAL, a następnie usuń dowolny trójkąt, którego motyw znajduje się wewnątrz dowolnego z wielokątów otworów (lub poza dowolnymi zewnętrznymi granicami). Gdy mamy do czynienia z dużą ilością dziur w dużym zbiorze danych, można zastosować techniki maskowania, aby znacznie przyspieszyć ten proces.

edycja: Powszechnym rozszerzeniem tej techniki jest słabe trójkąty chwastów na kadłubie, gdzie najdłuższa krawędź lub najmniejszy kąt wewnętrzny przekracza daną wartość. To utworzy lepszy wklęsły kadłub.

+1

To podejście nie działa: musisz użyć ograniczonej triangulacji, w przeciwnym razie możesz napotkać trójkąty, które są częściowo w środku i częściowo poza otworem. – Camille

+0

@camille - trójkąt trójkątny z dziurami jest zawsze ograniczony. Krawędzie i otwory wielokątów są z definicji ograniczeniami.Jeśli krawędź trójkąta przekroczyłaby otwór, otwór byłby częściowo zakryty. Gdyby przekroczył krawędź wieloboku, numer NIP nie byłby triangulacją tego wielokąta. –

11

CGAL posiada narzędzia potrzebne: Constrained Triangulations

Możesz po prostu dostarczyć granice swojej wielokąta (incuding granice otworów) jako ograniczeń (najlepiej byłoby, aby wstawić wszystkie wierzchołki, a następnie określić ograniczenia jako pary Vertex_handles).

Następnie można oznaczyć trójkąty trójkąta za pomocą dowolnego algorytmu traversal: zacznij od trójkąta padającego na nieskończony wierzchołek i oznacz go jako znajdującego się na zewnątrz, a za każdym razem, gdy przekraczasz ograniczenie, przełącz na przeciwną etykietę (w środku, jeśli poprzednio oznaczałeś trójkąty jako outsider, na zewnątrz, jeśli wcześniej oznaczałeś trójkąty jako poufne).

+0

Jest to wystarczająco dobre rozwiązanie dla prostych spraw. Tam, gdzie masz zachodzące na siebie otwory i dziury w dziurach, przewraca się. Wolę mieć wyraźne wewnętrzne i zewnętrzne granice. –

+1

Jeśli masz zachodzące na siebie otwory, powinieneś zachować listę otworów, do których już wszedłeś (zamiast tylko znacznika wewnętrznego/zewnętrznego). Poza tym jest dokładnie tak samo. – Camille

+0

"za każdym razem, gdy przekraczasz ograniczenie"? Jak mogę to rozgryźć? –

17

podać kilka więcej możliwości bibliotek tam:

Polyboolean. Nigdy tego nie próbowałem, ale wygląda obiecująco: http://www.complex-a5.ru/polyboolean/index.html

Ogólny klips do wielokąta. Ta działa bardzo dobrze w praktyce i ma triangulację, a także wycinanie i dziurawienie otworów: http://www.cs.man.ac.uk/~toby/alan/software/

Moja osobista rekomendacja: Użyj tesselation z GLU (OpenGL Utility Library). Kod jest solidny, szybszy niż GPC i generuje mniej trójkątów. Nie potrzebujesz zainicjowanego uchwytu OpenGL lub czegoś podobnego, aby użyć biblioteki.

Jeśli nie podoba ci się pomysł włączenia biblioteki systemowej OpenGL do aplikacji DirectX, istnieje również rozwiązanie: wystarczy pobrać kod implementacyjny SGI OpenGL i podnieść z niego triangulator. Po prostu używa nazw OpenGL-Typedef i rozdania pełnego wyrażeń. to jest to! Możesz wyodrębnić kod i utworzyć samodzielną bibliotekę w ciągu godziny lub dwóch.


Generalnie moja rada byłaby taka, żeby używać czegoś, co działa, i nie zaczynam pisać własnej triangulacji.

Kusi, aby rzucić się na własną rękę, jeśli przeczytałeś o algorytmie przycinania uszu lub algorytmu liniowego, ale faktem jest, że algorytmy geometrii obliczeniowej są niewiarygodnie trudne do napisania w sposób, który działa stabilnie, nigdy się nie psuje i zawsze zwraca znaczący wynik. Numeryczne błędy zaokrąglania będą kumulować się i zabić cię w końcu.

Napisałem algorytm triangulacji w C dla firmy, w której pracuję. Sprawdzenie działania algorytmu trwało dwa dni. Praca z różnymi zdegenerowanymi danymi wejściowymi zajęła kolejne dwa lata (nie pracowałem na pełnym etacie, ale zaufaj mi - spędziłem na nim więcej czasu niż powinienem).

+0

Napisałem wszystkie moje własne numery TIN, i zgadzam się w 100% z wieloma zdegenerowanymi przypadkami. Nigdy nie przenosiłbym się z moich własnych bibliotek z tego powodu. Niektóre nowsze książki CG są świetne. –

1

Jest to powszechny problem w analizie elementów skończonych. Nazywa się to "automatycznym generowaniem siatki". Wyszukiwarka Google znalazła this site z linkami do komercyjnego i oprogramowania open source. Zwykle zakładają jakiś rodzaj reprezentacji CAD geometrii, aby rozpocząć.

0

Innym rozwiązaniem (z bardzo elastycznej licencji) jest do portu algorytm z VTK:

vtkDelaunay2D

Algorytm ten działa dość dobrze. Korzystanie z niego bezpośrednio jest możliwe, ale wymaga linków do VTK, który może mieć więcej narzutów, niż chcesz (chociaż ma również wiele innych fajnych funkcji).

Obsługuje ograniczenia (otwory/granice/etc), jak również triangulację powierzchni niekoniecznie na płaszczyźnie XY. Obsługuje również niektóre funkcje, których nie widziałem gdzie indziej (patrz uwagi na temat wartości Alpha).

5

Znalazłem bibliotekę poly2tri jako dokładnie to, czego potrzebowałem do triangulacji. Tworzy znacznie czystszą siatkę niż inne biblioteki, które wypróbowałem (w tym libtess) i obsługuje również dziury. Został przekształcony w kilka języków. Licencja to New BSD, dzięki czemu można jej używać w dowolnym projekcie.

Poly2tri library on Google Code

+2

Znalazłem dla siebie, to bardzo mocno zawiesza się. – SAKrisT

0

I wprowadziły wielokąt 3D triangulator w C# za pomocą metody obcinania uszu. Jest łatwy w użyciu, obsługuje otwory, jest wytrzymały i obsługuje aramidowe (nie przecinające się) wypukłe/nie wypukłe wielokąty.