无法旋转原点的坐标

时间:2015-09-25 14:45:59

标签: matlab rotation coordinates

我在使用简单的脚本时遇到了一些困难。目标是使用某个角度旋转关于原点的点阵列。但是,我使用的代码似乎不能保持向量的大小。

我使用的数组中第一列是x坐标,第二列是y坐标:

for ii=1:1000
    angleRads=rand()*2*pi;
    randRotPoints(ii,1)=1*cos(angleRads)-0*sin(angleRads);
    randRotPoints(ii,2)=0*cos(angleRads)+1*sin(angleRads);
end
figure;
scatter(randRotPoints(:,1),randRotPoints(:,2));
lengths1=sqrt(randRotPoints(:,1).^2+randRotPoints(:,2).^2);

for ii=1:1000
    angleRads=rand()*2*pi;
    randRotPoints(ii,1)=randRotPoints(ii,1)*cos(angleRads)-randRotPoints(ii,2)*sin(angleRads);
    randRotPoints(ii,2)=randRotPoints(ii,2)*cos(angleRads)+randRotPoints(ii,1)*sin(angleRads);
end
figure;
scatter(randRotPoints(:,1),randRotPoints(:,2));
lengths2=sqrt(randRotPoints(:,1).^2+randRotPoints(:,2).^2);

在第一个循环之后,有一个数量级为1的坐标和随机方向。这是通过散点图确认的,而长度1数组都是1。

enter image description here

但是,尝试将这些坐标旋转第二个随机角度的第二个循环导致看似随机定位的坐标(基于散点图),并且长度不再全部为1。

enter image description here

请帮我弄清楚这个轮换代码出了什么问题。我知道,就性能或行数而言,这不是最有效的代码,如果你想在效率方面提供更好的方法,那么请说明需要什么。以其当前格式修复代码。

感谢。

1 个答案:

答案 0 :(得分:2)

在你的第二个循环中你有

randRotPoints(ii,1)=randRotPoints(ii,1)*cos(angleRads)-randRotPoints(ii,2)*sin(angleRads);

randRotPoints(ii,2)=randRotPoints(ii,2)*cos(angleRads)+randRotPoints(ii,1)*sin(angleRads);

即。在计算x时使用覆盖(旋转)y坐标。尝试在旋转之前保存randRotPoints(ii,:)向量,并使用右侧保存的值。

至于提高效率:

可读解决方案

越多

通过明确定义每个点的旋转矩阵,可以使代码更具可读性

for ii=1:1000
    angleRads=rand()*2*pi;
    rotmat=[cos(angleRads) -sin(angleRads); sin(angleRads) cos(angleRads)];
    randRotPoints(ii,:)=rotmat*[1; 0];
    %note that this is equivalent to
    %randRotPoints(ii,:)=[cos(angleRads); sin(angleRads)];
end
figure;
scatter(randRotPoints(:,1),randRotPoints(:,2));
lengths1=sqrt(randRotPoints(:,1).^2+randRotPoints(:,2).^2);

for ii=1:1000
    angleRads=rand()*2*pi;
    rotmat=[cos(angleRads) -sin(angleRads); sin(angleRads) cos(angleRads)];
    randRotPoints(ii,:)=rotmat*(randRotPoints(ii,:).');
end
figure;
scatter(randRotPoints(:,1),randRotPoints(:,2));
lengths2=sqrt(randRotPoints(:,1).^2+randRotPoints(:,2).^2);

为了节省一些代码重复,您还可以定义rotmatfun=@(angleRads) [cos(angleRads) -sin(angleRads); sin(angleRads) cos(angleRads);函数,然后您可以在循环中说rotmat=rotmatfun(angleRads);

高效解决方案

越多

你可以通过使用矢量化符号完全取消你的循环:

N=1000; %number of points

angleRads=rand(N,1)*2*pi;
randRotPoints=[1*cos(angleRads)-0*sin(angleRads), ...
               0*cos(angleRads)+1*sin(angleRads)]; %matrix of size [N,2]
figure;
scatter(randRotPoints(:,1),randRotPoints(:,2));
lengths1=sqrt(randRotPoints(:,1).^2+randRotPoints(:,2).^2);

angleRads=rand(N,1)*2*pi;
randRotPoints=[randRotPoints(:,1).*cos(angleRads)-randRotPoints(:,2).*sin(angleRads), ...
               randRotPoints(:,2).*cos(angleRads)+randRotPoints(:,1).*sin(angleRads)];
figure;
scatter(randRotPoints(:,1),randRotPoints(:,2));
lengths2=sqrt(randRotPoints(:,1).^2+randRotPoints(:,2).^2);