我正在尝试编写一个函数,该函数返回点与直线的距离。我在wikipedia上找到了这个等式:

python - 线到给定点的距离(给定线的起点和终点)-LMLPHP

这是我的示例代码:

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/

10-13 08:53