Matlab如何计算轮廓线?

时间:2016-09-01 14:49:32

标签: algorithm matlab contour

Matlab用于生成轮廓线的算法是什么?换句话说,它如何将网格上的关卡数据转换为一组线?

我想要的是:

  • 获取位于轮廓上的点的局部标准?
  • 捕捉所有等高线的全局程序?

我不需要有关底层代码的详细细节,但一般原则对我解释输出很有帮助。我在研究中使用contour(和衍生物),并希望了解此步骤中引入的数值错误。

这看起来像一个非常简单的问题,但我在Matlab的文档中找不到解释,也没有在SO或其他网站上找到任何内容。如果它变得容易找到,我很抱歉。

2 个答案:

答案 0 :(得分:5)

MATLAB® - Graphics - R2012a,第5-73页到第5-76页:

  

轮廓算法

     

contourc函数计算另一个的轮廓矩阵   轮廓功能。它是一个低级函数,不会被调用   命令行。轮廓算法首先确定哪个   绘制轮廓水平。如果您指定了输入向量v,则   v的元素是轮廓级别值,length(v)   确定生成的轮廓水平数。如果你不   指定v,算法选择的轮廓级别不超过20个   可以被2或5整除。

     

高度矩阵Z具有关联的XY矩阵   Z中行和列交叉处的每个值,或者这些值   矩阵是在未指定时推断出来的。行和列   宽度可以变化,但通常它们是常数(即Z是a   常规网格)。在调用contourc插入轮廓之前,   contourf填充高度矩阵,每个都有一个额外的行或列   边缘。它将z值分配给远低于的添加的网格单元   矩阵的最小值。填充值使轮廓成为可能   靠近矩阵边界,以便它们可以填充颜色。   当contourc创建轮廓矩阵时,它会替换x,y   包含带有NaN的低z值的坐标以防止轮廓   从显示的矩阵边缘传递的线条。这就是为什么   contourf返回的轮廓矩阵有时包含NaN值。   将当前级别c设置为等于最低轮廓级别   绘制在[min(Z) max(Z)]范围内。轮廓算法   检查网格中每个方块的每个边缘,看看是否c介于两者之间   边缘点的两个z值。如果是这样,那个级别的轮廓   穿过边缘,并执行线性插值:

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

Z0是一个边缘点的z值,Z1是该值的z值   其他优势点。

     

通过插值开始为等级c索引新的等高线(i=1)   x和y:

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

走进刚刚进入的广场的边缘;轮廓退出   包含c的z值的下一个边。增加i,计算   t代表边缘,然后计算cx(i)cy(i),如上所述。标记   已经去过的广场。继续检查每个边缘   输入正方形以确定直到该行的出口边缘(cx,cy)   关闭其初始点或退出网格。如果广场正在   输入已经标记,轮廓线在那里关闭。复制cx,   cyci到等高线数据结构(矩阵   由轮廓函数返回,简称)。

     

重新初始化cxcyi。移动到未标记的方格并进行测试   它的交叉边缘;当你在c级别找到一个时,请重复   前面的操作。 a可存在任意数量的等高线   给定水平。清除所有标记,增加轮廓水平,和   重复,直到c超过max(Z)。正方形需要额外的逻辑   轮廓通过所有四个边(鞍点)到的地方   确定要连接的边对。 contourcontour3和。{   contourf返回一个指定所有轮廓的双行矩阵   行:

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

开始每个轮廓定义的列的第一行   line包含由v指定并由其使用的轮廓值   clabel。在该值下面是(x,y)顶点的数量   等高线。剩余列包含(x,y)对的数据。   例如,由C = contour(peaks(3))计算的轮廓矩阵   如下。

     

enter image description here

     

带圆圈的值开始轮廓线的每个定义。

答案 1 :(得分:3)

你可以阅读有关游行广场的信息。 (https://en.wikipedia.org/wiki/Marching_squares

通常,沿网格单元边缘执行线性插值,给出链接的轮廓点以形成折线。

当细胞太粗糙时,可以进行初步插值,例如双三次,以细化网格。