我正在尝试使用python中的简单数学执行一个简单的任务,我怀疑由于浮点数学错误而导致从弧度转换为度数的继承错误(如从主题上的另一个问题获得请不要不要将此标记为重复的问题,但事实并非如此。
我想把一条线延长500米。为此,我从提供的线获取端点坐标,并使用所述线的现有标题生成同一标题中500米点的坐标。
在这种情况下,标题很重要,因为它是我的错误的来源。或者我怀疑。
我使用以下函数来计算我的直角三角形的内角,使用现有的线条构建,或者在这种情况下我的斜边:
def intangle(xypoints):
angle = []
for i in xypoints:
x1 = i[0][0]
x2 = i[1][0]
y1 = i[0][1]
y2 = i[1][1]
gradient = (x1 - x2)/(y1-y2)
radangle = math.atan(gradient)
angle.append((math.degrees(radangle)))
return angle
我的输入点是,例如:
(22732.23679147904, 6284399.7935522054)
(20848.591367954294, 6281677.926560438)
我知道我的角度为35°,因为这些坐标是通过一个单独的函数以编程方式生成的,并且当每个KM绘制出的时间大约为3.75“。由于将弧度转换为度数而另一个误差是可接受的它的范围。
然而,上述函数产生的误差导致了一个角度,在我连接点时线条不再完全笔直的地方绘制我的新端点,我必须有一条直线。
如何解决浮点错误?它甚至可能吗?如果没有,那么使用欧几里德几何来扩展我的线多少米的接受方法是什么?
除此之外,我已经完成了所有相关的地理转换,并且我100%确定我正在处理2D平面,因此椭圆体等根本不起作用。
答案 0 :(得分:1)
使用角度是不必要的,并且您的方式存在问题。使用atan
只会给出-pi / 2和pi / 2之间的角度,并且您将获得相反方向的相同角度值。
你应该使用Thales:
import math
a = (22732.23679147904, 6284399.7935522054)
b = (20848.591367954294, 6281677.926560438)
def extend_line(a, b, length):
"""
Returns the coordinates of point C at length beyond B in the direction of A->B"""
ab = math.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2)
coeff = (ab + length)/ab
return (a[0] + coeff*(b[0]-a[0]), a[1] + coeff*(b[1]-a[1]) )
print(extend_line(a, b, 500))
# (20564.06031560228, 6281266.7792872535)