知识点
尺寸变化(Scale
其中$s_x$代表x轴的缩放,$s_y$代表y轴的缩放
$$\left[\begin{matrix}x'\\y'\end{matrix}\right]=\left[\begin{matrix}s_{x} & 0\\0 & s_{y}\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]$$
切变(Shear
$$\left[\begin{matrix}x'\\y'\end{matrix}\right]=\left[\begin{matrix}1&a\\0&1\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]$$
旋转(Rotate
以原点为轴,逆时针旋转
$$R_{\theta}=\left[ \begin{matrix} cos\theta& -sin\theta \\ sin\theta & cos\theta \end{matrix} \right] $$
线性变化
$$x'=ax+by\\y'=cx+dy\\\left[\begin{matrix}x'\\y'\end{matrix}\right]=\left[\begin{matrix}a & b\\c & d\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]$$
齐次坐标
将二维坐标扩展为3维坐标,便于用一个矩阵来表达变换矩阵,同时用一个坐标即可表示点和向量。
点:$$2D\ point =(x,y,1)^{T}$$
向量: $$2D\ vector = (x,y,0)^{T}$$
移动
将移动的值放在第三列
$$\left[\begin{matrix}x'\\y'\\w'\end{matrix}\right]=\left[\begin{matrix}1 & 0 & t_{x}\\0 &1&t_{y}\\0&0&1\end{matrix}\right]\cdot\left[\begin{matrix}x\\y\\1\end{matrix}\right] = \left[\begin{matrix}x+t_{x}\\y+t_{y}\\1\end{matrix}\right]$$
代码
使用代码库Eigen
Eigen是一个矩阵和坐标相关的线性代数运算库,详情可以参考官方文档。本次知识点我们只使用矩阵相关的部分。
Cmake导入
find_package(Eigen3 REQUIRED)
include_directories(EIGEN3_INCLUDE_DIR)
c++头文件
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>
坐标/向量
使用Eigen
的Vector
:
Eigen :: Vector3f v(1.0f,2.0f,3.0f); //3代表几维,f代表float
Eigen :: Vector3f w(1.0f,0.0f,0.0f);
可以直接用加减和倍乘:
std::cout << v + w << std::endl;
std::cout << v * 3.0f << std::endl;
转置
std::cout<<v.transpose()<<std::endl;
点乘和叉乘
cout << "Dot product: " << v.dot(w) << endl;
double dp = v.adjoint()*w; //点乘函数
cout << "Dot product via a matrix product: " << dp << endl;
cout << "Cross product:\n" << v.cross(w) << endl; //叉乘函数
矩阵
使用Eigen
的Matrix
,用<<
存入:
Eigen :: Matrix3f i,j;
i << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0;
支持合法的矩阵加减、数乘、矩阵乘法、向量乘法
Eigen::Matrix3f m1,m2;
std::cout<< m1 + m2 << std::endl;
std::cout<< m1 * m2 << std::endl;
std::cout<< m1 * v << std::endl;
0 评论