2009-03-12 10 views
5

Obecnie pracuję nad projektem wizualizacji danych. Moim celem jest wytwarzanie linii konturu, innymi słowy iso-lines, z gridded data.Data może być temperaturą, danymi pogodowymi lub dowolnym rodzajem inne parametry środowiskowe, ale tylko warunek, musi być regularnie rozmieszczony. Szukałem w Internecie, jednak nie mogłem znaleźć dobrego algorytmu, pseudokodu lub kodu źródłowego do tworzenia linii konturowych z siatki. Czy ktoś zna bibliotekę, kod źródłowy lub algorytm do tworzenia linii konturu z danych gridowych? będzie dobrze, jeśli propozycja ma dobrą wydajność w czasie run, nie chcę czekać moje użytkownikom tyle :)Generowanie linii konturu z regularnie rozmieszczonych danych

Edit: Dzięki za odpowiedź, ale pewne ograniczenia co izolinie mają się jak nie powinno tak właśnie przecina generowanie krzywych Beziera nie osiąga mojego celu.

+0

Zobacz moją odpowiedź na http://stackoverflow.com/questions/3180401/net-open-source-contour-plotting/13296170 – ProfNimrod

Odpowiedz

1

W programie GNUplot dostępne są pewne dobre kontury, jeśli można użyć kodu GPL, który może pomóc.

4

Zobacz na to pytanie: How to approximate a vector contour from an elevation raster?

Jest to blisko duplikat, ale wykorzystuje zupełnie inną terminologią. Przekonasz się, że kartografia i grafika komputerowa rozwiązują wiele z tych samych problemów, ale używają dla nich innej terminologii.

+0

To jest duplikat. "dane gridded" <=> "dane rastrowe", "dane" <=> "elewacja" itp. –

0

Zgodnie z sugestią Paula Tomblina, krzywe Beziera (będące podzbiorem B-splajnów) są dojrzałym rozwiązaniem Twojego problemu. Jeśli wydajność środowiska wykonawczego jest problemem, krzywe Beziera mają dodatkową zaletę, że można je skonstruować za pomocą bardzo szybkiego algorytmu de Casteljau, zamiast rysować je zgodnie z równaniami parametrycznymi. Gdy nie masz szansy, że pracujesz z DirectX, ma on funkcję biblioteczną dla de Casteljau, ale nie powinno być wyzwaniem, aby samemu go przygotować, używając 1001 stron internetowych, które go opisują.

0

Jeśli dane są umieszczane w regularnych odstępach czasu, można to zrobić dość łatwo (zakładając, że rozumiem Twój problem poprawnie). Najpierw musisz określić, w jakim odstępie czasu chcesz mieć swoje kontury. Następnie utwórz siatkę, której będziesz używać do przechowywania informacji o konturze (zakładam, że jest to proste włączanie/wyłączanie lub elewacja w tym typie danych o poziomie konturu), który powinien być o jeden odstęp mniejszy niż dane źródłowe.

W tym przypadku chodzi o to, aby przesunąć 2 siatki o 1/2 przerwy (nie pojawi się w takim kodzie, ale jest to koncepcja, z którą mam do czynienia) i porównać 4 współrzędne otaczające bieżący punkt w siatce danych konturu, którą obliczasz. Jeśli którykolwiek z 4 punktów znajduje się w innym przedziale przedziału, wówczas ten "piksel" w siatce konturu powinien być ustawiony na wartość true (lub przekroczenie wartości zakresu konturu).

W przypadku tej metody wystąpi problem, gdy odstęp jest zbyt mały, co spowoduje nałożenie się kilku konturów na siebie.

Powiązane problemy