给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45 ◦,再平移 (1,2), 计算出 变换后点的坐标(要求用齐次坐标进行计算)。

作业解答:

#include<cmath>
#include<eigen3/Eigen/Core>
#include<eigen3/Eigen/Dense>
#include<iostream> int main(){
   // define point in Homogeneous Coordinates
Eigen::Vector3f res(2.0f, 1.0f, 1.0f);
// define Affine Transformations Matrix
// Translate then Rotate
Eigen::Matrix3f Rota_aff;
Rota_aff << cos(45.0/180.0*acos(-1)), -sin(45.0/180.0*acos(-1)), 0,
sin(45.0/180.0*acos(-1)), cos(45.0/180.0*acos(-1)), 0,
0, 0, 1;
Eigen::Matrix3f Tran_aff;
Tran_aff << 1.0, 0.0, 1.0,
0.0, 1.0, 2.0,
0.0, 0.0, 1.0;
std::cout << Tran_aff*Rota_aff*res << std::endl;
return 0;
}

作业解析:二维点的齐次坐标表示可以用三维向量概况(即最后一位为1),然后使用先旋转再平移的规则将二维坐标点依次左乘旋转矩阵和平移矩阵。

       此外旋转矩阵(逆时针旋转a度)即 m3(cosa, -sina, 0)(sina, cosa, 0)(0, 0, 1),平移矩阵(沿x轴平移a,沿y轴平移b)即 m3(1, 0, a)(0, 1, b)(0, 0, 1)。

注:如示例代码,在进行点位运算时尽量使用float,此外sin与cos函数的传入值需为弧度,弧度45度即为45.0/180.0*acos(-1)   公式为:弧度 = 角度 / 180 * pi

随机推荐

  1. .NET 高效开发Nuget管理工具(开源)

    我们.NET开发会引用很多外部Nuget包,多项目.多个解决方案.甚至多个仓库. 简单的Nuget包管理,通过VS就能比较简单处理好.但复杂的场景呢,比如: 1.一个仓库里,有多个解决方案的Nuget ...

  2. 如何将一个模块文件编译到Linux内核中?

    很多粉丝在群里提问,如何把一个模块文件编译到内核中或者独立变异成ko文件.本文给大家详解讲解. 1. 内核目录 Linux内核源代码非常庞大,随着版本的发展不断增加.它使用目录树结构,并且使用Make ...

  3. Python 潮流周刊#65:CSV 有点糟糕(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. shell 删除文件内容Mac、Linux兼容方法

    # 定义sedi数组 # Linux sed后面, 用 "-i" sedi=(-i) case "$(uname)" in Darwin*) # Mac sed ...

  5. Sql语句的两表联合查询

    string sql = "select mID,mName,mSex,mAge,(select fzName from TxlFenZu where ID=mFenZu) as mFenZ ...

  6. Windows PE 安装

    Microsoft 官方提供的 Windows PE 默认只有命令行界面.如果想要使用带有桌面环境的 Windows PE,推荐使用微 PE . 下载并安装 Windows ADK 和 WinPE 加 ...

  7. NVM 使用

    NVM(Node Version Manager)是 Node.js 的版本管理工具. NVM 项目为 macOS 和 Linux 开发.Windows 用户需要使用 NVM for Windows. ...

  8. ECharts实现雷达图详解

    ECharts 是一款由百度开源的数据可视化工具,它提供了丰富的图表类型,如折线图.柱状图.饼图.散点图.雷达图.地图.K线图.热力图.仪表盘等,以及丰富的交互功能.ECharts 组件的核心功能实现 ...

  9. 使用 Dependify 工具探索 .NET 应用程序依赖项

    在大型项目中,由于各种组件的复杂性和互连性,管理依赖项可能变得具有挑战性.如果没有适当的工具或文档,可能很难浏览项目并对依赖项做出假设.以下是在大型项目中难以导航项目依赖项的几个原因: 复杂性:大型项 ...

  10. 小tips:使用babel-upgrade从babel6升级babel7

    基础使用 完整使用参考地址:https://www.npmjs.com/package/babel-upgrade 使用方式: # npx lets you run babel-upgrade wit ...