2

我有一个名为 forest 的类和一个名为 fixedPositions 的属性,它存储 100 个点(x,y),它们在 MatLab 中存储为 250x2(行 x 列)。当我选择“fixedPositions”时,我可以单击散点图,它会绘制点。

现在,我想旋转绘制的点,并且我有一个旋转矩阵可以让我这样做。

下面的代码应该可以工作:

theta = obj.heading * pi/180; 明显 = [cos(theta) -sin(theta) ; sin(theta) cos(theta)] * obj.fixedPositions;

但它不会。我得到这个错误。

???错误使用 ==> mtimes 内部矩阵尺寸必须一致。

==> landmarks>landmarks.get.apparentPositions 在 22 明显的错误 = [cos(theta) -sin(theta) ; sin(theta) cos(theta)] * obj.fixedPositions;

当我更改 forest.fixedPositions 以存储变量 2x250 而不是 250x2 时,上面的代码将起作用,但它不会绘图。我将在模拟中不断地绘制 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如果将一行更改为: obj.fixedPositions = 100 * rand([2,numberOfTrees]) .* sign(rand([2,numberOfTrees]) - 0.5);

一切都会正常工作......它只是不会情节。

ans = obj.fixedPositions; 回答'; 会将其翻转为我需要绘制的内容,但必须有办法避免这种情况?

4

2 回答 2

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

绘制点时,您应该利用句柄图形来创建最流畅的动画。您可以使用绘图对象的句柄和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 回答