2

フォレストというクラスと、100 ポイント (x、y) を格納する fixedPositions というプロパティがあり、MatLab に 250x2 (行 x 列) で格納されます。「fixedPositions」を選択すると、散布図をクリックして点をプロットできます。

ここで、プロットされた点を回転させたいと思います。それを可能にする回転行列があります。

以下のコードは機能するはずです。

シータ = obj.heading * pi/180; 見かけ = [cos(シータ) -sin(シータ) ; sin(シータ) cos(シータ)] * obj.fixedPositions;

しかし、それはしません。このエラーが発生します。

??? ==> mtimes の使用エラー 内部行列の次元は一致する必要があります。

エラー ==> ランドマーク>landmarks.get.apparentPositions at 22 明らかな = [cos(theta) -sin(theta) ; sin(シータ) cos(シータ)] * obj.fixedPositions;

変数を 250x2 ではなく 2x250 に格納するように forest.fixedPositions を変更すると、上記のコードは機能しますが、プロットされません。シミュレーションで常に fixedPositions をプロットするつもりなので、そのままにして、代わりに回転を機能させたいと思います。

何か案は?

また、固定位置は、まっすぐ前を見ている場合の 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

PS 1 行を次のように変更すると: obj.fixedPositions = 100 * rand([2,numberOfTrees]) .* sign(rand([2,numberOfTrees]) - 0.5);

すべてが正常に機能します...プロットしません。

ans = obj.fixedPositions; ans'; プロットする必要があるものに反転しますが、これを回避する方法が必要ですか?

4

2 に答える 2

4

1 つの解決策は、上記の回転行列の転置を計算し、それを行列乗算の反対側に移動することです。

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
于 2010-05-04T04:43:20.497 に答える
3

回転を掛ける前後に行列を転置したいと思います。行列が実数の場合、次のことができます。

apparent = ([cos(theta)  -sin(theta) ; sin(theta)  cos(theta)] * (obj.fixedPositions)')';
于 2010-05-03T23:30:34.500 に答える