Вы можете использовать матрицу вращения.Вращение будет применено к каждой координате сразу:
% Rectangle coordinate
% x y
R = [2, 3
5, 3
5, 8
2, 8]
%Anonymous function that will create the rotation matrix (input in radian)
romat = @(a)[cos(a), -sin(a); sin(a), cos(a)];
%Rotation of the Rectangle, with A = atan2(d(1), d(2));
Rrot = ((R-mean(R))*romat(A))+mean(R)
Во время операции мы должны вычесть центр масс прямоугольника, чтобы вращение происходило вокруг точки [0,0].
Результаты:
hold on
%Rectangle
patch(R(:,1),R(:,2),'green')
%Rotated rectangle
patch(Rrot(:,1),Rrot(:,2),'red','facealpha',0.5)
%Euclidian vector
quiver(mean(R(:,1)),mean(R(:,2)),d(1),d(2),...
'ro','MarkerFaceColor','red','linewidth',3)
axis equal
Что не так с вашим кодом:
Вы применяете следующую матрицу вращения:
M = [cos(a) sin(a)
-sin(a) cos(a)]
вместо
M = [cos(a) -sin(a)
sin(a) cos(a)]