我正在尝试编写一个函数来返回点与线的距离。我在 wikipedia 上找到了这个方程:
这是我的示例代码:
x1,y1 = -1,0
x2,y2 = 1,0
x0,y0 = 0,1 #should be exactly 1 away from the line
print(abs(((y2-y1)*x0)-((x2-x1)*y0)+(x2*y1)-(y2*x1))/(((y2-y1)**2)+((x2-x1)**2))**1/2)
输出:0.25
预期:1.0
我知道我有更多的括号,但我已经重写了 3 次,试图使其正确,并希望确保我没有弄错操作顺序。
顺便问一下,是否有人知道如何在 python 中输入更长的方程,而不会让它们变得如此困惑,我洗耳恭听。
感谢您的帮助!
最佳答案
当您编写 x**1/2
时,您将 x 计算为 1
次方(即 x
) ,然后将结果除以 2
(因此 x**1/2
== x/2
),为避免这种情况,可以使用括号、.5
或(更好)使用 math.sqrt(x)
:
print(abs(((y2-y1)*x0)-((x2-x1)*y0)+(x2*y1)-(y2*x1))/(((y2-y1)**2)+((x2-x1)**2))**(1/2))
# => 1.0
print(abs(((y2-y1)*x0)-((x2-x1)*y0)+(x2*y1)-(y2*x1))/(((y2-y1)**2)+((x2-x1)**2))**.5)
# => 1.0
# Or
from math import sqrt
print(abs(((y2-y1)*x0)-((x2-x1)*y0)+(x2*y1)-(y2*x1))/sqrt(((y2-y1)**2)+((x2-x1)**2)))
# => 1.0
此外,为了避免像这样的长表达式,请通过为每个表达式分配一个函数来分隔它们:
def pDistp(x1, y1, x2, y2):
return (((y2-y1)**2)+((x2-x1)**2))**.5
def numerator(x0, y0, x1, y1, x2, y2):
return abs(((y2-y1)*x0)-((x2-x1)*y0)+(x2*y1)-(y2*x1))
x1,y1 = -1,0
x2,y2 = 1,0
x0,y0 = 0,1
print(numerator(x0, y0, x1, y1, x2, y2) / pDistp(x1, y1, x2, y2))
# => 1.0
关于python - 从线到给定点的距离(给定线的起点和终点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46325210/