import re,math,heapq,collections,sys,json sys.path.insert(0, __file__.rsplit("/", 1)[0]) from adturns import load def angle(N,p,b,c): v1=(N[b]["x"]-N[p]["x"],N[b]["z"]-N[p]["z"]); v2=(N[c]["x"]-N[b]["x"],N[c]["z"]-N[b]["z"]) l1=math.hypot(*v1); l2=math.hypot(*v2) if l1<1e-6 or l2<1e-6: return 0.0 return math.degrees(math.acos(max(-1,min(1,(v1[0]*v2[0]+v1[1]*v2[1])/(l1*l2))))) def speed(a): for lim,sp in ((3,50),(5,38),(8,27),(12,20),(15,13),(20,10),(30,7)): if adist.get(s,1e18): continue p,b=s if b not in best or d alle udgange er tilladt for c in T.get(s,N[b]["out"]): a=angle(N,p,b,c); l=math.hypot(N[c]["x"]-N[b]["x"],N[c]["z"]-N[b]["z"]) nd=d+l/(speed(a)/3.6)*(20 if N[c]["fl"]&1 else 1) ns=(b,c) if nd\s*([\d.]+)\s*([^<]*)\s*([^<]*)",s)] T=transit(N) ids=[m[0] for m in mm if m[0] in N] sharp=collections.Counter(); rev=0 for k,st in enumerate(ids): best,pre=dijkstra(N,T,st) for tg in ids: if tg==st or tg not in best: continue for (p,b,c) in path_turns(N,best,pre,tg): a=angle(N,p,b,c) if a>45: if is_reverse(N,p,b,c): rev+=1; continue sharp[(p,b,c)]+=1 json.dump([[p,b,c,n,round(angle(N,p,b,c),1)] for (p,b,c),n in sharp.items()],open(sys.argv[2],"w")) print("markører",len(ids),"forskellige skarpe sving på ruter:",len(sharp),"bakke-sving sprunget over:",rev) print(collections.Counter(int(angle(N,*k)//5*5) for k in sharp))