大连理工大学选修课——图形学:第五章 二维变换及二维观察 ...

打印 上一主题 下一主题

主题 1702|帖子 1702|积分 5106

第五章 二维变换及二维观察

二维变换

基本几何变换

图形的几何变换是指对图形的几何信息颠末平移、比例、旋转等变换后产生新的图形。
基本几何变换都是相对于坐标原点和坐标轴进行的几何变换。
平移变换
推导:
                                                    x                               ′                                      =                            x                            +                                       T                               x                                                          y                               ′                                      =                            y                            +                                       T                               y                                            x'=x+T_x\\ y'=y+T_y                     x′=x+Tx​y′=y+Ty​
矩阵形式
                                         [                                       x                               ′                                                          y                               ′                                      ]                            =                            [                            x                                     y                            ]                            ⋅                                       [                                                                                                     S                                              x                                                                                                            0                                                                                                                   0                                                                                                             S                                              y                                                                                                ]                                            [x'\quad y']=[x\quad y]\cdot \begin{bmatrix} S_x & 0\\ 0 & S_y \end{bmatrix}                     [x′y′]=[xy]⋅[Sx​0​0Sy​​]
比例变换
比例变换是指对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放缩Sy倍。
推导(极坐标):
                                         x                            =                            r                            cos                            ⁡                            α                                     y                            =                            r                            sin                            ⁡                            α                                                x                               ′                                      =                            r                            cos                            ⁡                            (                            α                            +                            θ                            )                            =                            x                            cos                            ⁡                            θ                            −                            y                            sin                            ⁡                            θ                                                y                               ′                                      =                            r                            sin                            ⁡                            (                            α                            +                            θ                            )                            =                            x                            sin                            ⁡                            θ                            +                            y                            cos                            ⁡                            θ                                  x=r\cos\alpha\qquad y=r\sin\alpha\\ x'=r\cos(\alpha+\theta)=x\cos\theta-y\sin\theta\\ y'=r\sin(\alpha+\theta)=x\sin\theta+y\cos\theta                     x=rcosαy=rsinαx′=rcos(α+θ)=xcosθ−ysinθy′=rsin(α+θ)=xsinθ+ycosθ
矩阵:逆时针旋转                                   θ                              \theta                  θ角
                                         [                                       x                               ′                                                          y                               ′                                      ]                            =                            [                            x                                     y                            ]                            ⋅                                       [                                                                                                     cos                                              ⁡                                              θ                                                                                                                            sin                                              ⁡                                              θ                                                                                                                                                  −                                              sin                                              ⁡                                              θ                                                                                                                            cos                                              ⁡                                              θ                                                                                                ]                                            [x'\quad y']=[x\quad y]\cdot \begin{bmatrix} \cos\theta & \sin\theta\\ -\sin\theta & \cos\theta \end{bmatrix}                     [x′y′]=[xy]⋅[cosθ−sinθ​sinθcosθ​]
平移、缩放、旋变化换的矩阵表示:
                                                    P                               ′                                      =                            P                            ⋅                                       T                               1                                      +                                       T                               2                                            P'=P\cdot T_1+T_2                     P′=P⋅T1​+T2​
其中Sx和Sy称为比例系数。
规范化齐次坐标

齐次坐标表示就是用                                   n                         +                         1                              n+1                  n+1维向量表示一个                                   n                              n                  n维向量
                                         (                            x                            ,                            y                            )                            ←                            (                            x                            ,                            y                            ,                            1                            )                                  (x,y)\leftarrow(x,y,1)                     (x,y)←(x,y,1)
平移:
                                         [                                       x                               ′                                                          y                               ′                                               1                            ]                            =                            [                            x                                     y                                     1                            ]                            ⋅                                       [                                                                                     1                                                                                             0                                                                                             0                                                                                                                   0                                                                                             1                                                                                             0                                                                                                                                   T                                              x                                                                                                                            T                                              y                                                                                                            1                                                                                 ]                                            [x'\quad y'\quad 1]=[x\quad y\quad 1]\cdot\begin{bmatrix}1 & 0 & 0\\ 0 & 1 & 0\\T_x& T_y & 1 \end{bmatrix}                     [x′y′1]=[xy1]⋅               ​10Tx​​01Ty​​001​               ​
比例:
                                         [                                       x                               ′                                                          y                               ′                                               1                            ]                            =                            [                            x                                     y                                     1                            ]                            ⋅                                       [                                                                                                     S                                              x                                                                                                            0                                                                                             0                                                                                                                   0                                                                                                             S                                              y                                                                                                            0                                                                                                                   0                                                                                             0                                                                                             1                                                                                 ]                                            [x'\quad y'\quad 1]=[x\quad y\quad 1]\cdot\begin{bmatrix}S_x & 0 & 0\\ 0 & S_y & 0\\0& 0 & 1 \end{bmatrix}                     [x′y′1]=[xy1]⋅               ​Sx​00​0Sy​0​001​               ​
整体比例变换:
                                         [                                       x                               ′                                                          y                               ′                                               1                            ]                            =                            [                            x                                     y                                     1                            ]                            ⋅                                       [                                                                                     1                                                                                             0                                                                                             0                                                                                                                   0                                                                                             1                                                                                             0                                                                                                                   0                                                                                             0                                                                                             S                                                                                 ]                                            [x'\quad y'\quad 1]=[x\quad y\quad 1]\cdot\begin{bmatrix}1 & 0 & 0\\ 0 & 1 & 0\\0& 0 & S \end{bmatrix}                     [x′y′1]=[xy1]⋅               ​100​010​00S​               ​
旋变化换:
                                         [                                       x                               ′                                                          y                               ′                                               1                            ]                            =                            [                            x                                     y                                     1                            ]                            ⋅                                       [                                                                                                     cos                                              ⁡                                              θ                                                                                                                            sin                                              ⁡                                              θ                                                                                                            0                                                                                                                                   −                                              sin                                              ⁡                                              θ                                                                                                                            cos                                              ⁡                                              θ                                                                                                            0                                                                                                                   0                                                                                             0                                                                                             1                                                                                 ]                                            [x'\quad y'\quad 1]=[x\quad y\quad 1]\cdot \begin{bmatrix} \cos\theta & \sin\theta & 0\\ -\sin\theta & \cos\theta & 0\\ 0& 0 & 1 \end{bmatrix}                     [x′y′1]=[xy1]⋅               ​cosθ−sinθ0​sinθcosθ0​001​               ​
普通变换:
                                                    x                               ′                                      =                                                   a                                  x                                  +                                  c                                  y                                  +                                  l                                                      p                                  x                                  +                                  q                                  y                                  +                                  s                                                                     y                               ′                                      =                                                   b                                  x                                  +                                  d                                  y                                  +                                  m                                                      p                                  x                                  +                                  q                                  y                                  +                                  s                                                       x'=\frac{ax+cy+l}{px+qy+s}\quad y'=\frac{bx+dy+m}{px+qy+s}                     x′=px+qy+sax+cy+l​y′=px+qy+sbx+dy+m​
                                         [                                       x                               ′                                                          y                               ′                                               1                            ]                            =                            [                            x                                     y                                     1                            ]                            ⋅                                       [                                                                                     a                                                                                             b                                                                                             p                                                                                                                   c                                                                                             d                                                                                             q                                                                                                                   l                                                                                             m                                                                                             s                                                                                 ]                                            [x'\quad y'\quad 1]=[x\quad y\quad 1]\cdot \begin{bmatrix} a & b & p\\ c & d & q\\ l & m & s \end{bmatrix}                     [x′y′1]=[xy1]⋅               ​acl​bdm​pqs​               ​
关于x轴对称
                                         [                                                                              1                                                                                      0                                                                                      0                                                                                                          0                                                                                                     −                                           1                                                                                                    0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​100​0−10​001​               ​
关于y轴对称
                                         [                                                                                             −                                           1                                                                                                    0                                                                                      0                                                                                                          0                                                                                      1                                                                                      0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} -1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​−100​010​001​               ​
关于原点对称
                                         [                                                                                             −                                           1                                                                                                    0                                                                                      0                                                                                                          0                                                                                                     −                                           1                                                                                                    0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} -1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​−100​0−10​001​               ​
关于                                   y                         =                         x                              y=x                  y=x轴对称
                                         [                                                                              0                                                                                      1                                                                                      0                                                                                                          1                                                                                      0                                                                                      0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} 0 & 1 & 0\\ 1 & 0 & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​010​100​001​               ​
关于                                   y                         =                         −                         x                              y=-x                  y=−x轴对称
                                         [                                                                              0                                                                                                     −                                           1                                                                                                    0                                                                                                                         −                                           1                                                                                                    0                                                                                      0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} 0 & -1 & 0\\ -1 & 0 & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​0−10​−100​001​               ​
错切变换

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

其变换矩阵为:
                                         [                                                                              1                                                                                      b                                                                                      0                                                                                                          c                                                                                      1                                                                                      0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} 1 & b & 0\\ c & 1 & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​1c0​b10​001​               ​
二维图形几何变换的盘算

  • 点的变换
                                         [                                       x                               ′                                                          y                               ′                                               1                            ]                            =                            [                            x                                     y                                     1                            ]                            ⋅                                       [                                                                                     a                                                                                             b                                                                                             p                                                                                                                   c                                                                                             d                                                                                             q                                                                                                                   l                                                                                             m                                                                                             r                                                                                 ]                                            [x'\quad y'\quad 1]=[x\quad y\quad 1]\cdot \begin{bmatrix} a & b & p\\ c & d & q\\ l & m & r \end{bmatrix}                     [x′y′1]=[xy1]⋅               ​acl​bdm​pqr​               ​

  • 直线的变换
    $$
    \begin{bmatrix}
    x_1’&y_1’&1\
    x_2’&y_2’&1
    \end{bmatrix}


    \begin{bmatrix}
    x_1&y_1&1\
    x_2&y_2&1
    \end{bmatrix}
    \cdot
    \begin{bmatrix}
    a &b &p\
    c &d &q\
    l &m &r
    \end{bmatrix}
    $$
  • 多边形的变换

复合变换

复合变换具有形式:
                                                    P                               ′                                      =                            P                            ⋅                                       T                               1                                      ⋅                                       T                               2                                      ⋅                                       T                               3                                      ⋯                                       T                               n                                            P'=P\cdot T_1\cdot T_2\cdot T_3\cdots T_n                     P′=P⋅T1​⋅T2​⋅T3​⋯Tn​
二维复合平移:
                                         [                                                                              1                                                                                      0                                                                                      0                                                                                                          0                                                                                      1                                                                                      0                                                                                                                                         T                                                               x                                                 1                                                                          +                                                           T                                                               x                                                 2                                                                                                                                                                  T                                                               y                                                 1                                                                          +                                                           T                                                               y                                                 2                                                                                                                                   1                                                                          ]                                  \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ T_{x1}+T_{x2} & T_{y1}+T_{y2} & 1 \end{bmatrix}                                    ​10Tx1​+Tx2​​01Ty1​+Ty2​​001​               ​
二维复合比例
                                         [                                                                                                             S                                                               x                                                 1                                                                          ⋅                                                           S                                                               x                                                 2                                                                                                                                   0                                                                                      0                                                                                                          0                                                                                                                     S                                                               y                                                 1                                                                          ⋅                                                           S                                                               y                                                 2                                                                                                                                   0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} S_{x1}\cdot S_{x2} & 0 & 0\\ 0 & S_{y1}\cdot S_{y2} & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​Sx1​⋅Sx2​00​0Sy1​⋅Sy2​0​001​               ​
二维复合旋转
                                         [                                                                                             cos                                           ⁡                                           (                                                           θ                                              1                                                          +                                                           θ                                              2                                                          )                                                                                                                   sin                                           ⁡                                           (                                                           θ                                              1                                                          +                                                           θ                                              2                                                          )                                                                                                    0                                                                                                                         −                                           sin                                           ⁡                                           (                                                           θ                                              1                                                          +                                                           θ                                              2                                                          )                                                                                                                   cos                                           ⁡                                           (                                                           θ                                              1                                                          +                                                           θ                                              2                                                          )                                                                                                    0                                                                                                          0                                                                                      0                                                                                      1                                                                          ]                                  \begin{bmatrix} \cos(\theta_1+\theta_2) & \sin(\theta_1+\theta_2) & 0\\ -\sin(\theta_1+\theta_2) &\cos(\theta_1+\theta_2) & 0\\ 0 & 0 & 1 \end{bmatrix}                                    ​cos(θ1​+θ2​)−sin(θ1​+θ2​)0​sin(θ1​+θ2​)cos(θ1​+θ2​)0​001​               ​
相对恣意一点的二维几何变换

相对某个参考点(xF,yF)作二维几何变换,其变换过程为:

  • 平移/旋转。
  • 针对原点进行二维几何变换。
  • 反平移/反旋转。
光栅变换

直接对帧缓存中象素点进行操作的变换称为光栅变换。
光栅平移变换:

恣意角度的光栅旋变化换:

光栅比例变换:进行地区的映射处理处罚

变换的性子:

二维仿射变换是具有如下形式的二维坐标变换:
                                                    x                               ′                                      =                            a                            x                            +                            b                            y                            +                            m                                                y                               ′                                      =                            c                            x                            +                            d                            y                            +                            n                                  x'=ax+by+m\\ y'=cx+dy+n                     x′=ax+by+my′=cx+dy+n
平移、比例、旋转、错切和反射等变换均是二维仿射变换的特例,反过来,任何常用的二维仿射变换总可以表示为这五种变换的复合。


  • 仅包含旋转、平移和反射的仿射变换维持角度和长度的稳定性。
  • 比例变换可改变图形的巨细和外形。
  • 错切变换引起图形角度关系的改变,甚至导致图形发生畸变。
二维观察

一些界说

窗口:将在用户坐标系中需要进行观察和处理处罚的一个坐标地区。
视区:将窗口映射到显示装备上的坐标(NDC)地区。
观察变换: 为了将窗口内的图形在视区中显示出来,颠末将窗口到视区的变换处理处罚。

观察坐标系: 依据窗口的方向和外形在用户坐标平面中界说的直角坐标系。
规格化装备坐标系:将二维的装备坐标系规格化到(0.0,0.0)到(1.0,1.0)的坐标范围内形成的坐标系。
二维观察流程
引入了观察坐标系和规格化装备坐标系后,观察变换分为如下图所示的几个步骤:
应用程序→图形的用户坐标→观察坐标系→对窗口进行裁剪→视区(依据装备规范化坐标系界说)→装备坐标系→在图形装备上输出
整体缩放结果

用户坐标系到观察坐标系的变换

用户坐标系到观察坐标系的变换分由两个变换步骤合成:

  • 将观察坐标系原点移动到用户坐标系原点


  • 绕原点旋转使两坐标系重合

窗口到视区的变换

将窗口内的点(xw,yw)映射到相对应的视区内的点(xv,yv)需进行以下步骤:

  • 将窗口左下角点移至用户体系系的坐标原点。
  • 针对原点进行比例变换。
  • 进行反平移。

裁剪

界说:在观察坐标系下对窗口进行裁剪,即只保留窗口内的那部分图形,去掉窗口外的图形。
已知:

  • 窗口边界wxl,wxr,wyb,wyt的坐标值。
  • 直线段端点p1p2的坐标值x1,y1,x2,y2。

实交点:直线段与窗口矩形边界的交点。
虚交点:处于直线段延长线或窗口边界延长线上的交点。
Cohen-Sutherland 算法

编码:对于任一端点(x,y),根据其坐标所在的地区,赋予一个4位的二进制码D3D2D1D0。
编码规则如下

  • 若x<wxl,D0=1,否则D0=0;
  • 若x>wxr,D1=1,否则D1=0;
  • 若y<wyb,D2=1,否则D2=0;
  • 若y>wyt,D3=1,否则D3=0。

步骤:

  • 判断:裁剪一条线段时,先求出直线段端点p1和p2的编码code1和code2“
    a. 若code1=code2=0,对直线段简取之;
    b. 若code1&code2≠0,对直线段简弃之;
  • 求交点:若上述判断条件不建立,则需求出直线段与窗口边界的交点。
    a. 左、右边界交点的盘算:y = y1 + k(x - x1);
    b. 上、下边界交点的盘算:x = x1 + (y-y1)/k。
    (其中,k=(y2-y1)/(x2-x1))

(+)用编码方法实现了对完全可见和不可见直线段的快速接受和拒绝;
(–)求交过程复杂,有冗余盘算,而且包含浮点运算,倒霉于硬件实现。
Liang-Barsky 算法

直线的参数方程:
                                                                                                     x                                        =                                                                                                                                      x                                           1                                                      +                                        u                                        ⋅                                        (                                                       x                                           2                                                      −                                                       x                                           1                                                      )                                                                                                                                                          y                                        =                                                                                                                                      y                                           1                                                      +                                        u                                        ⋅                                        (                                                       y                                           2                                                      −                                                       y                                           1                                                      )                                                                                                    \begin{align} x =& x_1 + u \cdot (x_2 - x_1) \\ y =& y_1 + u \cdot (y_2 - y_1) \end{align}                     x=y=​x1​+u⋅(x2​−x1​)y1​+u⋅(y2​−y1​)​​
对于直线上一点(x,y),若它在窗口内则有:
                                                                                                     w                                        x                                        l                                        <                                        =                                                       x                                           1                                                      +                                        u                                        ⋅                                        (                                                       x                                           2                                                      −                                                       x                                           1                                                      )                                        <                                        =                                        w                                        x                                        r                                                                                                                                                          w                                        x                                        b                                        <                                        =                                                       y                                           1                                                      +                                        u                                        ⋅                                        (                                                       y                                           2                                                      −                                                       y                                           1                                                      )                                        <                                        =                                        w                                        y                                        t                                                                                                    \begin{align} wxl <= x_1 + u\cdot(x_2 - x_1) <= wxr\\ wxb <= y_1 + u\cdot(y_2 - y_1) <= wyt \end{align}                     wxl<=x1​+u⋅(x2​−x1​)<=wxrwxb<=y1​+u⋅(y2​−y1​)<=wyt​​

令:

则有:



  • 任何平行于剪切边界之一的直线                                                    p                               k                                      =                            0                                  p_k = 0                     pk​=0, 其中 k 对应于该剪切边界(k=1,2,3,4 对应于左、右、下、上边界)

    • 如果                                                                q                                     k                                              >                                  =                                  0                                          q_k > = 0                           qk​>=0 ,则线段位于边界之内。
    • 如果还满意                                                                q                                     k                                              <                                  0                                          q_k < 0                           qk​<0 ,则线段完全在边界之外,因此舍弃该线段。

  • 当pk<0, 线段从剪切边界延长线的外部延长到内部。
  • 当pk>0,线段从剪切边界延长线的内部延长到外部。
  • 当pk≠0,可以盘算出线段与边界k的延长线的交点的u值:

算法步骤


  • 输入直线段的两端点坐标:(x1,y1)和(x2,y2),以及窗口的四条边界坐标:wyt、wyb、wxl和wxr。
  • 若Δx=0,则p1=p2=0。此时进一步判断是否满意q1<0或q2<0,若满意,则该直线段不在窗口内,算法竣事。否则,满意q1>0且q2>0,则进一步盘算u1和u2。算法转(5)。
  • 若Δy=0,则p3=p4=0。此时进一步判断是否满意q3<0或q4<0,若满意,则该直线段不在窗口内,算法竣事。否则,满意q3>0且q4>0,则进一步盘算u3和u4。算法转(5)。
  • 若上述两条均不满意,则有pk≠0(k=1,2,3,4)。此时盘算u1u2,u3和u4。求出(umax,umin)赋值给(u1,u2)
  • 求得u1和u2后,进行判断:若u1>u2,或者u1>1,则直线段在窗口外,算法竣事。若u1<u2,利用直线的参数方程求得直线段在窗口内的两端点坐标。
  • 利用直线的扫描转换算法绘制在窗口内的直线段。算法竣事。
多边形裁剪


基本思想:

  • 将多边形的边界作为一个整体。
  • 每次用窗口的一条边界对要裁剪的多边形进行裁剪。
  • 表现分而治之的思想。
策略:


  • 为窗口各边界裁剪的多边形存储输入与输出顶点表。

    • 在窗口的一条裁剪边界处理处罚完所有顶点后,其输出顶点表将用窗口的下一条边界继续裁剪。

  • 窗口的一条边以及延长线构成的裁剪线把平面分为两个地区

    • 包含窗口地区的地区称为可见侧。
    • 不包含窗口地区的域为不可见侧。



Weiler-Atherton多边形裁剪

思想:

  • 假定按顺时针方向处理处罚顶点,且将用户多边形界说为Ps,窗口矩形为Pw。
  • 从Ps的任一点出发,跟踪检测Ps的每一条边,当Ps与Pw相交时(实交点),按如下规则处理处罚:

    • 若是由不可见侧进入可见侧,则输出可见直线段,转(3)
    • 若是由可见侧进入不可见侧,从当前交点开始,沿窗口边界顺时针检测Pw的边,用窗口的有效边界去裁剪Ps的边,找到Ps与Pw最靠近当前交点的另一交点,输出可见直线段和由当前交点到另一交点之间窗口边界上的线段,然后返回处理处罚的当前交点
    • 沿着Ps处理处罚各条边,直到处理处罚完Ps的每一条边,回到起点为止



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表