作业题目
给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45◦,再平移 (1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算)。
题解
首先复习下旋转矩阵
注意题目中要求使用齐次坐标
故P(2,1)的齐次坐标为(2,1,1)
由于使用了齐次坐标,旋转和平移矩阵可以合二为一了。
注意:先旋转,后平移
p
′
=
[
1
0
Δ
x
0
1
Δ
y
0
0
1
]
∗
[
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
]
∗
[
x
y
1
]
=
[
c
o
s
θ
−
s
i
n
θ
Δ
x
s
i
n
θ
c
o
s
θ
Δ
y
0
0
1
]
∗
[
x
y
1
]
=
[
1.70711
4.12132
1
]
p'=\begin{bmatrix} 1 & 0 & \Delta x \\ 0 & 1 & \Delta y \\ 0 & 0 & 1 \end{bmatrix} * \begin{bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} * \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}= \begin{bmatrix} cos\theta & -sin\theta & \Delta x \\ sin\theta & cos\theta & \Delta y \\ 0 & 0 & 1 \end{bmatrix} * \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}= \begin{bmatrix} 1.70711 \\ 4.12132 \\ 1 \end{bmatrix}
p′=
100010ΔxΔy1
∗
cosθsinθ0−sinθcosθ0001
∗
xy1
=
cosθsinθ0−sinθcosθ0ΔxΔy1
∗
xy1
=
1.707114.121321
代码
#include<cmath>
#include<eigen3/Eigen/Core>
#include<eigen3/Eigen/Dense>
#include<iostream>
#define PI 3.1415926f
#define DEG2RAD (PI/180.0f)
int main(){
Eigen::Vector3f point(2.0f,1.0f,1.0f);
float rad = 45.0f * DEG2RAD;
Eigen::Matrix3f rotateMat;
rotateMat <<
cos(rad), -sin(rad), 1.0,
sin(rad), cos(rad), 2.0,
0.0, 0.0, 1.0;
point = rotateMat * point;
std::cout << point << std::endl;
return 0;
}