Matlab中的2D身体变换和旋转

4

我在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度,使其围绕中心旋转,并相对于新坐标系y方向上移动2个单位。 第一个问题是:当像下面这样做时:...
B = se2(0,2,45)*[A;1 1 1 1 1]

当我进行变换时,矩形会正确地旋转但位置不对。这是我的矩形(蓝色),错误的变换(红色)和正确的变换(绿色):

The image

第二个问题是:假设我将该形状在y方向上平移了6个单位。我想绕其新中心逆时针旋转-30度,但按照我展示的方法会导致绕原来的中心旋转。

enter image description here

我应该如何解决这些问题?在Matlab中是否有预定义的函数可以完成这些任务?

以下是我用于绘制形状的代码:

A =

    -4    -4     4     4    -4
    -2     2     2    -2    -2
plot(A(1,:),A(2,:),'blue')

我认为我看到了问题,你能发布绘制图像的代码吗? - krisdestruction
由于您更新了问题,我仍在更新我的答案以解决您的第二个问题。 - krisdestruction
好的,只要你不再编辑问题,我的答案应该是正确的了XD。请接受或让我知道是否有任何错误或需要澄清的地方。 - krisdestruction
1个回答

4

关于你的第一个问题:

实质上,你想在旋转前将 A 翻译到它的中心。这是因为旋转假定你是围绕原点旋转的。因此,在旋转之前,你需要将其“居中”到你打算围绕其旋转的点上。然后,在完成旋转后,你需要将其翻译回来。详见 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。

enter image description here

这是带有偏移量的 A/B。

enter image description here

关于您的第二个问题: 与第一个问题相同的解决方案,只是您使用新的质心和 -30 度作为参数B

抱歉,我仍在更新我的解决方案。 - krisdestruction
谢谢您的快速回复 :) 我认为在Matlab中应该有一个预定义的函数来完成这个任务,否则我需要将se2矩阵添加到所有的函数中,以便形状记住它们的姿态。 - Zeta.Investigator
你是在说不需要使用两个函数来实现转换吗?如果是的话,你可以将其抽象成一个函数。如果你正在寻找一个内置函数,那么有 rotxrotate 以及其他一些内置函数,但我个人喜欢编写自己的函数,因为根据三维旋转的不同,你可以有不同的欧拉角旋转。 - krisdestruction
有很多地方可以找到给定欧拉角的旋转矩阵。这是其中之一,但像我说的,我更喜欢自己编写代码。此外,通常将平移作为旋转矩阵中的第四/第五个变量存储,但这里没有这样做。你会让一个二维案例变得过于复杂 :P http://nghiaho.com/?page_id=846 - krisdestruction
此外,如果您只使用2D情况,您可以将旋转/平移矩阵简化为2x2矩阵。 - krisdestruction
@Zeta.Investigator 无论如何,请接受我的答案,或者让我知道是否有任何需要修正的地方! - krisdestruction

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接