我正在尝试编写一个返回点距离线的距离的函数。我在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中输入这样的更长的方程而没有它们变得如此凌乱我都是耳朵。
感谢您的帮助!
答案 0 :(得分:2)
当你写x**1/2
时,你将x提升到1
的力量(只有x
),然后将结果除以2
(所以{ {1}} == 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
答案 1 :(得分:0)
在进行划分之前,您忘记先评估等式的底部。
print(abs(((y2-y1)*x0)-((x2-x1)*y0)+(x2*y1)-(y2*x1))/((((y2-y1)**2)+((x2-x1)**2))**0.5))
答案 2 :(得分:0)
这是正确的,更清洁
from math import sqrt
x1, y1 = -1, 0
x2, y2 = 1, 0
x0, y0 = 0, 1
dx = x2 - x1
dy = y2 - y1
dist = abs(dy*x0 - dx*y0 + x2*y1 - y2*x1) / sqrt(dy*dy + dx*dx)
print(dist)
答案 3 :(得分:0)
通过分成多个陈述的简单方法:
import math
x1,y1 = -1,0
x2,y2 = 1,0
x0,y0 = 0,1
p=(y2-y1)*x0
q=(x2-x1)*y0
r=(x2*y1)-(y2*x1)
d=math.sqrt( (x2 - x1)**2 + (y2 - y1)**2 )
a=abs(p-q+r)
b=a/d
print (b)
答案 4 :(得分:0)
print(abs(((y2-y1)*x0)-((x2-x1)*y0)+(x2*y1)-(y2*x1))/pow((y2-y1)**2+(x2-x1)**2),.5)