我有一组等值线点(或轮廓点),例如:
等值线上的每个点都有其各自的 X、Y 和 Z 坐标。由于它们是等值线,这意味着每个点将具有唯一的 XY 对,但同一条线上的点将具有相同的 Z 坐标。
现在,是否有任何算法或任何软件包(在 C#、C++ 或 MATLAB 中)可用于将等值线点插入完整的 3-D 表面?
P/S:我不仅对最终输出感兴趣,我对获取插值的表面数据感兴趣,这样我就可以自己绘制表面。
编辑:也欢迎 C++ 解决方案。
我有一组等值线点(或轮廓点),例如:
等值线上的每个点都有其各自的 X、Y 和 Z 坐标。由于它们是等值线,这意味着每个点将具有唯一的 XY 对,但同一条线上的点将具有相同的 Z 坐标。
现在,是否有任何算法或任何软件包(在 C#、C++ 或 MATLAB 中)可用于将等值线点插入完整的 3-D 表面?
P/S:我不仅对最终输出感兴趣,我对获取插值的表面数据感兴趣,这样我就可以自己绘制表面。
编辑:也欢迎 C++ 解决方案。
在 MATLAB 中,您可以使用函数griddata
或TriScatteredInterp
类(注意:从 R2013a 开始scatteredInterpolant
,推荐使用替代方法)。这两种方法都允许您将规则间隔数据的表面拟合到一组非均匀间隔的点(尽管在较新的 MATLAB 版本中似乎griddata
不再推荐使用它)。以下是您可以如何使用每个:
griddata
:
[XI,YI,ZI] = griddata(x,y,z,XI,YI)
其中x,y,z
每个表示每个点的笛卡尔坐标向量(在这种情况下是轮廓线上的点)。行向量XI
和列向量YI
是griddata
插值ZI
拟合曲面值的笛卡尔坐标。为矩阵返回的新值与传递到XI,YI
的结果相同,以创建统一的点网格。XI,YI
meshgrid
TriScatteredInterp
班级:
[XI,YI] = meshgrid(...);
F = TriScatteredInterp(x(:),y(:),z(:));
ZI = F(XI,YI);
其中x,y,z
再次表示每个点的笛卡尔坐标向量,只是这次我使用了冒号整形操作 (:)
来确保每个都是列向量( 所需的格式TriScatteredInterp
)。然后使用必须使用创建F
的矩阵评估插值。XI,YI
meshgrid
这是一些示例代码及其生成的结果图,用于使用上述两种方法从轮廓数据重建表面。contour
使用以下函数生成轮廓数据:
% First plot:
subplot(2,2,1);
[X,Y,Z] = peaks; % Create a surface
surf(X,Y,Z);
axis([-3 3 -3 3 -8 9]);
title('Original');
% Second plot:
subplot(2,2,2);
[C,h] = contour(X,Y,Z); % Create the contours
title('Contour map');
% Format the coordinate data for the contours:
Xc = [];
Yc = [];
Zc = [];
index = 1;
while index < size(C,2)
Xc = [Xc C(1,(index+1):(index+C(2,index)))];
Yc = [Yc C(2,(index+1):(index+C(2,index)))];
Zc = [Zc C(1,index).*ones(1,C(2,index))];
index = index+1+C(2,index);
end
% Third plot:
subplot(2,2,3);
[XI,YI] = meshgrid(linspace(-3,3,21)); % Generate a uniform grid
ZI = griddata(Xc,Yc,Zc,XI,YI); % Interpolate surface
surf(XI,YI,ZI);
axis([-3 3 -3 3 -8 9]);
title('GRIDDATA reconstruction');
% Fourth plot:
subplot(2,2,4);
F = TriScatteredInterp(Xc(:),Yc(:),Zc(:)); % Generate interpolant
ZIF = F(XI,YI); % Evaluate interpolant
surf(XI,YI,ZIF);
axis([-3 3 -3 3 -8 9]);
title('TriScatteredInterp reconstruction');
请注意,两个结果之间几乎没有差异(至少在这个规模上)。另请注意,由于这些点处轮廓数据的稀疏性,插值曲面在拐角附近具有空白区域。
您可以使用MATLAB Central 文件交换中的gridfit工具。我给出的一个例子正是你想要做的,从从等值线上获取的点列表开始,我从数据中重建一个光滑的表面。实际上,我使用的示例取自地形图。
我认为您想要的称为“轮廓拼接”,例如本文中讨论的
MATLAB 有一个名为SURF的内置命令,它采用三个数组表示 X、Y、Z 并绘制一个曲面。这可能是您正在寻找的东西。