Python 从任意给定位置的4个点和局部坐标获取高度(在3d地形上行走)

Python 从任意给定位置的4个点和局部坐标获取高度(在3d地形上行走),python,python-2.7,Python,Python 2.7,在3d地形上,我得到了每个顶点的高度信息,4个顶点构成一个面,我需要得到给定局部(每个面)x/y坐标和4个顶点z的面上任意点的高度(在我的地形中z向上),我搜索了很多,但找不到任何关于它的信息。三个点定义了一个平面。如果您有三个点p1,p2和p3当您为两个标量值a和b选择正确的值时,可以从p1+a*(p2-p1)+b*(p3-p1)到达该平面上的每个点。(p2-p1和p3-p1必须是!) 也可以通过cx+dy+ez+f=0来描述平面。这意味着,如果你已经给出了四个标量值c,d,e和f,任何坐标为

在3d地形上,我得到了每个顶点的高度信息,4个顶点构成一个面,我需要得到给定局部(每个面)x/y坐标和4个顶点z的面上任意点的高度(在我的地形中z向上),我搜索了很多,但找不到任何关于它的信息。

三个点定义了一个平面。如果您有三个点
p1
p2
p3
当您为两个标量值
a
b
选择正确的值时,可以从
p1+a*(p2-p1)+b*(p3-p1)
到达该平面上的每个点。(
p2-p1
p3-p1
必须是!)

也可以通过
cx+dy+ez+f=0
来描述平面。这意味着,如果你已经给出了四个标量值
c
d
e
f
,任何坐标为
x
y
z
的点在平面上都将为方程
cx+dy+ez+f
提供
0
。看

您已经给出了平面的第一个描述,并希望将其转换为第二个描述,以获得给定
x
y
z
。如图所示

cross
为叉积
(p2-p1)x(p3-p1)
p[0]
为任何向量
p
x
-值,
p[1]
为任何向量
p
y
-值,
p[2]
为任何向量
p
z
-值,然后您可以求解
z

z=-(交叉[0]*(x-p1[0])+cross[1]*(y-p1[1])/cross[2]+p1[2]

如果
cross[2]
0
则在此处除以
0
!这种情况下,如果平面垂直于
x
-
y
-平面。因此,对于任何
x
y
对,都没有或有无限多个解决方案

将整个内容转换为python可以这样做:

import numpy as np

def get_z(p1, p2, p3, x, y):
    p2_minus_p1 = p2-p1
    p3_minus_p1 = p3-p1

    cross = np.cross(p2_minus_p1, p3_minus_p1, axis=0)

    if np.abs(cross[2]) < 0.00001:
        raise ValueError('plane is perpendicular to x-y plane')

    return -(cross[0]*(x-p1[0])+cross[1]*(y-p1[1]))/cross[2]+p1[2]

if __name__=='__main__':

    p1 = np.array([1., 1., 1.])
    p2 = np.array([0., 1., 0.])
    p3 = np.array([-2., -1., -1.])
    x = 4.0
    y = 2.0

    z = get_z(p1, p2, p3, x, y)

    print(z)
所以对于
p1=[1,1,1]
p2=[0,1,0]
p3=[-2,-1,-1]
x=4
y=2
你会得到
z=3.5


如何从全局坐标变换到局部坐标取决于局部坐标的定义。

顶点定义一个平面(只需要三个平面)将x和y插入该平面方程,然后得到z。什么方程?顺便说一句,顶点是4个,每个面由2个三角形组成,因此是一个正方形,我不明白为什么我只需要3个?你可以有4个顶点不在同一平面上,3个顶点总是在一个平面上,因此定义它。当你有三个点时,你可以为一个平面建立方程。我明白了,但我仍然不知道如何得到这个平面上随机点的高度:/
3.5