我想计算从p1到连接p2和p3的线的中点以及p2和p3形成的线的中点所形成的角度。我使用了如下代码,但结果似乎不正确,有人帮助我吗?
def calculateAngle(point1, point2, point3):
lon1, lat1 = point1
lon2, lat2 = point2
lon3, lat3 = point3
latCenter = (lat2 + lat3) / 2
lonCenter = (lon2 + lon3) / 2
xV1 = latCenter - lat1
yV1 = lonCenter - lon1
xV2 = lat3 - lat1
yV2 = lon3 - lon1
dotProduct = xV1 * xV2 + yV1 * yV2
magnitudeV1 = sqrt(xV1 ** 2 + yV1 ** 2)
magnitudeV2 = sqrt(xV2 ** 2 + yV2 ** 2)
if magnitudeV1 == 0 or magnitudeV2 == 0:
return 0
cosTheta = dotProduct / (magnitudeV1 * magnitudeV2)
cosTheta = max(min(cosTheta, 1), -1)
theta = acos(cosTheta)
angleInDegrees = degrees(theta)
return angleInDegrees, theta
你的V1和V2向量是错误的。 你有:
xV1 = latCenter - lat1
yV1 = lonCenter - lon1
xV2 = lat3 - lat1
yV2 = lon3 - lon1
你想要的是:
xV1 = lon1 - lonCenter
yV1 = lat1 - latCenter
xV2 = lon3 - lonCenter
yV2 = lat3 - latCenter
如果你看一下你的图表,应该很清楚。 两个向量都从中点延伸到其中一个点(point1 和 point3)。 经度是 X,纬度是 Y。同样,这在图中是正确的,但在 V1 和 V2 分配中相反。
请注意,您还可以使用:
xV1 = lon1 - lonCenter
yV1 = lat1 - latCenter
xV2 = lon3 - lon2
yV2 = lat3 - lat2
这实际上使 V2 的幅度加倍,稍后除以该幅度时,这将被抵消。