菜单

Administrator
发布于 2025-07-11 / 42 阅读
0
0

2D旋转平移

给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45◦,再平移 (1,2), 计算出

变换后点的坐标(要求用齐次坐标进行计算)。

首先我们知道弧度是计算方式

rad = angle * 圆周率 / 180

`X' = cos(rad) x + -sin(rad) y;

Y' = sin(rad) x + cos(rad) y`

矩阵写作

cos(rad), -sin(rad),
sin(rad),  cos(rad),

齐次坐标

cos(rad), -sin(rad),tr.x
sin(rad),  cos(rad),tr.y
0          ,  0           ,1

先去图形计算器算下结果方便验证

干上代码,方便理解直接中文变量了

要注意 C++ 自身不支持 float234( 这点搞死我了)

#include <cmath>
#include <iostream>
#include <Eigen/Dense>
#define MY_PI 3.14159265358979323846
using namespace std;
using namespace Eigen;
int main()
{
    // 给定位置;
    Vector3f P(2.0, 1.0, 1.0);
    cout << P << endl;
    // 平移位置;
    Vector3f T(1.0, 2.0, 0.0);
    // 角度转为弧度 , 计算弧度的 cos 与 sin;
    //double M_PI(EIGEN_PI);
    //cout << M_PI << endl;
    float 角度 (45.0);
    float 弧度 (角度 * MY_PI / 180.0);
    float cos 弧度 = cos(弧度 );
    float sin 弧度 = sin(弧度 );
cout << "弧度 :";
    cout << 弧度 << endl;
    cout << "cos 弧度 :";
    cout << cos 弧度 << endl;
    cout << "sin 弧度 :";
    cout << sin 弧度 << endl;
Matrix3f R;
R <<    cos 弧度, -sin 弧度, T.x(),
        sin 弧度,  cos 弧度, T.y(),
        0.0,      0.0,     1.0 ; 
   // 进行旋转矩阵;
    Vector3f RP(R * P);
    cout <<" 旋转平移后的位置 :" << endl;
    cout << RP << endl;
    return 0;
}

最后结果


评论