为什么我的完整圆圈不是 360 度?

How come my full circle isn't 360 degrees?

我遇到了一个令人困惑的问题。这是一些背景知识:

我正在 qgis/python 使用 Lambert93 中的坐标点:一个中心点(我的字典键)和其他几个围绕它的点。为了简化,我只写了一个例子的代码:

import numpy as np
import math

dict = {(355385,6.68906e+06): [(355277,6.68901e+06), (355501,6.68912e+06), (355364,6.6891e+06), (355277,6.68901e+06)]}

for key, values in dict.iteritems():
    anglist =[]
    print key
    i=0
    j=1
    for sides in values[:-1]:

        A = np.array(dict[key][i])
        B = np.array(key)
        C = np.array(dict[key][j])

        BA = A - B
        BC = C - B

        cosine_angle = np.vdot(BA, BC) / (np.linalg.norm(BA) * np.linalg.norm(BC))
        angle = (np.degrees(np.arccos(cosine_angle)))

        i+=1
        j+=1 

        anglist.append(angle)
        s = sum(anglist)
    dict[key]= [values, anglist, s] 
print dict

结果是:

{(355385, 6689060.0): [[(355277, 6689010.0), (355501, 6689120.0), (355364, 6689100.0), (355277, 6689010.0)], [177.4925133253854, 90.349597027985112, 87.142916297400205], 354.98502665077069]}

如您所见,sum = 354。我有大量数据,有时我得到正确的 360,但大多数情况下我没有。然而在所有逻辑中,通过绕一个点并在开始的地方结束计算,我应该得到的唯一结果是 360.

我已经尝试了第二种方法,只是想看看 cosine-angleangle 是否是问题所在:

from math import sqrt
from math import acos
import numpy
def angle(a, b, c):

    # Create vectors from points
    ba = [ aa-bb for aa,bb in zip(a,b) ]
    bc = [ cc-bb for cc,bb in zip(c,b) ]

# Normalize vector
    nba = sqrt ( sum ( (x**2.0 for x in ba) ) )
    ba = [ x/nba for x in ba ]

    nbc = sqrt ( sum ( (x**2.0 for x in bc) ) )
    bc = [ x/nbc for x in bc ]

# Calculate scalar from normalized vectors
    scale = sum ( (aa*bb for aa,bb in zip(ba,bc)) )

# calculate the angle in radian
    angle = numpy.degrees(acos(scale))
    return angle

print angle((355277,6.68901e+06),(355385,6.68906e+06), (355501,6.68912e+06))
print angle((355501,6.68912e+06),(355385,6.68906e+06), (355364,6.6891e+06))
print angle((355364,6.6891e+06),(355385,6.68906e+06), (355277,6.68901e+06))

但结果仍然是:

177.492513325
90.349597028
87.1429162974

所以我认为我们可以解决问题中的数学问题...所以一种可能性是 qgis(或 python?)如何管理坐标。我该如何解决这个问题?

我应该说,代码与, here and

大体相同

感谢 Hellmar 的指示,这是工作代码。我做了两件事:给出我平面上的所有中心点 (0,0),从所有其他相关点减去中心点和 (0,0) 之间的距离。 然后我能够使用 atan2 因为我需要计算的所有角度都在 (0,0)。 Atan2 在这种情况下非常实用,因为它只需要两个点来计算角度:测量的角度始终是 0,0 处的角度。 这可能意味着我不必将我的中心点设置为 0,0,因为它刚刚被踢出等式。 这是我的代码。欢迎任何进一步的建议。

import numpy as np
dictionary = {(355385,6.68906e+06): [(355277,6.68901e+06), (355501,6.68912e+06), (355364,6.6891e+06), (355277,6.68901e+06)], (355364,6.6891e+06): [(355261,6.68905e+06), (355385,6.68906e+06), (355481,6.68916e+06), (355340,6.68915e+06), (355261,6.68905e+06)], (355340,6.68915e+06): [(355238,6.68909e+06), (355364,6.6891e+06), (355452,6.68921e+06), (355238,6.68909e+06)]}
def angle_between(p1, p2):
    ang1 = np.arctan2(*p1[::-1])
    ang2 = np.arctan2(*p2[::-1])
    return np.rad2deg((ang1 - ang2) % (2 * np.pi))

zlist=[]
newdict={}
for key, values in dictionary.iteritems():
    xlist =[]
    ylist = []
    i=0
#print key
#print key[0]
    for sides in values:

        A = dictionary[key][i][0]
        B = key[0]
        C = dictionary[key][i][1]
        D= key[1]
        E = (0.0, 0.0)

        o1 = A-B
        o2  = C-D

        xlist.append(o1)
        ylist.append(o2)
        ziplist = zip(xlist, ylist)
        i+=1
    zlist.append(ziplist)  

#print dict[key][i][0]

newdict=zlist
print newdict
angledict = []

for p in newdict:
    i=0
    j=1
    print p
    for q in p[:-1]:
        A=p[i]
        B=p[j]
        print "A=",A
        print "B=", B

        angledict.append(angle_between(A,B))
        i+=1
        j+=1

print angledict

我从

中获取了 angle_between 函数