Я думаю, что ваша жизнь будет проще, если вы используете векторное перекрестное произведение .
Хотя строго говоря, перекрестное произведение определено только для трехмерных векторов, для двухмерных векторов p = (px, py) и q = (qx, qy), вы можете думать об их перекрестном произведении p × q как px qy - py qx.Последнее число будет положительным, если p по часовой стрелке от q , и отрицательным, если p против часовой стрелки от q .Это будет ноль, если p и q параллельны - то есть указывают в одинаковом или противоположном направлении.
В вашем случае вы используете (широта, долгота),Эквивалент в (x, y) координатах равен (-lon, lat), поэтому, если у вас есть два вектора (lat1, lon1) и (lat2, lon2), вы хотите вычислить (-lon1, lat1) × (-lon2,lat2), который выходит к lat1 * lon2-lon1 * lat2.
Если это число равно нулю, вы можете использовать dot product , чтобы определить, является ли направление прямым или U-turn.
Таким образом, ваш код может выглядеть следующим образом, если предположить, что Точки и Векторы записаны в виде (широта, долгота) (код был бы немного другим, если бы они были в х и у):
public Direction GetTurnDirection(Point A, Point B, Point C)
{
Vector v1 = B - A ;
Vector v2 = C - B ;
double cross = v1.lat*v2.lon - v1.lon*v2.lat ;
if (cross > 0) { return Direction.Left ; }
if (cross < 0) { return Direction.Right ; }
double dot = v1.lat*v2.lat + v1.lon*v2.lon ;
if (dot > 0) { return Direction.Straight ; }
return Direction.UTurn ;
}