2024-04-23 16:27:32 发布
网友
在三维地形上,我得到每个顶点的高度信息,4个顶点组成一个面,我需要得到面上任意点的高度,给定局部(每个面)x/y坐标和4个顶点z(在我的地形中z是向上的),我搜索了很多,但找不到任何关于它的信息。你知道吗
三个non-colinear点定义了一个平面。如果有三个点p1、p2和p3,当为两个标量值a和b选择正确的值时,该平面上的每个点都可以从p1+a*(p2-p1)+b*(p3-p1)到达。(p2-p1和p3-p1必须是linearly independant!)你知道吗
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的任何点都将给出0的方程cx+dy+ez+f。见here。你知道吗
cx+dy+ez+f=0
c
d
e
f
x
y
z
0
cx+dy+ez+f
您已经给出了平面的第一个描述,并希望将其转换为第二个描述,以获得给定的x和y的z。如here所示。你知道吗
设cross为任何向量的叉积(p2-p1)x(p3-p1),p[0]为任何向量的x值p,p[1]为任何向量的y值p,p[2]为任何向量的z值p,则可以求解z:
cross
(p2-p1)x(p3-p1)
p[0]
p
p[1]
p[2]
z=-(cross[0]*(x-p1[0])+cross[1]*(y-p1[1]))/cross[2]+p1[2]
如果cross[2]是0,你在这里除以0!这种情况是如果你的平面垂直于x-y-平面。所以任何x,y对都没有或有无穷多个解。你知道吗
cross[2]
将整个过程转换为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)
输出:
3.5
所以对于p1=[1,1,1]、p2=[0,1,0]、p3=[-2,-1,-1]、x=4和y=2你得到z=3.5
p1=[1,1,1]
p2=[0,1,0]
p3=[-2,-1,-1]
x=4
y=2
z=3.5
如何从全局坐标转换到局部坐标取决于局部坐标的定义。你知道吗
三个non-colinear点定义了一个平面。如果有三个点
p1
、p2
和p3
,当为两个标量值a
和b
选择正确的值时,该平面上的每个点都可以从p1+a*(p2-p1)+b*(p3-p1)
到达。(p2-p1
和p3-p1
必须是linearly independant!)你知道吗你也可以用
cx+dy+ez+f=0
来描述一个平面。这意味着如果你已经给出了四个标量值c
、d
、e
和f
,平面上坐标为x
、y
和z
的任何点都将给出0
的方程cx+dy+ez+f
。见here。你知道吗您已经给出了平面的第一个描述,并希望将其转换为第二个描述,以获得给定的
x
和y
的z
。如here所示。你知道吗设
cross
为任何向量的叉积(p2-p1)x(p3-p1)
,p[0]
为任何向量的x
值p
,p[1]
为任何向量的y
值p
,p[2]
为任何向量的z
值p
,则可以求解z
:z=-(cross[0]*(x-p1[0])+cross[1]*(y-p1[1]))/cross[2]+p1[2]
如果
cross[2]
是0
,你在这里除以0
!这种情况是如果你的平面垂直于x
-y
-平面。所以任何x
,y
对都没有或有无穷多个解。你知道吗将整个过程转换为python可以这样做:
输出:
所以对于
p1=[1,1,1]
、p2=[0,1,0]
、p3=[-2,-1,-1]
、x=4
和y=2
你得到z=3.5
如何从全局坐标转换到局部坐标取决于局部坐标的定义。你知道吗
相关问题 更多 >
编程相关推荐