Вы можете определить угол двух векторов, просто взяв скалярное произведение (скалярное произведение). Полезным свойством является то, что если векторы ортогональны, их скалярное произведение равно нулю; если их угол тупой, продукт отрицательный, в противном случае положительный. Итак, шаги, которые нужно предпринять:
- найдите первое ребро от V0 до V1 (как вектор, вы получите это, вычитая координаты), затем поверните его на 90 градусов влево (это просто преобразование
(x y)
в (-y x)
)
- найти второе ребро от V1 до V2 (не повернуто)
- возьмите скалярное произведение (это всего лишь
(x1 * x2) + (y1 * y2)
)
- если скалярное произведение отрицательно, это поворот направо, в противном случае поворот налево
- следующий край ...
- если вы идете по вершинам против часовой стрелки, посчитайте количество правых поворотов, в противном случае количество левых поворотов
- для последней вершины вы должны вернуться к первой (т.е. использовать ребра от Vn до V0 и от V0 до V1)
edit : Вы можете определить, упорядочены ли вершины против часовой стрелки или по часовой стрелке, используя следующую формулу для вычисления площади многоугольника:
1 n-1
A = --- SUM( x(i)*y(i+1) - x(i+1)*y(i) )
2 i=0
где n
- количество вершин. x(n)
и y(n)
совпадают с x(0)
и y(0)
(чтобы закрыть многоугольник).
Если оно положительное, то вершины располагаются против часовой стрелки, в противном случае по часовой стрелке.
edit : При упрощении шагов поворота и скалярного произведения вы получаете формулу для двумерного перекрестного произведения, x1*y2 - x2*y1
. Это упрощает первые шаги выше:
- найти первое ребро от V0 до V1 (как вектор, вычитая координаты)
- Дито для второго ребра от V1 до V2
- взять кросс произведение
((x1 * y2) - (x2 * y1))
- , если перекрестное произведение положительно, это левый поворот
Извините за запутанный первый подход.