文章17
标签2
分类9

图形-变换

知识点

尺寸变化(Scale

其中$s_x$代表x轴的缩放,$s_y$代表y轴的缩放
image-20220305171326805
$$\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

image-20220305171551066
$$\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

以原点为轴,逆时针旋转
image-20220305171620238
$$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>

坐标/向量

使用EigenVector:

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; //叉乘函数

矩阵

使用EigenMatrix,用<<存入:

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;
本文作者:admin
本文链接:https://blog.banned.top/archives/36/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可

0 评论

'