首页 > 解决方案 > 这种插值方法的名称或优雅的解决方案是什么?

问题描述

我正在尝试加快一个简单的插值算法。问题如下:

在 XY 平面上有 4 个三维点组成一个矩形。它们的 Z 分量是任意的。

顶视图

这 4 个点在它们和它们的中点之间形成一个曲面,如下所示:

中点和曲面

我需要通过 XY 坐标在该表面上投影一个点,并获得表面上的 Z 坐标作为结果:

投影

我的解决方案(慢):

def project_point(p1, p2, p3, test):
    """
    Define a plane by 3 points and project the test point on it
    """
    v1 = p3 - p1
    v2 = p2 - p1

    # The cross product is a vector normal to the plane
    cp = np.cross(v1, v2)
    a, b, c = cp

    # This evaluates a * x3 + b * y3 + c * z3 which equals d
    d = np.dot(cp, p3)

    # Z = (d - a * X - b * Y) / c
    return (d - a * test[0] - b * test[1]) / c

# Determine one of the 4 triangles and project on it

# points is a list of 3d numpy arrays
# xy is a 2d numpy array

p1, p2, p3, p4 = tuple(points) 
mid_point = (p1 + p2 + p3 + p4) * 0.25
tri_index = get_triangle_index(p1, p2, p3, p4, xy) # Returns a triangle index at the coordinates xy

z = 0

if tri_index == 0:
    z = project_point(p1, p3, mid_point, xy)
elif tri_index == 1:
    z = project_point(p3, p4, mid_point, xy)
elif tri_index == 2:
    z = project_point(p4, p2, mid_point, xy)
elif tri_index == 3:
    z = project_point(p1, p2, mid_point, xy)

提供的解决方案有效,但速度很慢,而且有些事情告诉我,这在之前已经得到了更优雅的解决。谁能指出我正确的方向?

标签: pythonnumpymathinterpolation

解决方案


推荐阅读