如何计算一点到直线中点的角度?

问题描述 投票:0回答:1

我想计算从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

enter image description here

python geometry angle
1个回答
0
投票

你的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 的幅度加倍,稍后除以该幅度时,这将被抵消。

© www.soinside.com 2019 - 2024. All rights reserved.