三角形元素的 MeshGrid
MeshGrid for Triangle Elements
我想在我的板块中建立一个特定方面的 contourf
情节。该板分为三角形元素,我有三角形每个节点的坐标(x,y)。
那么,我怎样才能为我的结制作一个 meshgrid
以便我可以制作我的 contourf
情节?我有所有东西的坐标,并且在每个结中都有我的函数 Z
的值。 (我是 Matlab 的初学者,很抱歉这个 "basic" 问题)
如果您的目标只是可视化三角形,那么还有另一种可能更简单、更可靠的方法(请参阅本文结尾 post)。
如果您确实需要生成轮廓,那么您将需要在网格上插入三角网格。您可以为此使用 scatteredInterpolant
class(文档 here)。它采用 X 和 Y 参数或您的三角形顶点(结),以及每个参数的 Z 值,并创建一个 'function',您可以使用它来评估其他点。然后你创建一个网格,在网格上插入你的三角形网格,你可以将结果用于计数图。
scatteredInterpolanthave to be linear column vectors, so you will probably need to reshape them using the
(:)`表示法的输入。
所以让我们假设你有这样的三角数据
X = [1 4; 8 9];
Y = [2 3; 4 5];
Z = [0.3 42; 16 8];
你先算出范围的上限和下限
xlimits = minmax(X(:));
ylimits = minmax(Y(:));
其中 (:) 符号用于将 X 的所有元素排列在一个列中。
然后您可以创建一个跨越该范围的 meshgrid
。您需要决定该网格应该有多精细。
spacing = 1;
xqlinear = xlimits(1):spacing:xlimits(2);
yqlinear = ylimits(1):spacing:ylimits(2);
其中 linspace 生成一个值向量,从第一个值 (xlimits(1)
) 开始,到第三个值 (xlimits(2)
) 结束,并以 spacing
分隔。试验一下并查看结果,您将了解它是如何工作的。
这两个向量指定了每个维度中的网格位置。要制作一个实际的 meshgrid
风格的网格,您可以在它们
上调用 meshgrid
[XQ, YQ] = meshgrid(xqlinear, yqlinear);
这将产生两个点矩阵。 XQ
保存网格中每个点的 x 坐标,排列在同一个网格中。 YQ
保存 y 坐标。两者需要一起走。再次试验并查看结果,您将了解它是如何工作的。
那你就可以把它们都放在一起插值了:
F = scatteredInterpolant(X(:), Y(:), Z(:));
ZQ = F(XQ, YQ);
获取每个网格点的插值 ZQ
。然后您可以将这些数据发送到 contourf
contourf(XQ, YQ, ZQ);
如果轮廓太块状,您可能需要减小 spacing
值,这会在插值中创建更多点。如果您有大量数据,这可能会导致内存问题,因此请注意这一点。
如果您的目标只是查看三角形网格,那么您可能会发现 trimesh
可以满足您的要求,或者,根据您的数据已经表示的方式,scatter
。这些都将生成带有线框或点云的 3D 图,所以如果您需要等高线,插值是可行的方法。
我想在我的板块中建立一个特定方面的 contourf
情节。该板分为三角形元素,我有三角形每个节点的坐标(x,y)。
那么,我怎样才能为我的结制作一个 meshgrid
以便我可以制作我的 contourf
情节?我有所有东西的坐标,并且在每个结中都有我的函数 Z
的值。 (我是 Matlab 的初学者,很抱歉这个 "basic" 问题)
如果您的目标只是可视化三角形,那么还有另一种可能更简单、更可靠的方法(请参阅本文结尾 post)。
如果您确实需要生成轮廓,那么您将需要在网格上插入三角网格。您可以为此使用 scatteredInterpolant
class(文档 here)。它采用 X 和 Y 参数或您的三角形顶点(结),以及每个参数的 Z 值,并创建一个 'function',您可以使用它来评估其他点。然后你创建一个网格,在网格上插入你的三角形网格,你可以将结果用于计数图。
scatteredInterpolanthave to be linear column vectors, so you will probably need to reshape them using the
(:)`表示法的输入。
所以让我们假设你有这样的三角数据
X = [1 4; 8 9];
Y = [2 3; 4 5];
Z = [0.3 42; 16 8];
你先算出范围的上限和下限
xlimits = minmax(X(:));
ylimits = minmax(Y(:));
其中 (:) 符号用于将 X 的所有元素排列在一个列中。
然后您可以创建一个跨越该范围的 meshgrid
。您需要决定该网格应该有多精细。
spacing = 1;
xqlinear = xlimits(1):spacing:xlimits(2);
yqlinear = ylimits(1):spacing:ylimits(2);
其中 linspace 生成一个值向量,从第一个值 (xlimits(1)
) 开始,到第三个值 (xlimits(2)
) 结束,并以 spacing
分隔。试验一下并查看结果,您将了解它是如何工作的。
这两个向量指定了每个维度中的网格位置。要制作一个实际的 meshgrid
风格的网格,您可以在它们
meshgrid
[XQ, YQ] = meshgrid(xqlinear, yqlinear);
这将产生两个点矩阵。 XQ
保存网格中每个点的 x 坐标,排列在同一个网格中。 YQ
保存 y 坐标。两者需要一起走。再次试验并查看结果,您将了解它是如何工作的。
那你就可以把它们都放在一起插值了:
F = scatteredInterpolant(X(:), Y(:), Z(:));
ZQ = F(XQ, YQ);
获取每个网格点的插值 ZQ
。然后您可以将这些数据发送到 contourf
contourf(XQ, YQ, ZQ);
如果轮廓太块状,您可能需要减小 spacing
值,这会在插值中创建更多点。如果您有大量数据,这可能会导致内存问题,因此请注意这一点。
如果您的目标只是查看三角形网格,那么您可能会发现 trimesh
可以满足您的要求,或者,根据您的数据已经表示的方式,scatter
。这些都将生成带有线框或点云的 3D 图,所以如果您需要等高线,插值是可行的方法。