SymPy中的点到平面距离

3

我尝试在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}}。

1个回答

0

这看起来像是一个bug。这里是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 的当前主分支中得到了修复。请参见相应的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接