Матрица вращения рассчитывается по столбцам, а не по строкам - PullRequest
2 голосов
/ 04 мая 2010

У меня есть класс с именем forest и свойство fixedPositions, в котором хранится 100 точек (x, y), и они хранятся 250x2 (строки x столбцов) в MatLab. Когда я выбираю «fixedPositions», я могу щелкнуть «разброс», и он построит точки.

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

Следующий код должен работать:

theta = obj.heading * pi / 180; кажущийся = [соз (тета) -син (тета); sin (theta) cos (theta)] * obj.fixedPositions;

Но это не так. Я получаю эту ошибку.

??? Ошибка при использовании ==> mtimes Размеры внутренней матрицы должны совпадать.

Ошибка в ==> достопримечательностях> landmarks.get.apparentPositions at 22 кажущийся = [соз (тета) -син (тета); sin (theta) cos (theta)] * obj.fixedPositions;

Когда я изменяю forest.fixedPositions для хранения переменных 2x250 вместо 250x2, приведенный выше код будет работать, но он не будет отображаться. Я собираюсь постоянно строить фиксированные положения в симуляции, поэтому я бы предпочел оставить все как есть и вместо этого сделать вращение.

Есть идеи?

Кроме того, фиксированные позиции - это положение точек xy, как если бы вы смотрели прямо вперед. Т.е. заголовок = 0. заголовок установлен на 45, что означает, что я хочу повернуть точки по часовой стрелке на 45 градусов.

Вот мой код:

classdef landmarks
  properties
    fixedPositions   %# positions in a fixed coordinate system. [x, y]
    heading = 45;     %# direction in which the robot is facing
  end
  properties (Dependent)
    apparentPositions
  end
  methods
    function obj = landmarks(numberOfTrees)
        %# randomly generates numberOfTrees amount of x,y coordinates and set 
        %the array or matrix (not sure which) to fixedPositions
        obj.fixedPositions = 100 * rand([numberOfTrees,2]) .* sign(rand([numberOfTrees,2]) - 0.5);
    end
    function apparent = get.apparentPositions(obj)
        %# rotate obj.positions using obj.facing to generate the output
        theta = obj.heading * pi/180;
        apparent = [cos(theta)  -sin(theta) ; sin(theta)  cos(theta)] * obj.fixedPositions;
    end
  end
end

P.S. Если вы измените одну строку на эту: obj.fixedPositions = 100 * rand ([2, numberOfTrees]). * Sign (rand ([2, numberOfTrees]) - 0.5);

Все будет работать нормально ... это просто не сюжет.

ans = obj.fixedPositions; анс; перевернет это к тому, что мне нужно построить, но должен быть способ избежать этого?

Ответы [ 2 ]

4 голосов
/ 04 мая 2010

Одним из решений является вычисление транспонирования указанной выше матрицы вращения и перемещение ее на другую сторону умножения матрицы:

rotMat = [cos(theta) sin(theta); -sin(theta) cos(theta)];  %# Rotation matrix
apparent = (obj.fixedPositions)*rotMat;  %# The result will be a 250-by-2 array

При построении точек вы должны воспользоваться обработкой графики , чтобы создать максимально плавную анимацию. Вместо того, чтобы стирать старый график и реплотировать его, вы можете использовать дескриптор объекта графика и команду SET , чтобы обновить его свойства, которые должны рендериться намного быстрее. Вот пример использования функции SCATTER :

h = scatter(apparent(:,1),apparent(:,2));  %# Make a scatter plot and return a
                                           %#   handle to the scattergroup object
%# Recompute new values for apparent
set(h,'XData',apparent(:,1),'YData',apparent(:,2));  %# Update the scattergroup
                                                     %#   object using set
drawnow;  %# Force an update of the figure window
3 голосов
/ 04 мая 2010

Я думаю, что вы хотите транспонировать матрицу до и после умножения на вращение. Если матрица является действительным числом, вы можете сделать:

apparent = ([cos(theta)  -sin(theta) ; sin(theta)  cos(theta)] * (obj.fixedPositions)')';
...