2016-09-01 11 views
7

Jakiego algorytmu używa Matlab do generowania linii konturu? Innymi słowy, w jaki sposób przekształca dane poziomu na siatce w zestaw linii?W jaki sposób Matlab oblicza linie konturu?

Chciałbym to:

  • lokalnego kryterium do uzyskania punktów, które leżą na konturze?
  • globalna procedura przechwytywania wszystkich linii konturu?

Nie potrzebuję szczegółowych informacji na temat kodu źródłowego, ale ogólne zasady byłyby pomocne w interpretacji wyników. Używam contour (i pochodnych) w moich badaniach i chcę się dowiedzieć, jakie błędy numeryczne zostały wprowadzone w tym kroku.

Wygląda na bardzo proste pytanie, ale nie znalazłem wyjaśnienia w dokumentacji Matlab, ani nie znalazłem niczego na SO lub w innym miejscu w sieci. Przepraszam, jeśli okaże się łatwy do znalezienia.

+0

['contourc'] (http://www.mathworks.com/help/matlab/ref/contourc.html) to funkcja niższego poziomu używana przez' kontur', 'kontur3' i' konturf '. Jest to wbudowane, więc jest skompilowany kod i niewidoczne dla użytkownika. W dokumentacji wbudowanej w nowszych wersjach MATLAB nie ma żadnej dyskusji na temat algorytmu. Starsze wersje MATLAB mogą zawierać więcej szczegółów wbudowanych. – excaza

+0

@excaza dzięki za ten komentarz i listę tych powiązanych funkcji. Wiem o ich istnieniu, ale mogą być pomocne dla innych. Nie myślałem o szukaniu kodu, ale skoro jest skompilowany, to i tak by nie zadziałało. – tvo

+0

@tvo nie było mi łatwo znaleźć odpowiedź ;-) Ostatnia wersja na http://www.mathworks.com/help/pdf_doc/matlab/graphg.pdf pomija szczegóły dotyczące algorytmu. –

Odpowiedz

3

Z MATLAB® - Graphics - R2012a, strony 5-73 do strony 5-76:

Konturowanie Algorytm

Funkcja contourc oblicza matrycy konturu dla innych funkcji pochylni. Jest to funkcja niskiego poziomu, która nie jest wywoływana z wiersza poleceń od . Algorytm konturowania określa najpierw poziomy konturu do narysowania. Jeśli podasz wektor wejściowy v, elementy są wartościami poziomu konturu, a length(v) określa liczbę wygenerowanych poziomów konturu. Jeśli nie określić v, algorytm wybiera nie więcej niż 20 poziomów konturu są podzielne przez 2 lub 5.

Matryca wysokość Z jest związany X i Y matryce, które lokalizują każdej wartości w Z na skrzyżowaniu rzędu i kolumny, lub te macierze są wnioskowane, gdy są nieokreślone. Szerokość rzędu i kolumny może być różna, ale zazwyczaj są one stałe (to jest jest regularną siatką ). Przed wywołaniem contourc w celu interpolowania konturów, podkładki te są układane macierzą wysokości za pomocą dodatkowego wiersza lub kolumny na każdej krawędzi contourc. Przypisuje wartości z do dodanych komórek siatki, które są znacznie poniżej minimalnej wartości macierzy. Wyściełane wartości umożliwiają konturom zamknięcie na granicy macierzy, dzięki czemu można je wypełnić kolorem. Gdy contourc tworzy matrycę konturową, zastępuje ona współrzędne x, y zawierające niskie wartości z na NaN, aby zapobiec wyświetlaniu linii przechodzących wzdłuż krawędzi matrycy. Dlatego też macierze konturu zwracane przez czasami zawierają wartości NaN. Ustawia bieżący poziom, c, równy najniższemu poziomowi konturu, który ma być wykreślony w zakresie [min(Z) max(Z)]. Algorytm konturowania sprawdza każdą krawędź każdego kwadratu w siatce, aby sprawdzić, czy c zawiera się pomiędzy dwiema wartościami z dla punktów brzegowych. Jeśli tak, to kontur na tym poziomie przecina krawędź, a liniowa interpolacja jest wykonywana:

t=(c-Z0)/(Z1-Z0) 

Z0 jest wartość z w jednym punkcie krawędzi, a Z1 jest wartość z w innym punkcie krawędzi.

indeksowania start nowej linii konturu (i=1) dla klasy C przez interpolację x i y:

cx(i) = X0+t*(X1-X0) 
cy(i) = Y0+t*(Y1-Y0) 

chodzić wokół krawędzi kwadratu tylko wprowadzone; kontury kończą się na następnej krawędzi z wartościami z nawiasami c. Zwiększenie i, obliczenie t dla krawędzi, a następnie obliczyć cx(i) i cy(i), jak powyżej. Zaznacz plac jako odwiedzany. Kontynuuj sprawdzanie krawędzi każdego wprowadzonego kwadratu, aby określić krawędź wyjściową, dopóki linia() nie zamknie się w swoim punkcie początkowym lub nie wyjdzie z siatki. Jeżeli wprowadzony kwadrat jest już zaznaczony, linia konturu się tam zamyka. Skopiuj cx, cy, c i i do struktury danych linii konturu (macierz zwrócona przez funkcje konturowe, opisane krótko).

Reinitialize cx, cy i i. Przejdź do nieoznakowanego kwadratu i sprawdź jego krawędzie pod kątem przecięć; po znalezieniu go na poziomie c powtórz poprzednie operacje. Dowolna liczba linii konturu może istnieć dla danego poziomu na poziomie . Wyczyść wszystkie znaczniki, zwiększ poziom konturu i powtórzyć , aż c przekroczy wartość max(Z). Dla kwadratów potrzebna jest dodatkowa logika, w której kontur przechodzi przez wszystkie cztery krawędzie (punkty siodłowe) do określa, które pary krawędzi mają zostać połączone. contour, contour3 i contourf powrót matrycy dwurzędowa który określa wszystkie konturu linie:

C = [ value1 xdata(1) xdata(2)... 
     numv ydata(1) ydata(2)...] 

Pierwszy wiersz kolumny rozpoczyna każda definicja konturu linii zawiera wartość konturu, jak określono przez v i używane przez clabel. Pod tą wartością znajduje się liczba wierzchołków (x, y) w linii konturu . Pozostałe kolumny zawierają dane dla par (x, y). Na przykład macierz konturu obliczona przez C = contour(peaks(3)) jest następująca.

enter image description here

Wartości zakreślone rozpoczęciem każdej definicji linii konturu.

3

Możesz przeczytać o Marszowych Kwadratach. (https://en.wikipedia.org/wiki/Marching_squares)

Zazwyczaj interpolacja liniowa jest wykonywana wzdłuż krawędzi komórek siatki, dając punkty konturu, które można połączyć, tworząc polilinie.

Gdy komórki są zbyt grube, można wprowadzić wstępną interpolację, na przykład bicubiczną, aby zawęzić siatkę.

+0

Ale nie mam pojęcia, co właściwie używa Matlab. –

+0

+1 To świetne odniesienie. Zasadniczo stosowałbym to samo podejście, gdybym musiał opracować algorytm. Wydaje się prawdopodobne, że to właśnie wykorzystuje Matlab. Mógłbym prawdopodobnie sprawdzić, czy interpolacja liniowa z danych do linii konturu jest dokładna (do zaokrąglenia). Cóż, interpolacja "liniowa" Matlab jest w rzeczywistości dwuliniowa, ale nie powinno to mieć znaczenia wzdłuż krawędzi. Co myślisz? – tvo

+0

@tvo: o czym? –

Powiązane problemy