Math 将三维点投影到二维平面

Math 将三维点投影到二维平面,math,3d,geometry,2d,plane,Math,3d,Geometry,2d,Plane,假设A是一个点,我有三维坐标x,y,z,我想把它们转换成二维坐标:x,y。投影应在由给定法线定义的平面上正交。普通情况下,法线实际上是一个轴,很容易解决,只需消除一个坐标,但其他情况如何,更可能发生?。然后从A中减去该投影。剩下的是A在正交平面上的投影 A在装置法向n上的投影如下所示: (A · n) n 如果A=(x,y,z)且单位法线由n=(nx,ny,nz)给出,则A到n的投影为 (x*nx + y*ny + z*nz) n 所以A在正交平面上的投影是 A - (A · n) n =

假设A是一个点,我有三维坐标x,y,z,我想把它们转换成二维坐标:x,y。投影应在由给定法线定义的平面上正交。普通情况下,法线实际上是一个轴,很容易解决,只需消除一个坐标,但其他情况如何,更可能发生?

。然后从
A
中减去该投影。剩下的是
A
在正交平面上的投影

A在装置法向
n
上的投影如下所示:

(A · n) n
如果
A=(x,y,z)
且单位法线由
n=(nx,ny,nz)
给出,则A到
n的投影为

(x*nx + y*ny + z*nz) n
所以A在正交平面上的投影是

A - (A · n) n
= (x, y, z) - (x*nx + y*ny + z*nz) (nx, ny, nz)
In [15]: A - np.dot(A,n)*n
Out[15]: array([-0.66233766, -0.07792208,  0.50649351])

例如,如果A=(1,2,3)和n是方向(4,5,6)上的单位法线,则

所以A在正交平面上的投影是

A - (A · n) n
= (x, y, z) - (x*nx + y*ny + z*nz) (nx, ny, nz)
In [15]: A - np.dot(A,n)*n
Out[15]: array([-0.66233766, -0.07792208,  0.50649351])

如何查找二维坐标:

您需要在正交平面上定义二维坐标系。换句话说,您需要定义
x轴和
y轴的位置。例如,您可以将
x轴
定义为(1,0,0)在正交平面上的投影(使用上面显示的计算)。这将适用于退化情况,其中(1,0,0)垂直于平面

一旦有了
x
y
轴方向的单位向量,就可以将
A
直接投影到
x
y
上。这些向量的大小是二维坐标

例如,这是(1,0,0)在平面上的投影。我们认为这是x轴方向:

In [42]: x = np.array([1,0,0])    
In [45]: x = x - np.dot(x, n) * n
In [52]: x /= sqrt((x**2).sum())   # make x a unit vector    
In [53]: x
Out[53]: array([ 0.89006056, -0.29182313, -0.35018776])
这里我们计算y轴方向:
y轴
方向必须垂直于法线方向
n
x
。因此,我们可以将
y
定义为
n
x

In [68]: y = np.cross(n, x)

In [69]: y
Out[69]: array([ -2.77555756e-17,   7.68221280e-01,  -6.40184400e-01])
下面是平面中
A
的坐标:

In [70]: np.dot(A, x), np.dot(A, y)
Out[70]: (-0.74414898890755965, -0.38411063979868798)

如果目标点p具有坐标
r_p=(x,y,z)
和法线
n=(nx,ny,nz)
的平面,则需要在平面上定义原点,以及
x
y
的两个正交方向。例如,如果原点位于
r\u O=(ox,oy,oz)
且平面中的两个坐标轴由
e\u 1=(ex\u 1,ey\u 1,ez\u 1)
e\u 2=(ex\u 2,ey\u 2,ez\u 2)
定义,则正交性具有
点(n,e\u 1)=0
点(n,e\u 2)=0
点(e\u 1,e\u 2)=0矢量积。请注意,所有方向向量都应规格化(幅值应为1)

您的目标点p必须遵循以下等式:

r_P = r_O + t_1*e_1 + t_2*e_2 + s*n
其中
t_1
t_2
是沿
e_1
e_2
s
平面和点之间的法向间隔(距离)的二维坐标

通过投影可以找到以下标量:

s = Dot(n, r_P-r_O)
t_1 = Dot(e_1, r_P-r_O)    
t_2 = Dot(e_2, r_P-r_O)
具有平面原点
r_O=(-1,3,1)
和法线的示例:

n = r_O/|r_O| = (-1/√11, 3/√11, 1/√11)
必须为二维坐标拾取正交方向,例如:

e_1 = (1/√2, 0 ,1/√2)
e_2 = (-3/√22, -2/√22, 3/√22)
这样
点(n,e_1)=0
点(n,e_2)=0
点(e_1,e_2)=0

点p
r_p=(1,7,-3)
的二维坐标为:

t_1 = Dot(e_1, r_P-r_O) = ( 1/√2,0,1/√2)·( (1,7,-3)-(-1,3,1) ) =  -√2
t_2 = Dot(e_2, r_P-r_O) = (-3/√22, -2/√22, 3/√22)·( (1,7,-3)-(-1,3,1) ) = -26/√22
以及面外分离:

s = Dot(n, r_P-r_O) = 6/√11

此问题似乎与主题无关,因为它与几何有关(请尝试)。二维(0,0)点在哪里定义?平面上的点是否离三维原点最近?你如何定义平面
x
y
轴的方向?谢谢你的回答,但是现在我如何将它们转换成二维坐标呢?我的意思是去掉z坐标,就像把它投影到屏幕上。我认为你把事情复杂化了。你只需要点积就可以得到投影距离(坐标)。非常感谢,我认为你的答案比第一个好。我自己也在想类似的事情,但你为我澄清了一些事情。还有一个问题:如何计算e_1和e_2?参见,您也可以根据三维原点(投影到平面上)的径向和切向向量定义方向,或者通过平面与
XY
YZ
ZX
平面的交点。有无数种方法可以定义法向量的正交向量。这应该在定义平面时确定,而不是在测量点时确定。这些向量不应该是正交的而不是正交的吗?