二维 Body Matlab 中的变换和旋转
2D Body Transformation and Rotation in Matlab
我在 Matlab 中定义了以下矩形:
A = [-4,-4,4,4,-4;-2,2,2,-2,-2;]
然后我定义了一个变换矩阵(特殊欧几里德 (2)),如下所示:
function T = se2(x, y, theta)
T = [cosd(theta), -sind(theta), x;
sind(theta), cosd(theta), y;
0, 0, 1];
现在,我想将形状围绕其中心旋转 45 度 counter-clockwise,并相对于 新坐标系 在 new y方向。
第一个问题是:当像下面那样做时:...
B = se2(0,2,45)*[A;1 1 1 1 1]
...它会正确旋转但不正确地移动我的形状。
这是我的矩形(蓝色)、不正确的变换(红色)和正确的变换(绿色):
第二个问题是:假设我将形状在y方向平移了6个方向。我只想将矩形围绕它的 新中心 旋转 -30 度,但是按照我所展示的那样,会产生围绕前一个中心的旋转。
如何在 Matlab 中解决这些问题?执行这些任务时是否有预定义的功能?
我绘制形状的代码:
A =
-4 -4 4 4 -4
-2 2 2 -2 -2
plot(A(1,:),A(2,:),'blue')
关于您的第一个问题:
本质上,您想在旋转之前将 A 平移到它的质心。这是因为旋转假定您正在绕原点旋转。因此,在旋转之前,您需要 "centre" 关于您计划旋转的点。然后你需要在完成旋转后翻译回来。详见this reference。
% Define A
A = [-2,-2,6,6,-2; -2,2,2,-2,-2; 1 1 1 1 1];
% Define Translation Matrix
trans = @(x,y,z) repmat([x; y; z],[1 5]);
% Define Rotation Matrix
se2 = @(x, y, theta) [
cosd(theta), -sind(theta), x;
sind(theta), cosd(theta), y;
0, 0, 1];
% Calculate Rotated Rect
B = se2(0,0,45) * (A - trans(2,0,0) ) + trans(2,0,0);
% Plot Rectangles
figure; plot(A(1,:),A(2,:),'b')
hold on;
plot(B(1,:),B(2,:),'r')
hold off;
axis equal
函数 trans
将在旋转之前对其进行翻译。
结果:
>> A
A =
-2 -2 6 6 -2
-2 2 2 -2 -2
1 1 1 1 1
>> B
B =
0.5858 -2.2426 3.4142 6.2426 0.5858
-4.2426 -1.4142 4.2426 1.4142 -4.2426
1.0000 1.0000 1.0000 1.0000 1.0000
这里是 A/B 如果在中心旋转。
这是带有偏移量的 A/B。
关于你的第二个问题:
与第一个问题相同的解决方案,除了您使用新的质心和 -30 度代替 B
的参数。
我在 Matlab 中定义了以下矩形:
A = [-4,-4,4,4,-4;-2,2,2,-2,-2;]
然后我定义了一个变换矩阵(特殊欧几里德 (2)),如下所示:
function T = se2(x, y, theta)
T = [cosd(theta), -sind(theta), x;
sind(theta), cosd(theta), y;
0, 0, 1];
现在,我想将形状围绕其中心旋转 45 度 counter-clockwise,并相对于 新坐标系 在 new y方向。
第一个问题是:当像下面那样做时:...
B = se2(0,2,45)*[A;1 1 1 1 1]
...它会正确旋转但不正确地移动我的形状。
这是我的矩形(蓝色)、不正确的变换(红色)和正确的变换(绿色):
第二个问题是:假设我将形状在y方向平移了6个方向。我只想将矩形围绕它的 新中心 旋转 -30 度,但是按照我所展示的那样,会产生围绕前一个中心的旋转。
如何在 Matlab 中解决这些问题?执行这些任务时是否有预定义的功能?
我绘制形状的代码:
A =
-4 -4 4 4 -4
-2 2 2 -2 -2
plot(A(1,:),A(2,:),'blue')
关于您的第一个问题:
本质上,您想在旋转之前将 A 平移到它的质心。这是因为旋转假定您正在绕原点旋转。因此,在旋转之前,您需要 "centre" 关于您计划旋转的点。然后你需要在完成旋转后翻译回来。详见this reference。
% Define A
A = [-2,-2,6,6,-2; -2,2,2,-2,-2; 1 1 1 1 1];
% Define Translation Matrix
trans = @(x,y,z) repmat([x; y; z],[1 5]);
% Define Rotation Matrix
se2 = @(x, y, theta) [
cosd(theta), -sind(theta), x;
sind(theta), cosd(theta), y;
0, 0, 1];
% Calculate Rotated Rect
B = se2(0,0,45) * (A - trans(2,0,0) ) + trans(2,0,0);
% Plot Rectangles
figure; plot(A(1,:),A(2,:),'b')
hold on;
plot(B(1,:),B(2,:),'r')
hold off;
axis equal
函数 trans
将在旋转之前对其进行翻译。
结果:
>> A
A =
-2 -2 6 6 -2
-2 2 2 -2 -2
1 1 1 1 1
>> B
B =
0.5858 -2.2426 3.4142 6.2426 0.5858
-4.2426 -1.4142 4.2426 1.4142 -4.2426
1.0000 1.0000 1.0000 1.0000 1.0000
这里是 A/B 如果在中心旋转。
这是带有偏移量的 A/B。
关于你的第二个问题:
与第一个问题相同的解决方案,除了您使用新的质心和 -30 度代替 B
的参数。