三维向量的平面方程

4 投票
5 回答
10410 浏览
提问于 2025-04-15 17:30

我想根据三个点找到一个三维平面的方程。我已经通过叉乘计算出了法向量。但是,平面的方程是法向量乘以另一个向量,这个我学到的叫做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 个回答

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) 是你给定的点。

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)

我试过之前(作者)的版本,但需要仔细检查一下。现在看起来公式里多了几个负号,似乎是对的了。

5

假设你有三个已知的点,每个点都有 (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]

接下来,计算这两个向量的 叉乘

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 + by + cz = d。从叉乘中得到的三个系数就是 abc,而 d 可以通过代入一个已知的点来求得,比如第一个点:

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

撰写回答