What I'm trying to do is find the angle of rotation between lines formed by three consecutive points. These are sequential points, so the direction of rotation matter.

My input is a sequence of pair of coordinates.

My desired output is the rotation angle of each point, where the point would be acting as the vertex of the angle. This angle would be between 1 and 360, where a negative number indicates a rotation to the left, and a positive number a rotation to the right.

I've been struggling with this for weeks, but I'm finally closer to the solution than ever before. I wrote the following script and compared it to the output of the "pathmetrics" function of the program Geospatial Modelling Tool(GME).

Code:coords=coords=[[283907,971700],[284185,971634],[284287,971507],[284275,971608],[283919,971761],[284311,971648],[284277,971637],[284280,971651],[284174,971649],[283909,971701],[283941,971700],[284294,971518],[284288,971517],[284315,971539],[284250,971505] print "A"+"\t"+"B"+"\t"+"C"+"\t"+"orientation"+"\t"+"angle"+"\t"+"bearing AB"+"\t"+"bearing BC" for a in coords: A=a indexA=coords.index(a) B=coords[indexA+1] C=coords[indexA+2] ##Find the bearings of AB and BC AB=[B[0]-A[0],B[1]-A[1]] #find the extreme of vector AB BearAB=math.atan2(AB[0],AB[1]) #use arctan2 to find the angle ABBearDeg=math.degrees(BearAB) #in degrees if ABBearDeg<0: #if negative, add 360 in order to obtain the angle in a clockwise direction ABBearDeg=360+ABBearDeg #Bearing AB BC=[C[0]-B[0],C[1]-B[1]] #Do the same for points BC BearBC=math.atan2(BC[0],BC[1]) BCBearDeg=math.degrees(BearBC) if BCBearDeg<0: BCBearDeg=360+BCBearDeg #Bearing BC ##Find the angle between the lines alfa=BCBearDeg-ABBearDeg #Obtain the difference between the bearing angles if abs(alfa)>180: #If greater than 180 if alfa<0: #and negative angle=(360+alfa) #Direction of rotation is right and angle is obtained by adding 360 print format(A)+"\t"+format(B)+"\t"+format(C)+"\t"+"right"+"\t"+format(angle)+"\t"+format(round(ABBearDeg,2))+"\t"+format(round(BCBearDeg,2)) else: #If positive angle=alfa-360 #Direction of rotation is left and angle is obtained by substracting 360 print format(A)+"\t"+format(B)+"\t"+format(C)+"\t"+"left"+"\t"+format(angle)+"\t"+format(ABBearDeg)+"\t"+format(round(BCBearDeg,2)) else: #If the difference was less than 180, then the rotation angle is equal to it angle=alfa if angle<0: #If negative, left rotation print format(A)+"\t"+format(B)+"\t"+format(C)+"\t"+"left"+"\t"+format(angle)+"\t"+format(ABBearDeg)+"\t"+format(round(BCBearDeg,2)) else: #If positive, right rotation print format(A)+"\t"+format(B)+"\t"+format(C)+"\t"+"right"+"\t"+format(angle)+"\t"+format(ABBearDeg)+"\t"+format(round(BCBearDeg,2))

While many of the results coincide, others don't.

[IMG][/IMG]

I've been able to pin-point at with point the error occurs, but I can't figure out why it happens because it depends strictly on pre-set formulas I have no control of.

So, the difference is that (SOMETIMES) my calculations of the bearing of the vectors differs from the one calculated by GME.

The weird part is that it happens only sometimes, and I have no idea what triggers it.

Any ideas of what might be going on?

If you know any other way of calculating angles between lines that incorporate the direction of the movement, do let me know.

Thanks!!!

Tweet This+ 1 thisPost To Linkedin