精华内容
下载资源
问答
  • 二维图形复合变换

    千次阅读 2018-08-05 12:33:49
    复合变换是指图形做一次以上的几何变换,变换结果是每次的变换矩阵相乘。从另一个方面看,任何一个复杂的几何变换都可以看成是基本几何变换的组合。  (n>1) 1. 复合平移  P经过两次连续平移后,其变换...

        复合变换是指图形做一次以上的几何变换,变换结果是每次的变换矩阵相乘。从另一个方面看,任何一个复杂的几何变换都可以看成是基本几何变换的组合。

        P^{'} = P \cdot (T_{1}\cdot T_{2}\cdot T_{3} ......T_{3})       (n>1)

    1. 复合平移

        P经过两次连续平移后,其变换矩阵可写为:

     

    2.复合缩放

       P经过两次连续缩放后,其变换矩阵可写为:

     

    3.复合旋转

        P经过两次连续旋转后,其变换矩阵可写为:

        

        在复合变换中,需要注意的是矩阵相乘的顺序,由于矩阵乘法不满足交换律,因此通常T_{1}\cdot T_{2} \neq T_{2}\cdot T_{1} 矩阵相乘的顺序不可交换。

    4.小结

         在实际应用中,很少只需要单一的基本变换,通常需要几种基本变化的组合。

     

        其中,各部分的效果如下

       T_{1} = \begin{bmatrix} a \ b \\ c\ d \\ \end{bmatrix}     比例、旋转、对称、错切等变换

       T_{2} = \begin{bmatrix} l \ m \\ \end{bmatrix}     平移变换

       T_{3} = \begin{bmatrix} p \\q \\ \end{bmatrix}        投影变换

       T_{4} = \begin{bmatrix} s \end{bmatrix}         整体比例变换

     

    展开全文
  • (16)二维图形复合变换

    千次阅读 2016-12-31 22:30:31
    这种由多种基本变换组合而成的变换称之为复合变换,相应的变换矩阵称作为复合变换矩阵。 比如:已知三角形各顶点坐标为(10, 10),(10, 30),(30, 15),对其进行下列变换,试写出复合变换矩阵。 (1)沿X方向平移20,...

    有些变换仅用一种基本变换是不能实现的,必须由两种或多种基本变换组合才能实现。这种由多种基本变换组合而成的变换称之为复合变换,相应的变换矩阵称作为复合变换矩阵。

    比如:已知三角形各顶点坐标为(10, 10),(10, 30),(30, 15),对其进行下列变换,试写出复合变换矩阵。
    (1)沿X方向平移20,沿Y方向平移15,再绕原点旋转90度。
    (2)绕原点旋转90度,沿X方向平移20,沿Y方向平移15。
    (3)沿X方向放大2倍,Y方向缩小3倍,关于原点对称,绕原 点旋转180度。 


    1.绕任意点P(xp, yp)作旋转变换,旋转角度为θ。


    将旋转中心P(xp, yp)平移到坐标原点,变换矩阵为:


    绕坐标原点旋转θ角,变换矩阵为:


    将旋转中心P(xp, yp)平移回原来的位置,变换矩阵为:


    因此,绕任意点P(xp, yp)旋转的复合变换矩阵为:



    2.相对于任意点P(xp, yp)作比例变换,比例系数为(Sx, Sy),即P点不变的比例变换。


    将点P(xp, yp)平移至坐标原点,变换矩阵为:

     

    相对于坐标原点作比例变换,变换矩阵为: 


    将点P(xp, yp)平移回原来位置,变换矩阵为:


    因此,相对于任意点P(xp, yp)作比例变换的复合变换矩阵为:   T = T1*T2*T3


    3.相对于任意点P(xp, yp)作对称变换 

    将点P(xp, yp)平移至坐标原点,变换矩阵为:


    相对于坐标原点作对称变换,变换矩阵为:


    将点P(xp, yp)平移回原来位置,变换矩阵为:


    因此,相对于任意点P(xp, yp)作对称变换的复合变换矩阵为:T = T1*T2*T3 


    4.关于任意直线作对称变换,直线方程为y=mx+b

    平移直线(以沿Y轴平移为例),使其通过坐标原点,变换矩阵为: 


    绕原点顺时针旋转角,使其与X轴重合(其中,tgθ=m)


    关于X轴作对称变换,变换矩阵为: 


    绕原点逆时针旋转角(即作第(2)步的逆运算),变换矩阵为:


    平移直线,使其回到原来位置(即作第(1)步的逆运算),变换矩阵为: 


    因此,关于任意直线作对称变换的复合变换矩阵为:     T = T1*T2*T3*T4*T5 


    综上所述,复合变换是通过基本变换组合而成的。
    注意:由于矩阵乘法不适用于交换律,即AB≠BA,因此组合的顺序是不能颠倒的,顺序不同,则变换结果不同。




    展开全文
  • Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”和“平行性”。仿射变换可以通过一系列的原子变换复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)...

    Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”和“平行性”。仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和错切(Shear)。

    在做2D图形引擎时,仿射变换是非常重要的点,图形的旋转等各种表现都需要通过仿射变换来完成,比如在显示列表树中,父节点旋转了,那么子节点在计算显示时也要叠加上父节点的变换矩阵,这是叠加矩阵。还有计算2D空间内的点在经过仿射变换的图形中的位置、鼠标是否点在经过仿射变换过的矩形中,等等都是需要仿射变换来完成计算。

    定义一个矩阵类Matrix包含属性如下:
    | 参数 | 描述 |
    | ----- |:----:|
    | a | 水平缩放比例 |
    | b | 垂直倾斜比例 |
    | c | 水平倾斜比例 |
    | d | 垂直缩放比例 |
    | x | 水平偏移像素 |
    | y | 垂直偏移像素 |

    矩阵的默认值为Matrix(1,0,0,1,0,0),后面的变换以改变矩阵值的形式完成。通过H5中的canvas实现改变图形:

    var c=document.getElementById("canvas");
    var ctx=c.getContext("2d");
    
    ctx.fillStyle="yellow";
    ctx.fillRect(0,0,250,100)
    
    var matrix = RM.Matrix.create(1,0,0,1,0,0);
    ctx.setTransform(matrix.a,matrix.b,matrix.c,matrix.d,matrix.x,matrix.y);
    ctx.fillStyle="red";
    ctx.fillRect(0,0,250,100);

    平移

    平移变换是一种“刚体变换”,并不会改变图形的形状。

    x

    //(平移到点40,50)
    matrix.translate( 40, 50 );

    涉及到函数的平移公式code:

    /**平移x,y像素*/
    public translate( x:number, y:number ):RM.Matrix {
        this.x += x;
        this.y += y;
        return this;
    }

    缩放

    缩放变换可以改变图形的宽高比例,横向缩放与纵向缩放。当值为负数反向缩放

    x

    //(x轴缩放0.5,y轴缩放0.5)
    matrix.scale( 0.5, 0.5 );
    或
    //(x轴缩放-1,y轴缩放1)
    matrix.scale( -1, 1 );

    涉及到函数的缩放公式code:

    /**缩放,x、y轴方向缩放*/
    public scale( scaleX:number, scaleY:number ):RM.Matrix {
        this.a *= scaleX;
        this.b *= scaleY;
        this.c *= scaleX;
        this.d *= scaleY;
        this.x *= scaleX;
        this.y *= scaleY;
        return this;
    }

    旋转

    目标图形围绕(x,y)点顺时针旋转value弧度

    旋转矩阵为(cosA, sinA, -sinA, cosA, 0, 0)

    x

    //(顺时针旋转30角度)
    matrix.rotate( 30 );

    涉及到函数的旋转公式code:

    /**旋转,单位是角度
     * 旋转矩阵( cosA, sinA, -sinA, cosA, 0, 0)
     * */
    public rotate( angle:number ):RM.Matrix {
        angle = ( angle % 360 )
        angle = RM.GFunction.angle2radian( angle );//角度转弧度
        var cos:number = Math.cos( angle );
        var sin:number = Math.sin( angle );
        var ta:number = this.a;
        var tc:number = this.c;
        var tx:number = this.x;
        this.a = ta * cos - this.b * sin;
        this.b = ta * sin + this.b * cos;
        this.c = tc * cos - this.d * sin;
        this.d = tc * sin + this.d * cos;
        this.x = tx * cos - this.y * sin;
        this.y = tx * sin + this.y * cos;
        return this;
    }

    错切

    错切变换指的是类似于四边形不稳定性那种性质,菱形形状。根据弧度顺时针倾斜。

    错切矩阵为( 1, tanAy, tanAx, 1, 0, 0 )

    x

    //(x轴错切30角度)
    matrix.skew( 30, 45 );

    涉及到函数的错切公式code:

    /**切变,单位是角度
     * 切变矩阵 ( 1, tanAy, tanAx, 1, 0, 0)
     * */
    public skew( angleX:number, angleY:number ):RM.Matrix {
        angleX = ( angleX % 90 );
        angleY = ( angleY % 90 );
        angleX = RM.GFunction.angle2radian( angleX );//角度转弧度
        angleY = RM.GFunction.angle2radian( angleY );//角度转弧度
        var tanAx:number = Math.tan( angleX );
        var tanAy:number = Math.tan( angleY );
        var ta:number = this.a;
        var tc:number = this.c;
        var tx:number = this.x;
        this.a = ta + tanAx * this.b;
        this.b = ta * tanAy + this.b;
        this.c = tc + tanAx * this.d;
        this.d = tc * tanAy + this.d;
        this.x = tx + tanAx * this.y;
        this.y = tx * tanAy + this.y;
        return this;
    }

    属性叠加

    当设置仿射变换的多个属性时,依据矩阵乘法的特性要遵循顺序(缩放->错切->旋转->平移)依次变换。

    如果不按照以上顺序,产生的结果将会与预期大大不同。下图以先x轴缩放0.5、错切x轴-30y轴30、旋转10度、平移(10,20)

    x

    错切与旋转的区别:错切可以分别向两方向倾斜不同的角度;旋转是同时向两方向倾斜相同的角度。
    那么,可以把错切与旋转合并,错切的默认x轴倾斜是正方向倾斜,也就是逆时针,改为与y轴倾斜相同的顺时针方向。
    当旋转30度时,也就是x轴y轴同时顺时针倾斜30度。

    x

    如图所示,大矩形错切x轴y轴各30度,小矩形旋转30度,两者的结果是一致的。

    //大矩形
    matrix.rightTransform( 0,0,1,1,30,30,0 );
    //小矩形
    matrix.rightTransform( 0,0,1,1,0,0,30 );

    属性叠加公式code:

    /**转换矩阵操作,顺序为:缩放、切变、旋转、平移*/
    public rightTransform(x:number, y:number, scaleX:number, scaleY:number, skewX:number, skewY:number, rotate:number):RM.Matrix {
        rotate = ( rotate % 360 );
        rotate = RM.GFunction.angle2radian(rotate);
        //旋转与切变一起算
        skewX = RM.GFunction.angle2radian(skewX) + rotate;
        skewY = RM.GFunction.angle2radian(skewY) + rotate;
        if (skewX || skewY) {
            //矩阵乘法(右置矩阵、后置矩阵)
            this.rightMultiply(Math.cos(skewY) * scaleX, Math.sin(skewY) * scaleX, -Math.sin(skewX) * scaleY, Math.cos(skewX) * scaleY, x, y);
        }
        else {
            this.rightMultiply(scaleX, 0, 0, scaleY, x, y);
        }
    }

    叠加矩阵

    在显示对象树中,父节点旋转30度,那么它的子节点是否也要旋转到相对于父节点的位置呢?答案是肯定的,必须旋转到相对位置。这就涉及到矩阵乘法,例如矩阵A*矩阵B得到的就是叠加矩阵,但是一定要注意的是 A*B ≠ B*A

    矩阵乘法满足结合律,但不满足交换律。

    因为矩阵A*B=C,C的结果是由A的行与B的列相乘和的结果;而B*A=D,D的结果是由B的行与A的列相乘和的结果。显然,得到的结果C和D不一定相等

    x

    显然,大矩形为父节点,小矩形为大矩形的子节点,当大矩形旋转60度时,小矩形相对于父节点为0度,
    然后小矩形再旋转60度,这是相对于父节点旋转了60度,相对于原点旋转了120度。大矩形以原点(0,0)点旋转,小矩形以大矩形内的坐标(0,0)点旋转。

    parent.matrix = RM.Matrix.create(0,0,1,1,0,0,60);
    //父节点的矩阵与子节点的矩阵相乘,便是子节点的真实矩阵
    child.matrix = parent.matrix.rightTransform(0,0,1,1,0,0,60);

    矩阵的运用

    矩阵这东西在图形引擎中的运用是很多的,上面的例图就是使用自己写好的图形引擎,通过设置属性再渲染到canvas中的。一张坐标轴地图、一个虚线矩形、一个实线矩形完成演示。
    矩阵的运用还是很多的,2D图形引擎中坐标点的判断,鼠标点击是否在图形上,脏矩形的范围,子节点上的坐标与原点坐标系的转换,等都是通过点与矩阵之间的二维空间转换而得到确切的值。

    x

    转载于:https://www.cnblogs.com/Richard-Core/p/matrix-affine-transform.html

    展开全文
  • 在并行系统上,使用等式1的复合变换矩阵而直接进行矩阵相乘也可以有相同的效果。 由于旋转计算需要对每个变换点进行三角求值和多次乘法,因而在旋转变换中的计算效率就成为十分重要问题。在动画及其他包含许多重复
    通用二维复合变换和计算效率
    表示平移、旋转和缩放组合的通用二维变换可以表示为矩阵等式1:

    4个元素rsjk是变换中(仅包含旋转角和缩放系数)的多重旋转-缩放项。元素trsxtrs,是包含平移距离、基准点和固定点坐标以及旋转角和缩放参数组合的平移项。例如,如果一个对象要对于其中心坐标(xc,yc)进行缩放、旋转和平移,那么复合变换矩阵的元素值为:

    尽管矩阵等式1需要9次乘法和6次加法,但变换后的坐标的显示计算为等式2:

             因此,实际上变换坐标位置仅需完成4次乘法和4次加法。一旦把单个矩阵连接起来计算出复合矩阵的元素值,这就是任何变换序列所需计算的最大数目假如没有合并,那么每次都要使用一个单独的变换,则计算的数目将大大增加。因此,变换操作的有效实现是先形成变换矩阵,合并所有变换序列,然后用等式2计算变换的坐标。在并行系统上,使用等式1的复合变换矩阵而直接进行矩阵相乘也可以有相同的效果。
             由于旋转计算需要对每个变换点进行三角求值和多次乘法,因而在旋转变换中的计算效率就成为十分重要问题。在动画及其他包含许多重复变换和小旋转角的应用中,我们可用近似循环计算减少复合变换方程中的计算量。当旋转角较小时,三角函数可用其幂级数展开式的前几项的近似值来代替,对于足够小的角度(小于10° ), cosθ近似为1,而sinθ的值非常接近于θ的弧度值。例如,假如以小角度步长绕原点旋转,那么可以将 cosθ设置为1.0,并在每一步中将变换计算减少为两次乘法和两次加法:



            其中,只要旋转角不变化,sinθ对所有的步长只需求值一次。在每一步中,由这种近似所引起的误差随旋转角的减少而减少。但即使是使用较小的旋转角,很多步之后的积累误差也会变得很大。如果要通过消除每一步中x′和y′的误差来控制积累误差,则必须在误差积累变得太大时重新设置对象位置。有些动画应用自动地在固定间隔处重设对象位置,如每360°或180°。
             复合变换经常包括逆矩阵计算。例如,对于通用缩放方向及对于反射和错切的变换顺序,可以使用逆旋转分量进行描述。我们已经注意到,基本几何变换的逆矩阵表示可以使用简单程序生成,逆平移矩阵可以通过改变平移距离的符号而得到,逆旋转矩阵通过完成矩阵转置(或改变sin项的符号)而得到,这些操作比直接逆矩阵计算要简单得多。


    展开全文
  • 二维图形变换5.1 向量基础5.2 图形坐标系5.3 二维图形变换原理5.3.1 图形...复合变换5.4.6 坐标系变换5.4.7 任意参考点的几何变换5.5 二维变换矩阵5.5.1 二维变换矩阵概述5.5.2 二维图形几何变换的计算5.4 窗口、视图及...
  • 二维刚体变换矩阵的一般形式为矩阵1:其中,4个元素rjk是多重旋转项,元素trx和try是平移项。坐标位置的刚体变化有时也称为刚体运动(rigid_motion)变换变换后坐标位置的所有角度和距离都不变化。此外矩阵1具有其...
  • 小白谈计算机图形学(四)二维三维图形变换—1窗口与视图二维图形的几何变换平移变换比例变换旋转变换二维图形变换的矩阵表示三种变换齐次坐标变换原二维线性变换齐次坐标法复合变换小结相关链接 窗口与视图 窗口:...
  • 对于一个二维反射而言,其反射镜像通过将对象绕反射轴旋转180°而生成。我们可以在xy平面内或垂直于xy平面选择反射轴(axis of reflection)。当反射轴是xy平面内的一条直线时,绕这个轴的旋转路径在垂直于xy平面的...
  • 利用矩阵表达式,可以通过计算单个变换的矩阵乘积,将任意的变换序列组成复合变换矩阵(compsite transformation matrix)。形成变换矩阵的乘积经常称为矩阵的合并(concatenation)或复合(compsistion)。由于一个...
  • 错切(shear)是一种使对象形状发生变化的变换,经过错切的对象好像是由已经相互滑动的内部夹层组成。两种常用的错切变换是移动x坐标值的错切和移动Y坐标值的错切。相对于x轴的x方向错切由下列变换矩阵1产生:该矩阵将...
  • 有些图形软件包要求变换按应用的次序描述。 在这种情况下,先引入变换M1,然后M2,最后M3。在每一个连续的变换子程序被调用时,其矩阵从左边与前面的矩阵乘积合并。而另一些图形系统是后乘矩阵,因此该变换序列按...
  • 第一节 用户坐标到屏幕坐标变换... 长宽比例变换第二节 二维几何变换 一、 基本变换 1、比例变换 2. 对称变换 3. 错切变换 4. 旋转变换 5. 平移变换 二、复合变换 1. 复合平移 2. 复合比例 3. 复合旋转 4.
  • 上一篇我们讨论了二维几何变换的矩阵运算!但是在平移运算中我们是 矩阵相加,而旋转和缩放都是矩阵乘法。但是在后面的矩阵复合运算中,存在加减,乘,将使得运算过程很复杂,统一起来都转化为乘法,可以使得我们的...
  • 计算机图形学(第三版)二维复合矩阵编程示例代码:代码运行软件版本(Visual Studio 2015)【软件安装教程百度“VS2015安装+OpenGL...参考书本代码203~207页代码,稍作修改,实现二维图形平移,旋转,缩放等几何变换
  • 实验4 二维几何变换

    千次阅读 2018-10-18 15:58:19
    巩固对二维几何变换的认识与理解; 学习OpenGL平移、旋转、缩放变换函数及其使用方法; 学习基本图形变换复合图形变换的方法; 综合运用上述函数,设计复杂图形。 2.实验内容: 根据示范代码1,使用OpenGL...
  • 二维几何变换算法

    千次阅读 2018-07-09 00:11:28
     复合变换结果与变换的顺序有关(矩阵乘法不可交换)例:对一矩形先缩放S(2,0.5),再旋转R(p/6)。 对称变换关于x轴的对称变换: 关于y轴的对称变换: 例:设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),求...
  • 图形几何变换

    2020-08-18 14:28:41
    4. 长宽比例变换第二节 二维几何变换 一、 基本变换 1、比例变换 2. 对称变换 3. 错切变换 4. 旋转变换 5. 平移变换 二、复合变换 1. 复合平移 2. 复合比例 3. 复合旋转 4. 相对点(xo,yo)的比例变换 5. 相对点(xo,yo...
  • 二维图像的几何变化二维图形基本几何变换是指相对于坐标原点和坐标轴进行的几何变换,包括平移(Translate)、比例(Scale)、旋转(Rotate)、反射(Reflect)和错切(shear)5种变换。物体变换物体变换是通过变换...
  • 当我们讨论xy平面上的二维旋转时,只需考虑沿着垂直于xy平面的坐标...大多数图形软件将三维旋转作为绕三个坐标轴的二维旋转的复合而进行处理。另一种解决方案则是用户根据给定轴的方向和旋转角度建立一个总的旋转矩阵。
  • 3、实现二维图形的变换。(包括平移,放缩,旋转,错切以及复合变换) 4、运用所学的区域填充算法实现区域填充。 5、运用所学算法实现线段裁剪以及多边形裁剪(多边形裁剪为可选)。 6、自己实现其它附加以及...
  • 图形学复习2——几何变换

    千次阅读 2015-06-14 18:52:00
    图形学复习CH4 几何变换 二维变换和三维变换 基本变换和复合变换
  • 二维几何变换相比三维略简单一点但原理基本一致,下列代码实现了平移、缩放、旋转变换,并有一个复合变换矩阵保存所有变换计算后的结果,方便用其结果在OpenGL进行渲染 #include <GL/glew.h> #include <...
  • 计算机图形学课件

    2011-10-22 21:19:56
    计算机图形学课件 二维变换和裁剪 5.1 图形几何变换基础 5.2 二维图形基本几何变换矩阵 5.3 二维复合变换 5.4 窗口视区变换 5.5 Cohen-Sutherland直线裁剪算法 5.8 本章小结 5.9 习题
  • 掌握几何变换的原理,尤其是复合变换   、 实验内容: 1、利用OpenGL函数画一个三物体; 2、运用齐次坐标,采用矩阵相乘的方式自己编程实现几何变换,不能直接调用OpenGL几何变换函数; 3、利用鼠标或键盘控制...
  • 图像变换

    2015-01-05 11:54:30
    仿射变换的功能,是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(parallelness,其实是指保二维图形间的相对位置...
  • 仿射变换

    2015-10-29 08:54:43
    AffineMap)是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的...
  • 仿射变换和透射变换

    千次阅读 2017-06-12 22:45:04
    定义:仿射变换的功能是从二维坐标到二维坐标之间的线性变换,且保持二维图形的“平直性”和“平行性”。仿射变换可以通过一系列的原子变换复合来实现,包括平移,缩放,翻转,旋转和剪切。 这类变换可以用一个3*...

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

二维图形复合变换