Python 从任意给定位置的4个点和局部坐标获取高度(在3d地形上行走)
在3d地形上,我得到了每个顶点的高度信息,4个顶点构成一个面,我需要得到给定局部(每个面)x/y坐标和4个顶点z的面上任意点的高度(在我的地形中z向上),我搜索了很多,但找不到任何关于它的信息。三个点定义了一个平面。如果您有三个点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,任何坐标为
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