Matlab如何计算等高线?
How does Matlab calculate contour lines?
Matlab生成等高线的算法是什么?也就是说,它是如何将网格上的关卡数据转化为一组线的?
我想要的是:
- 获取轮廓上点的局部标准?
- 捕获所有条轮廓线的全局程序?
我不需要有关底层代码的详细细节,但一般原则将有助于我解释输出。我在我的研究中使用 contour
(和导数),并想了解在这一步中引入的数值错误。
看起来是个很简单的问题,但是我在Matlab的文档中找不到解释,在SO或网络上的其他地方也找不到任何内容。不好意思,毕竟转起来容易找。
您可以阅读有关游行广场的内容。 (https://en.wikipedia.org/wiki/Marching_squares)
通常,沿着网格单元边缘执行线性插值,给出轮廓点,您 link 形成多段线。
当单元格太粗糙时,可以进行初步插值,例如双三次插值,以细化网格。
从 MATLAB® - Graphics - R2012a,从第 5-73 页到第 5-76 页:
The Contouring Algorithm
The contourc
function calculates the contour matrix for the other
contour functions. It is a low-level function that is not called from
the command line. The contouring algorithm first determines which
contour levels to draw. If you specified the input vector v
, the
elements of v
are the contour level values, and length(v)
determines the number of contour levels generated. If you do not
specify v
, the algorithm chooses no more than 20 contour levels that
are divisible by 2 or 5.
The height matrix Z
has associated X
and Y
matrices that locate
each value in Z
at the intersection of a row and a column, or these
matrices are inferred when they are unspecified. The row and column
widths can vary, but typically they are constant (i.e., Z
is a
regular grid). Before calling contourc
to interpolate contours,
contourf
pads the height matrix with an extra row or column on each
edge. It assigns z-values to the added grid cells that are well below
the minimum value of the matrix. The padded values enable contours to
close at the matrix boundary so that they can be filled with color.
When contourc
creates the contour matrix, it replaces the x,y
coordinates containing the low z-values with NaNs to prevent contour
lines that pass along matrix edges from being displayed. This is why
contour matrices returned by contourf
sometimes contain NaN values.
Set the current level, c
, equal to the lowest contour level to be
plotted within the range [min(Z) max(Z)]
. The contouring algorithm
checks each edge of every square in the grid to see if c
is between
the two z values for the edge points. If so, a contour at that level
crosses the edge, and a linear interpolation is performed:
t=(c-Z0)/(Z1-Z0)
Z0
is the z value at one edge point, and Z1
is the z value at the
other edge point.
Start indexing a new contour line (i=1
) for level c by interpolating
x and y:
cx(i) = X0+t*(X1-X0)
cy(i) = Y0+t*(Y1-Y0)
Walk around the edges of the square just entered; the contour exits at
the next edge with z values that bracket c
. Increment i
, compute
t
for the edge, and then compute cx(i)
and cy(i)
, as above. Mark
the square as having been visited. Keep checking the edges of each
square entered to determine the exit edge until the line(cx,cy
)
closes on its initial point or exits the grid. If the square being
entered is already marked, the contour line closes there. Copy cx
,
cy
, c
, and i
to the contour line data structure (the matrix
returned by contouring functions, described shortly).
Reinitialize cx
, cy
, and i
. Move to an unmarked square and test
its edges for intersections; when you find one at level c
, repeat
the preceding operations. Any number of contour lines can exist for a
given level. Clear all the markers, increment the contour level, and
repeat until c
exceeds max(Z)
. Extra logic is needed for squares
where a contour passes through all four edges (saddle points) to
determine which pairs of edges to connect. contour
, contour3
, and
contourf
return a two-row matrix that specifies all the contour
lines:
C = [ value1 xdata(1) xdata(2)...
numv ydata(1) ydata(2)...]
The first row of the column that begins each definition of a contour
line contains the contour value, as specified by v
and used by
clabel
. Beneath that value is the number of (x,y) vertices in the
contour line. Remaining columns contain the data for the (x,y) pairs.
For example, the contour matrix calculated by C = contour(peaks(3))
is as follows.
The circled values begin each definition of a contour line.
Matlab生成等高线的算法是什么?也就是说,它是如何将网格上的关卡数据转化为一组线的?
我想要的是:
- 获取轮廓上点的局部标准?
- 捕获所有条轮廓线的全局程序?
我不需要有关底层代码的详细细节,但一般原则将有助于我解释输出。我在我的研究中使用 contour
(和导数),并想了解在这一步中引入的数值错误。
看起来是个很简单的问题,但是我在Matlab的文档中找不到解释,在SO或网络上的其他地方也找不到任何内容。不好意思,毕竟转起来容易找。
您可以阅读有关游行广场的内容。 (https://en.wikipedia.org/wiki/Marching_squares)
通常,沿着网格单元边缘执行线性插值,给出轮廓点,您 link 形成多段线。
当单元格太粗糙时,可以进行初步插值,例如双三次插值,以细化网格。
从 MATLAB® - Graphics - R2012a,从第 5-73 页到第 5-76 页:
The Contouring Algorithm
The
contourc
function calculates the contour matrix for the other contour functions. It is a low-level function that is not called from the command line. The contouring algorithm first determines which contour levels to draw. If you specified the input vectorv
, the elements ofv
are the contour level values, andlength(v)
determines the number of contour levels generated. If you do not specifyv
, the algorithm chooses no more than 20 contour levels that are divisible by 2 or 5.The height matrix
Z
has associatedX
andY
matrices that locate each value inZ
at the intersection of a row and a column, or these matrices are inferred when they are unspecified. The row and column widths can vary, but typically they are constant (i.e.,Z
is a regular grid). Before callingcontourc
to interpolate contours,contourf
pads the height matrix with an extra row or column on each edge. It assigns z-values to the added grid cells that are well below the minimum value of the matrix. The padded values enable contours to close at the matrix boundary so that they can be filled with color. Whencontourc
creates the contour matrix, it replaces the x,y coordinates containing the low z-values with NaNs to prevent contour lines that pass along matrix edges from being displayed. This is why contour matrices returned bycontourf
sometimes contain NaN values. Set the current level,c
, equal to the lowest contour level to be plotted within the range[min(Z) max(Z)]
. The contouring algorithm checks each edge of every square in the grid to see ifc
is between the two z values for the edge points. If so, a contour at that level crosses the edge, and a linear interpolation is performed:t=(c-Z0)/(Z1-Z0)
Z0
is the z value at one edge point, andZ1
is the z value at the other edge point.Start indexing a new contour line (
i=1
) for level c by interpolating x and y:cx(i) = X0+t*(X1-X0) cy(i) = Y0+t*(Y1-Y0)
Walk around the edges of the square just entered; the contour exits at the next edge with z values that bracket
c
. Incrementi
, computet
for the edge, and then computecx(i)
andcy(i)
, as above. Mark the square as having been visited. Keep checking the edges of each square entered to determine the exit edge until the line(cx,cy
) closes on its initial point or exits the grid. If the square being entered is already marked, the contour line closes there. Copycx
,cy
,c
, andi
to the contour line data structure (the matrix returned by contouring functions, described shortly).Reinitialize
cx
,cy
, andi
. Move to an unmarked square and test its edges for intersections; when you find one at levelc
, repeat the preceding operations. Any number of contour lines can exist for a given level. Clear all the markers, increment the contour level, and repeat untilc
exceedsmax(Z)
. Extra logic is needed for squares where a contour passes through all four edges (saddle points) to determine which pairs of edges to connect.contour
,contour3
, andcontourf
return a two-row matrix that specifies all the contour lines:C = [ value1 xdata(1) xdata(2)... numv ydata(1) ydata(2)...]
The first row of the column that begins each definition of a contour line contains the contour value, as specified by
v
and used byclabel
. Beneath that value is the number of (x,y) vertices in the contour line. Remaining columns contain the data for the (x,y) pairs. For example, the contour matrix calculated byC = contour(peaks(3))
is as follows.
The circled values begin each definition of a contour line.