2010-05-03 10 views
2

J'ai une classe appelée forest et une propriété appelée fixedPositions qui stocke 100 points (x, y) et ils sont stockés 250x2 (lignes x colonnes) dans MatLab. Quand je sélectionne 'fixedPositions', je peux cliquer scatter et il va tracer les points.Rotation Matrix calcule par colonne non par ligne

Maintenant, je veux faire pivoter les points tracés et j'ai une matrice de rotation qui me permettra de faire cela.

Le code ci-dessous devrait fonctionner:

thêta = obj.heading * pi/180; apparent = [cos (thêta) -sine (thêta); sin (thêta) cos (thêta)] * obj.fixedPositions;

Mais ça ne va pas. J'ai cette erreur.

??? Erreur lors de l'utilisation de ==> mtimes Les dimensions de la matrice interne doivent être identiques. Erreur dans ==> landmarks> landmarks.get.apparentPositions à 22 apparente = [cos (thêta) -sine (thêta); sin (thêta) cos (thêta)] * obj.fixedPositions;

Lorsque je modifie forest.fixedPositions pour stocker les variables 2x250 au lieu de 250x2, le code ci-dessus fonctionnera, mais il ne tracera pas. Je vais tracer des Positions fixes en permanence dans une simulation, donc je préférerais le laisser tel quel et faire en sorte que la rotation fonctionne.

Des idées?

De plus, les positions fixes sont la position des points xy comme si vous regardiez droit devant vous. c'est-à-dire le cap = 0. le cap est réglé à 45, ce qui signifie que je veux faire pivoter les points dans le sens des aiguilles d'une montre à 45 degrés.

Voici mon code:

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 

post-scriptum Si vous changez une ligne à ceci: obj.fixedPositions = 100 * rand ([2, numberOfTrees]). * Sign (rand ([2, numberOfTrees]) - 0.5);

Tout va bien fonctionner ... il ne sera pas tracé.

ans = obj.fixedPositions; ans '; va le retourner à ce que j'ai besoin de tracer, mais il doit y avoir un moyen d'éviter cela?

Répondre

3

Je pense que vous voulez transposer la matrice avant et après la multiplication par la rotation. Si la matrice est des nombres réels, vous pouvez le faire:

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

Argent! Merci. Off the main, est la meilleure façon d'animer quelque chose comme ça juste pour effacer le nuage de points et le redessiner? –

4

Une solution consiste à calculer la transposition de votre matrice de rotation ci-dessus et le déplacer vers l'autre côté de la multiplication de la matrice:

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

Lorsque traçant vos points, vous devriez tirer parti de handle graphics pour créer l'animation la plus douce. Au lieu d'effacer l'ancien tracé et de le replacer, vous pouvez utiliser le handle de l'objet plot et la commande SET pour mettre à jour ses propriétés, ce qui devrait être beaucoup plus rapide. Voici un exemple utilisant la fonction 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