2012-02-28 9 views
19

Mam mapę wysokość 2D w formacieMapowanie mapę wysokość do sieci opartych na formacie konturu

06 36 39 42 43 55 ... 
37 40 43 43 45 46 ... 
40 43 44 45 46 48 ... 
44 44 46 47 48 50 ... 
41 44 45 47 48 48 ... 
... 

I muszę przemapować go w uśmiechu na podstawie formatu konturu (więc może być dalej odwzorowany w ikonek)

. . . . | . . 
. . . . \ . . 
. . .// . . 
. . . | . . . 
. . . | . . . 
./-/. . . 

tutaj . oznaczające obszar płaski, | i - proste skały, / i \ rogi urwiska (z których każda reprezentuje 2 różne możliwości).

Próbowałem już standardowego podejścia do kwadratu marszowego, ale okazało się, że próbkowanie tylko 3 sąsiadów prowadzi do wielu problemów z powodu przeciążenia sąsiadujących skrzynek. (Uwaga dodatkowa na miejscu klify prostych poniżej)

. . . . | . \ 
. . . . \ \ . 
. . .// - . 
. . . | - . . 
. . . | . . . 
./-/. . . 

Chciałbym, jest pewne odniesienia do algorytmów/zbliża się ofertę pomocy dla tego rodzaju rzeczy. Wiem, że chodzenie po konturze z jakąś głębią pierwszego wyszukiwania jest opcją, ale jeszcze jej nie wypróbowałem i wolałbym zostawić to jako ostatnią deskę ratunku. Pojawiają się również pytania o reprezentację niektórych cech, na przykład, czy należy uwzględnić grzbiety klifowe o grubości 1 elementu lub po prostu je zignorować. Inną opcją jest przejście przez wygenerowane kontury i zmiana ich tak, aby gładko pasowały do ​​siebie, ale to wydaje się naprawdę hacky ...

+0

Może wyjaśnisz nieco więcej swoich marszowych placów z 3 sąsiadami? Sądzę, że kwadraty maszerujące są idealne do renderowania zerowych przejść '(height_map - threshold)'. – YXD

+0

Marszowe skrzynie kwadratowe nadpisują się nawzajem, ustawiłem priorytet, aby upewnić się, że mieszkania nie nadpisują klifów, ale to nadal daje błędy. Progi stosowania są całkowicie w porządku, wybór prawidłowych przypadków jest problemem. Połowa czasu, gdy algorytm próbuje wykonać poprawną rzecz, a ja po prostu brakuje symboli reprezentacji, aby uzyskać jakikolwiek sens. – Sash

+0

jaka jest funkcja powiązania mapy wysokości 2D z mapą opartą na uśmiechu? Czy przypisujesz symbol w oparciu o numer zapisany na mapie, każdy symbol zależy również od sąsiadów? –

Odpowiedz

1

Utwórz funkcję interpolującą/najlepiej dopasowaną. Twój model powinien być wielomianem 2D (w x i y), którego stopień jest "prawidłowy": niezbyt wysoki, abyś wszystko zmieścił, ale nie za mały, abyś stracił szczegóły.

Masz teraz funkcję matematyczną, którą możesz wycinać, ustawiając f(x,y) = height. Rozwiązaniem tego równania jest kontur. Masz teraz dwie możliwości, w zależności od tego, czy możesz rozwiązać analitycznie, czy nie.

  • Zakładając, że nie można rozwiązać analitycznie, nadal można łatwo prześledzić przybliżenie krzywej:
    • Zacznij od kolorowania siatki biały i czarny jeśli f(x,y)>height jeśli f(x,y)<height. Zwróć uwagę na wszystkie obszary przejściowe, w których występuje przejście czarno-białe w przybliżeniu od < 1 siatka: są to kwadraty, w których znajduje się kontur.
    • Losowo wybierz kwadrat przejścia i wyszukaj w przybliżeniu < 1 promień siatki dla f(x,y)==height, aby znaleźć punkt na konturze. W tym momencie (niekoniecznie na siatce) obliczamy gradient ∇f(x,y) = (∂f/∂x, ∂f/∂y) ("wektor podjazdu"). Obracamy go o 90 stopni w dowolnym kierunku: (∂f/∂y, -∂f/∂x): w ten sposób wskazuje on wzdłuż konturu. Bardzo powoli (o wielkości kroku znacznie mniejszej niż siatka) prześledzimy kontur. To zabierze nas dookoła konturu.
    • Za każdym razem, gdy przechodzimy przez gridbox podczas tego śledzenia, oznaczamy go jako {|, -, /,} w zależności od czegoś w rodzaju kierunku wskazanego przez średnią gradientu. (Musimy również oznaczyć sąsiadów jako ., jeśli nie są jeszcze oznakowane, zobacz [].)
    • Należy pamiętać, że po tym mogą jeszcze pozostać skrzynie przejściowe! Na przykład, jeśli masz dwa wzgórza, wypełnisz jeden okrąg, ale kontur to dwa koła. Powtórz powyższą procedurę na innym losowym (nieoznaczonym) gridboku "przejścia" (dlatego potrzebowaliśmy [*], lub możemy naprawić u sąsiadów miejsc, które już uwzględniliśmy).Powtarzaj tę czynność, dopóki nie będzie już nieoznakowanych "skrzynek" przejściowych.
    • Zrób to dla każdego poziomu height, który chcesz narysować jako kontur, i gotowe.
  • Być może uda się analitycznie rozwiązać, tak jak w przypadku sekcji stożkowych, ale prawdopodobnie nie jest to prawdopodobne i wykracza poza zakres tego pytania. Jeśli można rozwiązać na krzywej, można „gridify” go przy użyciu różnych technik (np parametryzacji, a potem wzdłuż konturu przy użyciu rozmiary etap może pół-a-siatki, odnotowując najbliższymi sąsiadami)

(Jeśli jeden z twoich konturów zachodzi na inny, odstęp pomiędzy wysokościami konturów jest zbyt mały.Jeśli nie jesteś zadowolony z danego konturu, zestaw możliwości {-, |, /,} jest zbyt mały.)

+0

Myślę, że najlepiej pasuje funkcja będzie bardzo wrażliwy na kolejność swoich punktów. Jeśli wszystkie znajdują się na linii (unikalne współrzędne X), to jest w porządku, ale jeśli jest to kształt konturu zamyka, to nie zadziała. –

+0

@WouterLievens: Nigdy nie zasugerowałem funkcji najlepszego dopasowania; to byłoby złe. W pierwszym akapicie sugerowałem, że powinien wybrać "wielomian dwuwymiarowy, którego stopień jest" właściwy ": niezbyt wysoki, że wszystko przejmiesz, ale nie za nisko, abyś stracił szczegóły". – ninjagecko

+0

Rozumiem to. Po prostu nie rozumiem, jak posortujesz punkty. Jeśli potrafi je posortować, równie dobrze może połączyć kropki i wygładzić je. –

Powiązane problemy