我有一组等值线点(或轮廓点),例如:
替代文字http://www.rcad.eu/triang&isolines%20example1.jpg
等值线上的每个点都有自己的X,Y和Z坐标。由于它们是等值线,这意味着每个点将具有唯一的XY对,但是同一条线上的点将具有相同的Z坐标。
现在,我是否可以使用任何算法或任何软件包(在C#,C ++或MATLAB中)将等值线点插入到完整的3D曲面中?
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的必需格式)。然后使用必须使用meshgrid创建的矩阵XI,YI评估插值F
示例与比较
这是一些示例代码及其生成的图形,用于使用上述两种方法从轮廓数据重建曲面。轮廓数据是使用
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');
请注意,两个结果之间的差异很小(至少在此范围内)。还要注意,由于这些点处轮廓数据的稀疏性,所以插值曲面在拐角附近具有空区域。
更多&回答...