2010-05-03 4 views
2

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

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

В приведенной ниже код должен работать:

тета = obj.heading * пи/180; visible = [cos (theta) -sin (theta); sin (theta) cos (theta)] * obj.fixedPositions;

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

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

Ошибка в ==> ориентиры> landmarks.get.apparentPositions at 22 visible = [cos (theta) -sin (theta); sin (theta) cos (theta)] * obj.fixedPositions;

Когда я изменяю forest.fixedпозиции, чтобы хранить переменные 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; анс; перевернет его на то, что мне нужно для заговора, но должен быть способ избежать этого?

ответ

3

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

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

Деньги! Благодарю. С другой стороны, это лучший способ оживить что-то вроде этого, чтобы стереть участок рассеяния и перерисовать его? –

4

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

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

Когда построив свои очки, вы должны использовать handle graphics, чтобы создать самую плавную анимацию. Вместо стирания старого сюжета и его повторного использования вы можете использовать дескриптор объекта сюжета и команду 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 
Смежные вопросы