我正在尝试编写一个函数,该函数返回点与直线的距离。我在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/