首页 > 解决方案 > SymPy中的点平面距离

问题描述

我试图在 SymPy 中计算从点 (x_1, y_1, z_1) 到平面 ax+by+cz+d=0 的点平面距离,但我发现结果不正确。以下是我使用的代码

from sympy import *

a, b, c, d = symbols('a b c d')
x1, y1, z1 = symbols('x_1 y_1 z_1')

p1 = Point(x1, y1, z1)
plane1 = Plane(Point(0, 0, -d/c), normal_vector=(a, b, c))

plane1.distance(p1)

正确答案应该是 \frac{ax_1+by_1+cz_1+d}{\sqrt{a^2+b^2+c^2}}

但是 SymPy 给了我 \frac{ax_1+by_1+cz_1+d}{\sqrt{a^2+b^2}}。

标签: pythonsympy

解决方案


这对我来说似乎是一个错误。以下是 sympy 计算距离的方式(方法distance(self, o)):

self = plane1
o = p1

x, y, z = map(Dummy, 'xyz')
k = self.equation(x, y, z)
a, b, c = [k.coeff(i) for i in (x, y, z)]
d = k.xreplace({x: o.args[0], y: o.args[1], z: o.args[2]})
t = abs(d/sqrt(a**2 + b**2 + c**2))

如果我们检查ka, b, c看到方程的系数不正确:

print(k)
print(a, b, c)

# output:
_x*a + _y*b + c*(_z + d/c)
a b 0

c为零,这解释了你的结果。这可以通过简化方程来解决:

k = simplify(self.equation(x, y, z))

在这种情况下,距离t与您预期的一样:

print(t)
# output
Abs((a*x_1 + b*y_1 + c*z_1 + d)/sqrt(a**2 + b**2 + c**2)) 

更新:这已在 SymPy 的当前 master 中修复。请参阅相应的问题


推荐阅读