从线到给定点的距离(给定线的起点和终点)

时间:2017-09-20 14:46:54

标签: python python-3.x

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

enter image description here

这是我的示例代码:

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中输入这样的更长的方程而没有它们变得如此凌乱我都是耳朵。

感谢您的帮助!

5 个答案:

答案 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))

demo

答案 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)