我有一组等值点(或轮廓点),例如:
alt text http://www.rcad.eu/triang&isolines%20example1.jpg
等值线上的每个点都有各自的X,Y和Z坐标。由于它们是等值线,这意味着每个点都将具有唯一的X-Y对,但同一条线上的点将具有相同的Z坐标。
现在,是否有任何算法或任何软件包(在C#或C ++或MATLAB中)可用于将等值线点插入完整的三维表面?
P / S:我不仅对最终输出感兴趣,我对获取插值曲面数据感兴趣,以便我可以自己绘制曲面。
编辑:C ++解决方案也受到欢迎。
答案 0 :(得分:13)
在MATLAB中,您可以使用函数griddata
或TriScatteredInterp
class(注意:从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
再次表示每个点的笛卡尔坐标向量,只有这次我使用了colon reshaping operation (:)
来确保每个都是列向量< / em>(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');
请注意,两个结果之间几乎没有差异(至少在此范围内)。另请注意,由于这些点处轮廓数据的稀疏性,插值曲面在角点附近有空区域。
答案 1 :(得分:3)
您可以使用MATLAB Central文件交换中的gridfit工具。我给出的一个例子正是你想要做的,从从等值线中取得的点列表开始,我从数据中重建了一个光滑的表面。事实上,我使用的例子来自地形图。
答案 2 :(得分:2)
我认为你想要的是“轮廓拼接”,例如在this paper中讨论的
答案 3 :(得分:0)
MATLAB有一个名为SURF的内置命令,它为X,Y,Z提供三个数组并绘制曲面。这可能就是你要找的东西。