Направление замкнутого векторного цикла

У меня есть непересекающийся замкнутый векторный цикл, и я хочу определить, идет ли он против часовой стрелки или по часовой стрелке.

Вот тривиальный пример

[x y] = [0 0; 1 0; 1 1; 0 1; 0 0]

против часовой стрелки и

[x y] = [0 0; 0 1; 1 1; 1 0; 0 0]

по часовой стрелке.

Есть ли хороший способ определить, по часовой стрелке или против часовой стрелки?

Изменить: больше примеров

[x, y]          OR       [x, y]
 0 ,0                     0, 0
 1 ,0.5                   0, 2
 2 ,0                     2, 2
 2 ,2                     2, 0
 0 ,2                     1, 0.5
 0 ,0                     0, 0

Теперь вышеуказанные точки соединяются только в заданном порядке. Мне нужно определить левый случай как против часовой стрелки и правый как по часовой стрелке.


person Srimaya P.    schedule 20.11.2015    source источник
comment
Можете ли вы привести еще несколько примеров данных. Ваши циклы всегда сосредоточены на [0,0]? Являются ли ходы всегда дискретными целыми числами и т. д.? Разрешены ли числа кроме 0 и 1?   -  person Dan    schedule 20.11.2015
comment
Нет, петля начинается откуда угодно и может идти куда угодно. У него всего 2 ограничения, т. е. он должен быть замкнутым и не пересекающимся.   -  person Srimaya P.    schedule 20.11.2015
comment
Отредактируйте свой вопрос, указав еще несколько примеров.   -  person Dan    schedule 20.11.2015
comment
Может ли ваш цикл автоматически пересекаться?   -  person BillBokeey    schedule 20.11.2015
comment
Нет. Цикл не может автоматически пересекаться   -  person Srimaya P.    schedule 20.11.2015
comment
Получите векторы, соответствующие смещениям между последовательными точками. Затем получите аргумент этих векторов. Для цикла по часовой стрелке сумма этих аргументов будет равна -pi. Для против часовой стрелки они будут составлять +pi.   -  person BillBokeey    schedule 20.11.2015
comment
@Bill Вы имеете в виду абсолютный угол или относительный угол между двумя последовательными векторами. Что я получил от вашего решения, так это sum(atan(diff(y)./diff(x))). Это правильно?   -  person Srimaya P.    schedule 20.11.2015
comment
Лучше использовать [theta,~]=cart2pol(diff(x),diff(y)), а затем sum(theta)   -  person BillBokeey    schedule 20.11.2015
comment
Я что-то пропустил? X = [1, 0; 0, 1; -1, 0; 0, -1; 1, 0]; sum(cart2pol(diff(X(:,1)), diff(X(:,2)))) возвращает 0?   -  person Matthew Gunn    schedule 20.11.2015
comment
@BillBokeey Этот метод не работает при небольшом количестве баллов (3 или 4). Лучше проверить issorted(theta(1:end-1))   -  person Srimaya P.    schedule 20.11.2015
comment
@MatthewGunn да, это правильно. Рассмотрим issorted(theta(1:end-1)) для выпуклой оболочки.   -  person Srimaya P.    schedule 20.11.2015


Ответы (1)


Наиболее надежный способ сделать это для непересекающихся выпуклых и вогнутых многоугольников — вычислить область полигона со знаком. Если область со знаком положительна, она направлена ​​против часовой стрелки, в противном случае — по часовой стрелке.

signedArea = 0.5 * sum(x.*y([2:end 1]) - y.*x([2:end 1]));
isClockwise = signedArea < 0;
person Suever    schedule 04.03.2016