#include <iostream>
#include <Eigen/Core>
#include "Eigen/Dense"
#include <Eigen/Geometry>
using namespace std;
int main() {
Eigen::Matrix3d rotation_Matrid;//旋转矩阵
Eigen::AngleAxisd rotation_vector(M_PI / 4, Eigen::Vector3d(0, 0, 1));//旋转向量
Eigen::Vector3d eluerangle(2,1,0);//欧拉角
Eigen::Quaterniond quaterniond(rotation_vector);//四元数
Eigen::Isometry3d isometry3D_T= Eigen::Isometry3d::Identity();//欧式变换矩阵 初始化要为单位矩阵!!!!!
Eigen::Affine3d affine3D;//仿射变换
Eigen::Projective3d projective3D;//射影变换
rotation_Matrid = rotation_vector.toRotationMatrix();//旋转向量->旋转矩阵3x3
Eigen::Vector3d eluerangle_1 = rotation_Matrid.eulerAngles(2, 1, 0);//旋转矩阵->欧拉角 ZYX旋转 2:Z轴 1:Y轴 0:X轴 (2,1,2)-> ZYZ
Eigen::Vector3d v1(1,1,1);
Eigen::Vector3d v_rota = rotation_Matrid * v1;//用旋转矩阵变换
Eigen::Vector3d v_angle = rotation_vector * v1;//用旋转向量变换
isometry3D_T.rotate(rotation_vector);
isometry3D_T.pretranslate(Eigen::Vector3d(1, 3, 4));
Eigen::Vector3d v_transform = isometry3D_T*v1;//v_1(世界坐标系)变换到T的坐标系下
//cout<<isometry3D_T.matrix()<<endl;
cout<<quaterniond<<endl;
Eigen::Quaterniond Q(rotation_Matrid);
Q.normalize();//必须归一化
Eigen::Matrix3d mat_from_q(Q);
Eigen::AngleAxisd rotvec_from_q(Q);
Eigen::Vector3d v3= Q*v1;//v1坐标经过Q旋转变换后的坐标位置 在数学上是q*v1()*q-1
cout<<v3.matrix()<<endl;
Eigen::Quaterniond Q_v1(0,1,1,1);//v1用四元数表示
cout<<(Q*Q_v1*Q.inverse()).coeffs()<<endl;
//测试
Eigen::Matrix3d matrix_rotation;
Eigen::AngleAxisd vector_rotation(M_PI/2,Eigen::Vector3d(0,0,1));
matrix_rotation=vector_rotation.toRotationMatrix();
Eigen::Isometry3d T =Eigen::Isometry3d::Identity();//初始化单位矩阵
T.rotate(matrix_rotation);
T.pretranslate(Eigen::Vector3d(1,1,1));
Eigen::Vector3d v2(1,1,1);
Eigen::Vector3d v_l=T.inverse()*v2;
return 0;
}