opcv学习日志三 几何变换 1

来源:互联网 发布:55开淘宝店 编辑:程序博客网 时间:2024/06/05 00:46

     几何变换也可称为建模变换。      

     我们利用扫描算法,可以将凸缘显示在光栅设备。

     建模变换一般用于构造厂家或给出由多个部分组合而成的复杂对象的层次描述。

     有些图形系统提供2套变换子程序,而其他一些软件包则提供一套能同时用于几何变换和建模变换的函数。


     平移,旋转,缩放是所有图形软件包中都含有的几何变换函数。其他可能包括在图形软件包中的变换

由反射和错切操作。

     平移向量 translation vector           位移向量 shift vector

      二维向量

         平移向量  平移矩阵
   
         二维旋转
        
   一个对象的二维旋转通过在xy平面沿圆路径将对象重新定位来实现。

     旋转方程的矩阵形式:P'=R.P
    缩放:
         当Sx,Sy值不等时将产生设计应用中常见的差值缩放 differential scaling,图形由少数形状经缩放和定位变换来构造。缩放系数可以为负值,不仅改变对象的尺寸,还相对于一个或多个坐标轴的反射。
      缩放系数绝对值小于1时,缩放后的对象向原点靠近;缩放系数绝对值大于1时,缩放后的坐标位置远离原点。
      固定点:选择一个缩放变换后不改变位置的点,以控制缩放后对象的位置。固定点的坐标可以选择对象的中点等位置或者其他空间位置。多边形通过缩放每个顶点到固定点的距离而相对固定点进行缩放。
    缩放由加法项和乘法项组成。
    齐次坐标:
            homogeneous parameter h非零值。

     二维矩阵

             二维平移矩阵:
            
            二维旋转矩阵;
   
        二维缩放矩阵:
   

  逆变换

    逆平移变换;通过对平移距离取负值得到逆矩阵。
    逆旋转通过用旋转角度的负角取代旋转角度来实现。
    逆缩放系数用其倒数取代就得到了缩放变换的逆矩阵。

二维复合

通用二维基准点

     当图形软件包仅提供绕坐标系原点旋转函数时,我们可以通过平移-旋转-平移操作序列来实现绕任意选定的基准点的旋转。

  二维基准点缩放:
   通用二维定向缩放:正方形变成平行四边形

通用二维复合变换和计算效率

二维刚体变换

   如果一个变换矩阵仅包含平移和旋转参数,则它是一个刚体变换矩阵。

左上角的2*2是一正交矩阵 orthogonal matrix的特性。

反射

     产生对象镜像的变换为反射 reflection.对二维反射,其反射镜像通过将对象绕反射轴旋转180度而生成。

错切:

       错切 shear 是一种对象形状发生变化的变换,经过错切的对象好像是由已经相互滑动的内部夹层组成。2种常见的错切变换是移动x坐标值的错切和移动y坐标值的错切。

反射:


反转

一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。生活中常见的物体表面,通常都可以用这样的“正面”和“反面”,“合理的”被表现出来(请找一个比较透明的矿泉水瓶子,在正对你的一面沿逆时针画一个圆,并标明画的方向,然后将背面转为正面,画一个类似的圆,体会一下“正面”和“反面”。你会发现正对你的方向,瓶的外侧是正面,而背对你的方向,瓶的内侧才是正面。正对你的内侧和背对你的外侧则是反面。这样一来,同样属于“瓶的外侧”这个表面,但某些地方算是正面,某些地方却算是反面了)。


glFrontFace(GL_CCW);   // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针

glFrontFace(GL_CW);    // 设置CW方向为“正面”,CW即ClockWise,顺时针

下面是一个示例程序,请用它替换第一课中的myDisplay函数,并将glFrontFace(GL_CCW)修改为glFrontFace(GL_CW),并观察结果的变化。

void myDisplay(void)

{

     glClear(GL_COLOR_BUFFER_BIT);

     glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式

     glPolygonMode(GL_BACK, GL_LINE);   // 设置反面为线形模式

     glFrontFace(GL_CCW);               // 设置逆时针方向为正面

     glBegin(GL_POLYGON);               // 按逆时针绘制一个正方形,在左下方

         glVertex2f(-0.5f, -0.5f);

         glVertex2f(0.0f, -0.5f);

         glVertex2f(0.0f, 0.0f);

         glVertex2f(-0.5f, 0.0f);

     glEnd();

     glBegin(GL_POLYGON);               // 按顺时针绘制一个正方形,在右上方

         glVertex2f(0.0f, 0.0f);

         glVertex2f(0.0f, 0.5f);

         glVertex2f(0.5f, 0.5f);

         glVertex2f(0.5f, 0.0f);

     glEnd();

     glFlush();

}



原创粉丝点击