Как обнаружить строгое движение по часовой стрелке / против часовой стрелки в MATLAB - PullRequest
3 голосов
/ 04 октября 2011

Мне нужно написать небольшую программу, которая проверит, будет ли линия (вектор положения) двигаться строго по часовой стрелке или CCLW.Я пытался использовать atand, чтобы найти угол, но он мог перейти от отрицательного к положительному значению, когда он пройдет мысль 90 градусов, у меня будет то же самое, если я использую метод наклона.нужно подрезать под углом 90 градусов, он может прыгнуть с 89 до 91. Тогда может произойти большой наклонный прыжок.Любая идея, пожалуйста

Спасибо

1 Ответ

5 голосов
/ 04 октября 2011

Одним из способов сделать это было бы вычисление перекрестного произведения последовательных векторов положения.Если все перекрестные произведения положительны, то линия перемещается строго по часовой стрелке.Точно так же, если они все отрицательны, линия перемещается против часовой стрелки.Если знаки смешаны, то линия не двигалась строго в одном угловом направлении:

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 градусов по часовой стрелке.Это пример псевдоним .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...