Derek Zoolander famously was not an ambiturner. He had to go through a hero's journey to be able to turn both left and right. In this post we will take a hero's journey to identify right and left turns from running data using only GPS measurements.

In my last post I described an algorithm to reduce the number of points on a 2D curve that preserves the basic network structure of the curve. This algorithm, the Ramer-Douglas-Peucker (RDP) algorithm helps us to identify abrupt changes in a curve, where abrupt is subjective and up to the user to decide upon.

In this post I present a novel and simple approach to answering the following question: Did I take a left or right turn and *how* did I take that turn? Smoothly? Roughly? Constantly? The method presented here is new and remarkably simple compared to other methods in the literature. Most methods I saw relied on accelerometer data which needed heavy machinery such as Kalman filters to make similar determinations.

### Calculus III to the rescue

The basic vector description of the plane and 3D space always seems like a bore when teaching. It's hard to get students to be fired up about vector addition and the algebraic structure of euclidean space. So finally, here is an interesting application of the dot product and cross product that goes beyond the ubiquitous force equations from physics.

Consider the map below. Let's assume we have identified the turning points from the RDP algorithm as described in my previous post. Identifying whether it is a right or left turn is extraordinarily simple. Given any three points on a plane we can find the angle that subtends the middle point with our friend the dot product,

On the map above we will have something like this,

If the angle is between 0 and 180 it is a right turn and if it is between -180 and 0 it is a left turn. But to solve for the angle we have to use the function which only has values in a range for a range of 180. This is where the *vector cross product *saves the day. The 2D cross product is simply the determinant. If the determinant is negative, the angle is between 0 and 180, if the determinant is positive it is between -180 and 0. Thus, left turns and right turns.

Finally, our algorithm is the following:

- Apply the RDP to the dataset of lat/lon's. This leaves us with a network G of vertices and
*n-1*edges. - For
*i*in range(1,n-1) form vectors for the*i-1, i,*and*i+1*vector (as shown above) and compute . - Calculate the determinant and determine left turn or right turn.

That's it!!!!! Glorious, glorious Calc III. Here is a map of run I took in Gedera and the results of the algorithm applied. The run starts with the left-most point. **This algorithm resulted in 100% accuracy.**

```
Type of turn, angle
Right turn, 36.9872677438
Left turn, -27.8188864289
Right turn, 55.4872049488
Left turn, -114.980809001
Right turn, 148.508392832
Right turn, 113.14225291
Right turn, 163.80922161
Left turn, -150.035986035
Right turn, 175.043761198
Right turn, 161.791261833
Right turn, 83.6023186647
Right turn, 109.851066119
Left turn, -126.533104243
Right turn, 116.820422235
Left turn, -97.4253631752
Right turn, 160.584337619
Right turn, 93.0049662148
Left turn, -164.456048578
Right turn, 139.971999906
Left turn, -142.289251078
Left turn, -165.463072689
Left turn, -143.612951911
Right turn, 119.067520889
Left turn, -155.864187354
```