将一个点投射到Python

时间:2016-07-16 22:56:06

标签: python numpy

(原谅我的术语 - 自从我参加高级数学课以来已经很长时间了)

假设我有 n “plane”,每个“垂直”到 m 维度空间中的单个轴。没有两个平面垂直于同一轴。我相信我可以放心地假设所有 n 平面之间会有一些交叉。

我想将点 a 投影到交点上并获得结果的位置向量。

例如:

我有一个平面,其法线向量为(0.75,0,0),位置为(0.25,0,1),点 a 。我想得到投影到平面上的点 a 的位置矢量。

另一个例子:

我有两个由法向量(0.5,0,0)和(0,1,0)表示的平面。我在位置(0.1,0.1,0.1)处有一个 a 点。我想得到投影到我的两个平面(一条线)之间交叉点结果的点的位置矢量

2 个答案:

答案 0 :(得分:1)

m - 维空间中的“平面”是(m-1) - 维对象。它们通常被称为hyperplanes - plane 的概括,3维空间中的2维对象。要定义超平面,您不仅需要法向量而且需要一个点(想想二维空间中的线:所有平行线共享相同的方向,并且为了隔离一个您需要指定一个点)。

我怀疑你的意思是你的所有超平面都要穿过原点(在这种情况下确实在交点中有一个点 - 原点本身),我将你的“垂直于单个轴”解释为法线向量都指向某个坐标轴(换句话说,它们只有一个非零组件)。在这种情况下,你需要做的就是找到任意点(矢量,真的)到交点上的投影,将这些点的分量(再次,矢量,真的)设置为沿着超平面的法线向量归零。 / p>

让我来看看你的例子:

  1. 具有法向量(0.75,0,0)的三维空间中的(超)平面是 yz 平面:任意点的投影< em>(x,y,z)是(0,y,z) - 超平面沿第一个坐标有一个法向量,所以将该点的第一个分量设置为零(最后一次:矢量,真的)。特别是,(0.25,0,1)投射到(0,0,1)
  2. 垂直于(0.5,0,0)(0,1,0)的平面是 yz - 和 XZ - 平面。他们的交集是 z -axis。点(0.1,0.1,0.1)的投影是(0,0,0.1)

答案 1 :(得分:0)

可以通过求解具有lstsq的最小二乘意义上的超定系统来计算投影。系统矩阵的列由法向量形成,用作列(因此,在下面的第二行上进行转置)。

coeff是附加到这些法向量的系数;从给定点中减去法线向量的线性组合以获得投影

import numpy as np
normals = np.transpose(np.array([[0.5, 0, 0], [0, 1, 0]]))  # normals
point = np.array([0.1, 0.1, 0.1])  # point
coeff = np.linalg.lstsq(normals, point)[0]
proj = point - np.dot(normals, coeff)
print(proj)

输出:[0,0,0.1]。