games101_Homework0
给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45 ◦,再平移 (1,2), 计算出 变换后点的坐标(要求用齐次坐标进行计算)。
作业解答:
#include<cmath> #include<eigen3/Eigen/Core> #include<eigen3/Eigen/Dense> #include<iostream> int main(){ // define point in Homogeneous Coordinates Eigen::Vector3f res(2.0f, 1.0f, 1.0f); // define Affine Transformations Matrix // Translate then Rotate Eigen::Matrix3f Rota_aff; Rota_aff << cos(45.0/180.0*acos(-1)), -sin(45.0/180.0*acos(-1)), 0, sin(45.0/180.0*acos(-1)), cos(45.0/180.0*acos(-1)), 0, 0, 0, 1; Eigen::Matrix3f Tran_aff; Tran_aff << 1.0, 0.0, 1.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0; std::cout << Tran_aff*Rota_aff*res << std::endl; return 0; }
作业解析:二维点的齐次坐标表示可以用三维向量概况(即最后一位为1),然后使用先旋转再平移的规则将二维坐标点依次左乘旋转矩阵和平移矩阵。
此外旋转矩阵(逆时针旋转a度)即 m3(cosa, -sina, 0)(sina, cosa, 0)(0, 0, 1),平移矩阵(沿x轴平移a,沿y轴平移b)即 m3(1, 0, a)(0, 1, b)(0, 0, 1)。
注:如示例代码,在进行点位运算时尽量使用float,此外sin与cos函数的传入值需为弧度,弧度45度即为45.0/180.0*acos(-1) 公式为:弧度 = 角度 / 180 * pi