Одним из способов сделать это было бы вычисление перекрестного произведения последовательных векторов положения.Если все перекрестные произведения положительны, то линия перемещается строго по часовой стрелке.Точно так же, если они все отрицательны, линия перемещается против часовой стрелки.Если знаки смешаны, то линия не двигалась строго в одном угловом направлении:
function checkRotation(pos)
pos(:,3) = 0;
pos = unique(sum(sign(cross(pos(1:end-1,:), pos(2:end,:))), 2));
if isequal(pos, 1)
disp('Rotation was counter-clockwise');
elseif isequal(pos, -1)
disp('Rotation was clockwise');
else
disp('No strict rotation direction');
end
Создайте несколько случайных векторов положения на -10<=x<=10
и -10<=y<=10
и проверьте вращение:
>> pos = 20 * rand([10, 2]) - 10
pos =
-8.28968405819912 9.26177078573826
-4.75035530603335 0.936114374779359
6.02029245539477 0.422716616080031
-9.41559444875707 -5.36811226582952
8.57708278956089 -0.222045121596661
4.60661725710906 2.48120176347379
-0.227820523928417 3.58271081731495
1.57050122046878 -2.08969568662814
-5.25432840456957 -2.65126702911047
-0.823023436401378 9.75964006323266
>> checkRotation(pos)
No strict rotation direction
Создайте векторы положения, которые перемещаются только против часовой стрелки, и проверьте:
>> theta = 0:15:180;
>> pos = [cosd(theta)' sind(theta)'];
>> checkRotation(pos)
Rotation was counter-clockwise
и аналогично для вращения по часовой стрелке:
>> theta = 180:-15:0;
>> pos = [cosd(theta)' sind(theta)'];
>> checkRotation(pos)
Rotation was clockwise
Обратите внимание, что успешность обнаружения вращения ограничена частотой дискретизации.Если линия последовательно поворачивается против часовой стрелки более чем на 180 градусов при последовательных выборках положения линии, она неотличима от поворота на 180 градусов по часовой стрелке.Это пример псевдоним .