Matlab用于生成轮廓线的算法是什么?换句话说,它如何将网格上的关卡数据转换为一组线?
我想要的是:
我不需要有关底层代码的详细细节,但一般原则对我解释输出很有帮助。我在研究中使用contour
(和衍生物),并希望了解此步骤中引入的数值错误。
这看起来像一个非常简单的问题,但我在Matlab的文档中找不到解释,也没有在SO或其他网站上找到任何内容。如果它变得容易找到,我很抱歉。
答案 0 :(得分:5)
从MATLAB® - Graphics - R2012a,第5-73页到第5-76页:
轮廓算法
contourc
函数计算另一个的轮廓矩阵 轮廓功能。它是一个低级函数,不会被调用 命令行。轮廓算法首先确定哪个 绘制轮廓水平。如果您指定了输入向量v
,则v
的元素是轮廓级别值,length(v)
确定生成的轮廓水平数。如果你不 指定v
,算法选择的轮廓级别不超过20个 可以被2或5整除。高度矩阵
Z
具有关联的X
和Y
矩阵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
,cy
,c
和i
到等高线数据结构(矩阵 由轮廓函数返回,简称)。重新初始化
cx
,cy
和i
。移动到未标记的方格并进行测试 它的交叉边缘;当你在c
级别找到一个时,请重复 前面的操作。 a可存在任意数量的等高线 给定水平。清除所有标记,增加轮廓水平,和 重复,直到c
超过max(Z)
。正方形需要额外的逻辑 轮廓通过所有四个边(鞍点)到的地方 确定要连接的边对。contour
,contour3
和。{contourf
返回一个指定所有轮廓的双行矩阵 行:C = [ value1 xdata(1) xdata(2)... numv ydata(1) ydata(2)...]
开始每个轮廓定义的列的第一行 line包含由
v
指定并由其使用的轮廓值clabel
。在该值下面是(x,y)顶点的数量 等高线。剩余列包含(x,y)对的数据。 例如,由C = contour(peaks(3))
计算的轮廓矩阵 如下。带圆圈的值开始轮廓线的每个定义。
答案 1 :(得分:3)
你可以阅读有关游行广场的信息。 (https://en.wikipedia.org/wiki/Marching_squares)
通常,沿网格单元边缘执行线性插值,给出链接的轮廓点以形成折线。
当细胞太粗糙时,可以进行初步插值,例如双三次,以细化网格。