1、基本几何变换及变换矩阵

基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、比例、旋转、反射和错切等。

1.1 平移变换

是指将p点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。他是一种不产生变形而移动物体的刚体变换(rigid-body transformation),如下图所示。

图1-1 平移变换

推导:

求得平移变换矩阵如下:

 其中Tx,Ty称为平移矢量。

1.2 缩放变换

缩放变换是指对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放缩Sy倍。其中Sx和Sy称为缩放系数。

图1-2缩放变换(Sx=2,Sy=3)

推导:

矩阵:

缩放变换可改变物体的大小,如下图所示。当Sx=Sy >1时,图形沿两个坐标轴方向等比例放大;当Sx=Sy<1,图形沿两个坐标轴方向等比例缩小;当Sx≠Sy,图形沿两个坐标轴方向作非均匀的比例变换。

图1-3比例变换
(a)Sx与Sy相等                                                      (b)Sx与Sy不相等

1.3 旋转变换

二维旋转是指将p点绕坐标原点转动某个角度(逆时针为正,顺时针为负)得到新的点p’的重定位过程。

图1-4旋转变换

推导:利用极坐标方程

逆时针旋转θ角的矩阵如下:

1.4 对称变换

对称变换后的图形是原图形关于某一轴线或原点的镜像。

图1-5对称变换

(1)关于x轴对称

图1-6关于x轴对称

(2)关于y轴对称

图1-7关于y轴对称

(3)关于原点对称

图1-8关于原点对称

(4)关于y=x轴对称

图1-9关于y=x轴对称

(5)关于y=-x轴对称

图1-10关于y=-x轴对称

1.5 错切变换

错切变换也称为剪切、错位变换,用于产生弹性物体的变形处理。

图1-11错切变换

错切变换的变换矩阵为:

(1)沿x方向错切:b=0
    (2)沿y方向错切:c=0
    (3)两个方向错切:b和c都不等于0。

2、 复合变换

如果图形要做一次以上的几何变换,那么可以将各个变换矩阵综合起来进行一步到位的变换。复合变换有如下的性质:

1)复合平移

对同一图形做两次平移相当于将两次的平移两加起来:

2)复合缩放

两次连续的缩放相当于将缩放操作相乘:

3)复合旋转

两次连续的旋转相当于将两次的旋转角度相加:

缩放、旋转变换都与参考点有关,上面进行的各种变换都是以原点为参考点的。如果相对某个一般的参考点(xfyf)作缩放、旋转变换,相当于将该点移到坐标原点处,然后进行缩放、旋转变换,最后将(xfyf)点移回原来的位置。

4)关于(xfyf)点的缩放变换

5)绕(xfyf)点的旋转变换

3、二维图形几何变换的计算

几何变换均可表示成P’=P*T的形式

(1)点的变换:先将点表示为规范化齐次坐标形式,再乘以变换矩阵。

(2)直线的变换:将直线的两个端点表示为规范化齐次坐标形式,再乘以变换矩阵。

(3)多边形的变换:将多边形的顶点表示为规范化齐次坐标形式,再乘以变换矩阵。

(4)曲线的变换:将曲线的每个点表示为规范化齐次坐标形式,再乘以变换矩阵。

4、复合变换的矩阵点乘的先后问题

1)如果采用以下方式计算几何变换的变换矩阵:

如上范例所示,其先执行变换的矩阵放在前面,后执行变换的矩阵放在后面。

2)如果采用以下方式计算几何变换的变换矩阵:

如上范例所示,其先执行变换的矩阵放在后面,后执行变换的矩阵放在前面。

这是因为矩阵的特性:

算法系列:geometry的更多相关文章

  1. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  2. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  3. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  4. 三白话经典算法系列 Shell排序实现

    山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...

  5. Atitit s2018.6 s6 doc list on com pc.docx Atitit s2018.6 s6 doc list on com pc.docx  Aitit algo fix 算法系列补充.docx Atiitt 兼容性提示的艺术 attilax总结.docx Atitit 应用程序容器化总结 v2 s66.docx Atitit file cms api

    Atitit s2018.6 s6  doc list on com pc.docx Atitit s2018.6 s6  doc list on com pc.docx  Aitit algo fi ...

  6. 【C#实现漫画算法系列】-判断 2 的乘方

    微信上关注了算法爱好者这个公众号,有一个漫画算法系列的文章生动形象,感觉特别好,给大家推荐一下(没收过广告费哦),原文链接:漫画算法系列.也看到了许多同学用不同的语言来实现算法,作为一枚C#资深爱好的 ...

  7. 玩转算法系列--图论精讲 面试升职必备(Java版)

    第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真 ...

  8. 数据结构与算法系列——排序(4)_Shell希尔排序

    1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...

  9. 编程作业1.1——sklearn机器学习算法系列之LinearRegression线性回归

    知识点 scikit-learn 对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析. 我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法. 我们将scik ...

  10. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

随机推荐

  1. BZOJ 2438: [中山市选2011]杀人游戏

    Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ...

  2. Java 重写(Overriding)和重载(Overloading)

    方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现. 重写是父类与子类之间多态性的一种表现 重载是一类中多态性的一种表现.

  3. java前后台之间传值的几种方式

    自己写的代码太少,有时候前后台传值还写的不是很熟练,现在总结一下,加深下印象. 1.jquery的Ajax传值 ---->前台到后台 期望功能:把前台用户输入的信息保存在数据库里. 前台jsp代 ...

  4. css常用代码

    透明度: filter:alpha(opacity=50); -moz-opacity:0.5; opacity:0.5; 英文大小写: div{text-transform:capitalize|U ...

  5. Walls and Gates

    You are given a m x n 2D grid initialized with these three possible values. -1 - A wall or an obstac ...

  6. poj 2378 (dijkstra)

    http://poj.org/problem?id=2387 一个dijkstra的模板题 #include <stdio.h> #include <string.h> #de ...

  7. BestCoder37 1001.Rikka with string 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5202 题目意思:给出一个长度为 n,只有小写字母和 ? 组成的字符串.现在需要向 ? 的位置填小写字母 ...

  8. codeforces 519C. A and B and Team Training 解题报告

    题目链接:http://codeforces.com/contest/519/problem/C 题目意思:给出 n 个  experienced participants  和 m 个 newbie ...

  9. 微信video标签全屏无法退出bug 本文系转载

    安卓(android)微信里面video播放视频,会被强制全屏,播放完毕后还有腾讯推荐的视频,非常讨厌..强制被全屏无法解决,但是视频播放完毕后退出播放器可以解决.方法就是视频播放完毕后,用音频aud ...

  10. 【leetcode】Binary Tree Maximum Path Sum (medium)

    Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...