我有一组等值线点(或轮廓点),如:
alt text http://www.rcad.eu/triang&isolines%20example1.jpg
等值线上的每个点都有各自的X,Y和Z坐标.由于它们是等值线,所以这意味着每个点都将有一个唯一的X-Y对,但同一行上的点将具有相同的Z坐标.
现在,是否有任何算法或任何软件包(在C#或C或MATLAB中),我可以用来将等值线点内插到一个完整的三维表面?
P / S:我不仅对最终输出感兴趣,我有兴趣获得插值曲面数据,以便我可以自己绘制曲面.
编辑:C解决方案也受到欢迎.
解决方法
在MATLAB中,您可以使用
GRIDDATA或更高版本
TriScatteredInterp class.这两个都可以将规则间隔数据的曲面拟合到一组不均匀的点(尽管在较新的MATLAB版本中不再推荐GRIDDATA) .以下是如何使用每个:
> GRIDDATA:
[XI,YI,ZI] = griddata(x,y,z,XI,YI)
其中x,z各自表示每个点的笛卡尔坐标的矢量(在这种情况下是轮廓线上的点).行向量XI和列向量YI是GRIDDATA内插拟合表面的值ZI的笛卡尔坐标.对于矩阵XI,YI返回的新值与通过XI,YI到MESHGRID的结果相同,以创建一个统一的点格网.
> TriScatteredInterp类:
[XI,YI] = meshgrid(...); F = TriScatteredInterp(x(:),y(:),z(:)); ZI = F(XI,YI);
其中x,z再次表示每个点的笛卡尔坐标的向量,只有这一次我使用了colon reshaping operation(:)来确保每个都是列向量(TriScatteredInterp所需的格式).然后使用您必须使用MESHGRID创建的矩阵XI,YI来评估内插函数F.
示例&对照
以下是使用上述两种方法从轮廓数据重建曲面生成的一些示例代码及其生成的图形.使用CONTOUR功能生成轮廓数据:
% First plot: subplot(2,2,1); [X,Y,Z] = peaks; % Create a surface surf(X,Z); axis([-3 3 -3 3 -8 9]); title('Original'); % Second plot: subplot(2,2); [C,h] = contour(X,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)))]; Zc = [Zc C(1,index).*ones(1,C(2,index))]; index = index+1+C(2,index); end % Third plot: subplot(2,3); [XI,YI] = meshgrid(linspace(-3,3,21)); % Generate a uniform grid ZI = griddata(Xc,Yc,Zc,YI); % Interpolate surface surf(XI,ZI); axis([-3 3 -3 3 -8 9]); title('GRIDDATA reconstruction'); % Fourth plot: subplot(2,4); F = TriScatteredInterp(Xc(:),Yc(:),Zc(:)); % Generate interpolant ZIF = F(XI,YI); % Evaluate interpolant surf(XI,ZIF); axis([-3 3 -3 3 -8 9]); title('TriScatteredInterp reconstruction');
请注意,两个结果之间几乎没有区别(至少在这个尺度上).还要注意,由于在这些点的轮廓数据的稀疏性,内插表面在拐角附近有空区域.