Math 将三维点投影到二维平面
假设A是一个点,我有三维坐标x,y,z,我想把它们转换成二维坐标:x,y。投影应在由给定法线定义的平面上正交。普通情况下,法线实际上是一个轴,很容易解决,只需消除一个坐标,但其他情况如何,更可能发生?。然后从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
中减去该投影。剩下的是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
点pr_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
平面的交点。有无数种方法可以定义法向量的正交向量。这应该在定义平面时确定,而不是在测量点时确定。这些向量不应该是正交的而不是正交的吗?