题
我有一组等值线点(或轮廓点),如下所示:
替代文本 http://www.rcad.eu/triang&isolines%20example1.jpg
等值线上的每个点都有其各自的 X、Y 和 Z 坐标。由于它们是等值线,这意味着每个点将具有唯一的 X-Y 对,但同一条线上的点将具有相同的 Z 坐标。
现在,是否有任何算法或任何软件包(C# 或 C++ 或 MATLAB 语言)可以用来将等值线点插值到完整的 3-D 表面中?
备注:我不仅对最终输出感兴趣,而且对获取插值曲面数据感兴趣,以便我可以自己绘制曲面。
编辑:C++ 解决方案也受到欢迎。
解决方案
在 MATLAB 中,您可以使用以下函数 griddata
或者 TriScatteredInterp
班级 (笔记:自 R2013a 起 scatteredInterpolant
是推荐的替代方案)。这两个都允许您将规则间隔的数据表面拟合到一组非均匀间隔的点(尽管看起来 griddata
在较新的 MATLAB 版本中不再推荐)。下面介绍了如何使用它们:
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');
请注意,两个结果之间几乎没有差异(至少在这个范围内)。另请注意,由于这些点处轮廓数据的稀疏性,插值曲面在拐角附近有空白区域。
其他提示
您可以使用 gridfit 工具,在发现MATLAB中央文件交换。有一个问题我给的例子正是你想做的事,从等值线取点的列表开始的,我从数据重建光滑的表面。事实上,我使用的示例中被带到从地形图。
我想你想被称为“轮廓拼接”的东西,例如在的本文
MATLAB具有一个内置的称为命令 SURF 一>会利用为X,Y,Z三个阵列,并绘制一个表面。这可能是你在找什么。