games101-作业0

作业题目

给定一个点 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θ0sinθcosθ0001 xy1 = cosθsinθ0sinθcosθ0ΔxΔy1 xy1 = 1.707114.121321

代码

#include
#include
#include
#include

#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;
}

你可能感兴趣的:(图形学,games101,作业)