基于离散高度函数,对网格内点的高度进行插值。

5

我一直在想如何解决这个问题。

一个正方形网格内部的点P。

我有一张查找表,可以返回网格上各点 (x,z) 的高度值。例如,在图1中,我可以计算出 A、B、C 和 D 的高度。但是,我正在寻找一种方法来插值 P 点(已知 (x,z))。查找表仅在网格间隔处具有值,并且 P 点位于这些间隔之间。我试图计算值 st,使其满足:

A'(s) = A + s(C-A) B'(t) = B + t(P-B)

然后,我将使用这两个公式找到 B'(t) 与 A'(s) 的交点,以找到线段 A-C 上的点 X。通过这个点,我可以计算出在该点 X 的高度,并得出点P的高度。

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

如果有任何帮助,将不胜感激。


这是一个重心坐标测试吗? - tzenes
你想要获取点P的高度值,如果ABC和ADC是不同的三角形,还是你想要通过插值获取四边形ABCD的实际高度?这两种操作得到的结果不同。 - Coincoin
我所尝试的是首先确定三角形P所在的位置,然后根据点ABC或ADC插值计算高度。 - fastrack20
5个回答

3

1
这样怎么样:找到uv,以便
  P = B + u(A-B) + v(C-B)

如果你把它写出来,你会发现这是一个带有未知数uv的2x2线性系统,所以我猜你知道该怎么做。

哦,一旦你有了uv,你就可以使用与上面完全相同的公式计算高度,只不过这次A,B,C,P将是这些点的高度。


1

根据您是要在ABC或ABCD之间插值,算法会有所不同。

如果您想要在ABC之间插值(我猜这是您想要做的,因为您画了对角线),那么您需要找到相对于ABC的x和y位置的P的重心坐标,然后将重心坐标应用到这些三角形的高度(z在此处被假定)组件。


1

考虑一个单位长度正方形的四个角落有点值,任意点(x,y)内插值可表示为:

f(x,y) = [ (1-y)f(0,0) + yf(0,1) ](1-x) + [ (1-y)f(1,0)+y(f(1,1)) ]x

如果正方形的边长不是1,假设为L,则f(x,y)的公式为:
  f(x,y) = [ (L-y)f(0,0) + yf(0,L) ](L-x)/L^2 + [ (L-y)f(L,0)+y(f(L,L)) ]x/L^2

图片


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(x,z) = (z-z_b)/(z_a-z_b)

此函数满足v1(x_a,z_a) = v1(x_d,z_d) = 1,且v1(x_b,z_b) = v1(x_c,z_c) = 0

v2(x,z) = 1 - v1(x,z)

我们有v2(x_a,z_a) = v2(x_d,z_d) = 0,且v2(x_b,z_b) = v2(x_c,z_c) = 1

现在让我们按照以下方式构建新函数:

S_D(x,z) = u1(x,z) * v1(x,z)

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

S_C(x,z) = u1(x,z) * v2(x,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) = u2(x,z) * v1(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) = 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 性质(它们在一个节点上取值为一,在所有其他节点上取值为零)。

有许多方法可以为给定的节点集构建形状函数。如果我没记错的话,通过将1D形状函数相乘构建2D形状函数(就像我们在这个案例中所做的那样)被称为“函数的张量积”(在这种情况下很容易,因为网格是矩形的)。我们最终得到了四个函数(每个节点一个),它们都是{1、x、z、xz}的线性组合。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接