Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何从等值线生成3-D曲面?

我有一组等值线点(或轮廓点),例如:

替代文字http://www.rcad.eu/triang&isolines%20example1.jpg

等值线上的每个点都有自己的X,Y和Z坐标。由于它们是等值线,这意味着每个点将具有唯一的XY对,但是同一条线上的点将具有相同的Z坐标。

现在,我是否可以使用任何算法或任何软件包(在C#,C ++或MATLAB中)将等值线点插入到完整的3D曲面中?

P / S:我不仅对最终输出感兴趣,而且对获取插值曲面数据感兴趣,以便可以自己绘制曲面。

编辑:C ++解决方案也受到欢迎。


回答:
在MATLAB中您可以使用该功能griddataTriScatteredInterp类 (注:如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');

请注意,两个结果之间的差异很小(至少在此范围内)。还要注意,由于这些点处轮廓数据的稀疏性,所以插值曲面在拐角附近具有空区域。



更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 03:00


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.