三维矢量的平面方程

时间:2009-12-31 13:33:26

标签: python math linear-algebra

我想找到一个给出3分的3D平面方程。应用十字产品后,我得到了正常的计算结果。但是已知平面的方程是正常乘以另一个向量,我被教导为P.OP.我将主参考点替换为OP,我希望P为(x,y,z)形式。所以我可以得到类似的东西,

OP = (1, 2, 3)

我希望得到类似的东西:

(x-1)
(y-2)
(z-3)

我可以知道吗? 下面是我的参考代码。(注意:plane_point_1_x(),plane_point_1_y(),plane_point_1_z()都是要求用户输入相应点的函数。)

"""
I used Point P as my reference point so I will make use of it in this section
"""

vector_pop_x = int('x') - int(plane_point_1_x())
vector_pop_y = int('y') - int(plane_point_1_y())
vector_pop_z = int('z') - int(plane_point_1_z())

print vector_pop_x, vector_pop_y, vector_pop_z

以上所有都是我所做的,但由于某种原因它不起作用。我认为问题在于x,y,z部分。

5 个答案:

答案 0 :(得分:5)

如果我没有弄错的话,这里的一个好解决方案包含错误类型

vector1 = [x2 - x1, y2 - y1, z2 - z1]
vector2 = [x3 - x1, y3 - y1, z3 - z1]

cross_product = [vector1[1] * vector2[2] - vector1[2] * vector2[1], -1 * (vector1[0] * vector2[2] - vector1[2] * vector2[0]), vector1[0] * vector2[1] - vector1[1] * vector2[0]]

a = cross_product[0]
b = cross_product[1]
c = cross_product[2]
d = - (cross_product[0] * x1 + cross_product[1] * y1 + cross_product[2] * z1)

尝试了之前(作者)的版本,但不得不检查它。公式中有几个更多的缺点现在看来是正确的。

答案 1 :(得分:4)

一个好方法是:

| x1 y1 z2 1 |
| x2 y2 z2 1 |
| x3 y3 z3 1 | = 0
| x  y  z  1 |

垂直管道表示矩阵的行列式,而(x1 y1 z1)(x2 y2 z2)(x3 y3 z3)是您的给定点。

答案 2 :(得分:3)

平面隐式Eqn:

所有点 P =(x,y,z)满足

< n QP > = 0

,其中

  • n 是平面法线向量,
  • Q 是飞机上的某个点(任何人都会这样做)
  • QP 是从 Q P
  • 的向量
  • < a b >是标量(点)产品运营商。

(请记住 QP 可以计算为 P - Q

答案 3 :(得分:2)

我希望这个答案已经存在。编码自http://www.had2know.com/academics/equation-plane-through-3-points.html

假设3点p1,p2,p3 - 由[x1,y1,z1]等组成

vector1 = [x2 - x1, y2 - y1, z2 - z1]
vector2 = [x3 - x1, y3 - y1, z3 - z1]
cross_product = [vector1[1] * vector2[2] - vector1[2] * vector2[1], -1 * vector1[0] * v2[2] - vector1[2] * vector2[0], vector1[0] * vector2[1] - vector1[1] * vector2[0]]
d = cross_product[0] * x1 - cross_product[1] * y1 + cross_product[2] * z1

a = cross_product[0]
b = cross_product[1]
c = cross_product[2]
d = d

答案 4 :(得分:2)

假设您有三个已知点,每个点都有(x,y,z)。例如:

p1 = (1, 2, 3)
p2 = (4, 6, 9)
p3 = (12, 11, 9)

将它们制作成更容易查看以进行进一步处理的符号:

x1, y1, z1 = p1
x2, y2, z2 = p2
x3, y3, z3 = p3

从点确定两个向量:

v1 = [x3 - x1, y3 - y1, z3 - z1]
v2 = [x2 - x1, y2 - y1, z2 - z1]

确定两个向量的cross product

cp = [v1[1] * v2[2] - v1[2] * v2[1],
      v1[2] * v2[0] - v1[0] * v2[2],
      v1[0] * v2[1] - v1[1] * v2[0]]

可以使用简单的等式 ax + 通过 + cz = d 来描述平面。交叉积中的三个系数是 a b c ,而 d 可以通过替换a来解决已知点,例如第一个:

a, b, c = cp
d = a * x1 + b * y1 + c * z1

现在做一些有用的事情,比如确定 x = 4, y = 5时的 z 值。重新排列简单的等式,并求解 z

x = 4
y = 5
z = (d - a * x - b * y) / float(c)  # z = 6.176470588235294