python - 这种插值方法的名称或优雅的解决方案是什么?
问题描述
我正在尝试加快一个简单的插值算法。问题如下:
在 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)
提供的解决方案有效,但速度很慢,而且有些事情告诉我,这在之前已经得到了更优雅的解决。谁能指出我正确的方向?
解决方案
推荐阅读
- mysql - 自然排序后的选择 - MySQL
- javascript - 如果 html 数据来自 API 而不是 JSON 响应,如何插入手风琴图标并进行列表切换?
- javascript - 加载时显示特定的谷歌地图信息窗口
- r - 是否有用于重塑数据的 R 函数——世界银行
- datatable - 如何从 .Net Core 3.1 中的 Sql 命令的 DataTable 返回 JSON 对象
- python - 如何用笛卡尔绘制波纹球体?
- tfs - Azure Devops,如何获取我的项目的所有共享查询 - Powershell 或 C#
- php - mysqli 语句准备有问题
- python - 我无法从确实的特定时间段内抓取每个链接内容
- python - 如何仅将 dynmodb 属性的值存储到 python 变量中?