我有一组等值点(或等高点),如下所示:
alt text http://www.rcad.eu/triang&isolines%20example1.jpg
等值线上的每个点都有各自的X,Y和Z坐标.由于它们是等值线,这意味着每个点将具有唯一的XY对,但同一条线上的点将具有相同的Z坐标.
现在,是否有任何算法或任何软件包(在C#或C++或MATLAB中)可用于将等值线点插入完整的三维表面?
P/S:我不仅对最终输出感兴趣,我对获取插值曲面数据感兴趣,以便我可以自己绘制曲面.
编辑: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');
请注意,两个结果之间几乎没有差异(至少在此比例下).还要注意,由于这些点处的轮廓数据的稀疏性,插值曲面在拐角附近具有空区域.