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.
Wartości zakreślone rozpoczęciem każdej definicji linii konturu.
['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
@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
@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. –