相互减去delaunay表面

时间:2016-12-07 17:01:11

标签: matlab delaunay

我有一个下面的代码表面和另一个由完全相同的代码创建的表面。我想在另一个数字中看到高度差异。我怎么能这样做?已经使用Minus操作员操作但这不起作用。

此外,矩阵的大小不一样!

感谢您的帮助!

x1 = Cx1;
y1 = Cy1;
z1 = Cz1;
tri1 = delaunay(x1,y1);


fig1 = figure%('units','normalized','outerposition',[0 0 1 1]);
trisurf(tri1,x2,y2,z2)
xlabel('x [mm] ','FontSize',30)
ylabel('y [mm] ','FontSize',30)
zlabel('z [mm] ','FontSize',30)

1 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是从一个网格插入另一个网格。当一个人比另一个人解决得更高时,或者当你不关心单个节点的结果,而是关注元素的整体模式时,这种方法很有效。如果情况并非如此,那么您有一个非常复杂的问题,因为您需要创建一个完全捕获两个三角测量的所有节点和边的多边形曲面。考虑以下一对三角形模式:

enter image description here

捕获所有变化的表面需要具有构成它们的所有顶点和边缘,这不是纯粹的三角形表面。所以,让我们假设更简单的情况。要将一个三角测量的结果映射到另一个三角测量,您只需要制定定义值如何沿三角形变化的函数,这些三角形更广泛地称为basis functions。通常假设三角形的节点(即顶点)之间的值沿三角形的表面线性变化。如果需要,您可以采用不同的方式,只需要定义新的基础函数。如果我们选择线性函数,那么2D中的方程非常简单。假设你创建一个数组trimap,其中包含另一个三角测量的每个顶点所在的三角形。 This can be accomplished using the info here。然后,我们将当前三角形的顶点坐标设置为(x1,y1),(x2,y2)和(x3,y3),然后进行数学运算:

for cnt1=1,npoints
  x1=x(tri1(trimap(cnt1),1));
  x2=x(tri1(trimap(cnt1),2));
  x3=x(tri1(trimap(cnt1),3));
  y1=y(tri1(trimap(cnt1),1));
  y2=y(tri1(trimap(cnt1),2));
  y3=y(tri1(trimap(cnt1),3));
  delta=x2*y3+x1*y2+x3*y1-x2*y1-x1*y3-x3*y2;
  delta1=(x2*y3-x3*y2+xstat(cnt1)*(y2-y3)+ystat(cnt1)*(x3-x2));
  delta2=(x3*y1-x1*y3+xstat(cnt1)*(y3-y1)+ystat(cnt1)*(x1-x3));
  delta3=(x1*y2-x2*y1+xstat(cnt1)*(y1-y2)+ystat(cnt1)*(x2-x1));
  weights(cnt1,1)=delta1/delta;
  weights(cnt1,2)=delta2/delta;
  weights(cnt1,3)=delta3/delta;
  z1=z(tri1(trimap(cnt1),1));
  z2=z(tri1(trimap(cnt1),2));
  z3=z(tri1(trimap(cnt1),3));
  valinterp(cnt1)=sum(weights(cnt1,:).*[z1,z2,z3]);
end

valinterp是每个点的插值。 Herehere是一些不错的幻灯片,解释了所有这些背后的数学原理。请注意,我没有测试任何此代码。另请注意,您需要执行一些操作以分配三角测量之外的值。也许是空值或反距离加权值。