2010-03-22 49 views
4

我一直在绞尽脑汁想出一个解决这个问题的方法。基于离散高度函数的网格内点的插值高度

Point P inside a grid square. http://i41.tinypic.com/8yz1g6.png

我有用于在网格上的各点(X,Z)返回高度值的查找表。例如,我可以计算图1中A,B,C和D处的高度。但是,我正在寻找一种方法来插入P(已知(x,z))处的高度。查找表只有网格间隔的值,P位于这些间隔之间。我试图计算值小号使得:

A '(S)= A + 小号(CA) B'(T)= B (PB)

然后,我会使用这两个方程来找到B'(t)与A'(s)的交点以找到线AC上的一个点X.有了这个,我可以计算出这个点的高度X以及点P的高度。

我的问题在于计算s和t的值。

任何帮助将不胜感激。

+0

这是重心坐标测试吗? – tzenes 2010-03-22 17:29:21

+0

如果ABC和ADC是独立的三角形,或者是否希望实际插值四边形ABCD,您是否想获得点P的高度值?两种操作都没有给出相同的结果。 – Coincoin 2010-03-22 17:31:20

+0

我想要做的是首先确定哪个三角形P在,然后插入与ABC或ADC点相关的高度。 – fastrack20 2010-03-22 17:43:23

回答

1

根据是否要在ABC或ABCD之间插值,算法会改变。为了在ABC之间进行插值(我们假设您自从您绘制对角线后想要做的事情),您需要找到P相对于ABC x和y位置的重心坐标,然后将重心坐标应用于高度( z在这里假设)这些三角形的组成部分。

1

什么会是这样的:找到uv,使

P = B + u(A-B) + v(C-B) 

如果你写了这一点,你会看到,这是未知数一个2x2的线性系统uv,所以我想你知道如何从那里继续。

哦,一旦你有uv你使用与上面相同的精确公式作为高度,只有这个时候A,B,C,P将是这些点的高度。

0

下面是基于形状功能的明显的例子。

考虑功能:

U1(X,Z)=(X-x_b)/(x_c-x_b)

一个具有U1(x_b,z_b)= U1(x_a,z_a)= 0(因为x_a = x_b)和U1(x_c,z_c)= U1(x_d,z_d)= 1个

U2(X,Z)= 1 - U1(X,Z)

现在我们有U2 (x_b,z_b)= u2(x_a,z_a)= 1和u2(x_c,z_c)= u2(x_d,z_d)= 0

v1 z_b )

此功能满足V1(x_a,z_a)= V1(x_d,z_d)= 1和V 1(x_b,z_b)= V1(x_c,z_c)= 0

v2的(X,Z)= 1 - V 1(X,Z)

我们有V2(x_a,z_a)= V2(x_d,z_d)= 0和v 2(x_b,z_b)= V2(x_c,z_c)= 1

现在让我们来构建新的功能如下:

S_D(X,Z)= U1(X,Z)* V1(X,Z)

我们得到S_D(X_ (x,z)= u1(x,z)* v2(x,z_d)= 1和S_D(x_a,z_a)= S_D(x_b,z_b)= S_D(x_c,z_c)= 0

S_C ,Z)

我们得到S_C(x_c,z_c)= 1和S_C(x_a,z_a)= S_C(x_b,z_b)= S_C(x_d,z_d)= 0

S_A(X,Z)我们得到S_A(x_a,z_a)= 1和S_A(x_b,z_b)= S_A(x_c,z_c)= S_A(x_d,z_d)= u2(x,z)* v1(x,z)

= 0

S_B(x,z)= u2(x,z)* v2(x,z)

我们得到S_B(x_b,z_b)= 1,S_B(x_a,z_a)= S_B(x_c,z_c)= S_B(x_d,z_d)= 0

现在定义插值功能

^h (x,z)= h_a * S_A(x,z)+ h_b * S_B(x,z)+ h_c * S_C(x,z)+ h_d * S_D(x,z),

其中h_a是在A点高度,h_b点在B点的高度,依此类推。

你可以很容易验证H是确实是一个内插函数:

H(x_a,z_a)= h_a,数组H(x_b,z_b)= h_b,H(x_c,z_c)= h_c和H(x_d ,z_d)= h_d。现在

,以近似P点的高度,所有你需要做的是在这一点上评价H:

h_p = H(x_p,z_p)

功能S被通常称为作为“形状功能”。对于希望插值取决于的每个节点,都有一个这样的函数,在这种情况下,它们都满足Kronecker的delta属性(它们在一个节点取值1,在其他所有节点取值为零)。

有很多方法可以为给定的一组节点构建形状函数。如果我没有记错的话,通过乘以一维形状函数(正如我们在这种情况下所做的那样)构造2D形状函数称为“函数的张量积”(在这种情况下容易,因为网格是矩形的)。我们结束了四个函数(每个节点一个),它们都是{1,x,z,xz}的线性组合。

如果您只想使用三个点进行插值,那么您应该能够轻松地构建三个形状函数,只是{1,x,z}的线性组合,但是您将失去25%的高度当h_b!= h_d时,网格提供的信息和插值在矩形内不会平滑。