当前位置: 首页 > ai >正文

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

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

二维变换

基本几何变换

图形的几何变换是指对图形的几何信息经过平移、比例、旋转等变换后产生新的图形。
基本几何变换都是相对于坐标原点和坐标轴进行的几何变换。

平移变换

推导:

x ′ = x + T x y ′ = y + T y x'=x+T_x\\ y'=y+T_y x=x+Txy=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} [xy]=[xy][Sx00Sy]

比例变换

比例变换是指对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} [xy]=[xy][cosθsinθsinθcosθ]

平移、缩放、旋转变换的矩阵表示:

P ′ = P ⋅ T 1 + T 2 P'=P\cdot T_1+T_2 P=PT1+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} [xy1]=[xy1] 10Tx01Ty001

比例:

[ 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} [xy1]=[xy1] Sx000Sy0001

整体比例变换:

[ 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} [xy1]=[xy1] 10001000S

旋转变换:

[ 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} [xy1]=[xy1] cosθsinθ0sinθcosθ0001

普通变换:

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+ly=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} [xy1]=[xy1] aclbdmpqs

关于x轴对称

[ 1 0 0 0 − 1 0 0 0 1 ] \begin{bmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix} 100010001

关于y轴对称

[ − 1 0 0 0 1 0 0 0 1 ] \begin{bmatrix} -1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} 100010001

关于原点对称

[ − 1 0 0 0 − 1 0 0 0 1 ] \begin{bmatrix} -1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix} 100010001

关于 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} 010100001

关于 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} 010100001

错切变换

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

在这里插入图片描述

其变换矩阵为:

[ 1 b 0 c 1 0 0 0 1 ] \begin{bmatrix} 1 & b & 0\\ c & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} 1c0b10001

二维图形几何变换的计算

  1. 点的变换

[ 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} [xy1]=[xy1] aclbdmpqr

  1. 直线的变换

    $$
    \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}
    $$

  2. 多边形的变换

在这里插入图片描述

复合变换

复合变换具有形式:

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=PT1T2T3Tn

二维复合平移:

[ 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+Tx201Ty1+Ty2001

二维复合比例

[ 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} Sx1Sx2000Sy1Sy20001

二维复合旋转

[ 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)0sin(θ1+θ2)cos(θ1+θ2)0001

相对任意一点的二维几何变换

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

  1. 平移/旋转。
  2. 针对原点进行二维几何变换。
  3. 反平移/反旋转。

光栅变换

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

光栅平移变换:

在这里插入图片描述

任意角度的光栅旋转变换:

在这里插入图片描述

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

在这里插入图片描述

变换的性质:

二维仿射变换是具有如下形式的二维坐标变换:

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)的坐标范围内形成的坐标系。

二维观察流程

引入了观察坐标系和规格化设备坐标系后,观察变换分为如下图所示的几个步骤:

应用程序→图形的用户坐标→观察坐标系→对窗口进行裁剪→视区(依据设备规范化坐标系定义)→设备坐标系→在图形设备上输出

整体缩放效果

在这里插入图片描述

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

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

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

在这里插入图片描述

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

在这里插入图片描述

窗口到视区的变换

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

  1. 将窗口左下角点移至用户系统系的坐标原点。
  2. 针对原点进行比例变换。
  3. 进行反平移。

在这里插入图片描述

裁剪

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

已知:

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

在这里插入图片描述

实交点:直线段与窗口矩形边界的交点。

虚交点:处于直线段延长线或窗口边界延长线上的交点。

Cohen-Sutherland 算法

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

编码规则如下

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

在这里插入图片描述

步骤:

  1. 判断:裁剪一条线段时,先求出直线段端点p1和p2的编码code1和code2“
    a. 若code1=code2=0,对直线段简取之;
    b. 若code1&code2≠0,对直线段简弃之;

  2. 求交点:若上述判断条件不成立,则需求出直线段与窗口边界的交点。

    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(x2x1)y1+u(y2y1)

对于直线上一点(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(x2x1)<=wxrwxb<=y1+u(y2y1)<=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值:

在这里插入图片描述

算法步骤

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

多边形裁剪

在这里插入图片描述

基本思想:

  1. 将多边形的边界作为一个整体。
  2. 每次用窗口的一条边界对要裁剪的多边形进行裁剪。
  3. 体现分而治之的思想。

策略:

  • 为窗口各边界裁剪的多边形存储输入与输出顶点表。
    • 在窗口的一条裁剪边界处理完所有顶点后,其输出顶点表将用窗口的下一条边界继续裁剪。
  • 窗口的一条边以及延长线构成的裁剪线把平面分为两个区域
    • 包含窗口区域的区域称为可见侧。
    • 不包含窗口区域的域为不可见侧。

在这里插入图片描述

在这里插入图片描述

Weiler-Atherton多边形裁剪

思想:

  1. 假定按顺时针方向处理顶点,且将用户多边形定义为Ps,窗口矩形为Pw。

  2. 从Ps的任一点出发,跟踪检测Ps的每一条边,当Ps与Pw相交时(实交点),按如下规则处理:

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

    在这里插入图片描述

http://www.xdnf.cn/news/3796.html

相关文章:

  • 多语言笔记系列:Polyglot Notebooks 多种使用方式
  • [2025]MySQL的事务机制是什么样的?redolog,undolog、binog三种日志的区别?二阶段提交是什么?ACID怎么保证的?主从复制的过程?
  • JVM happens-before 原则有哪些?
  • 利用KMP找出模式串在目标串中所有匹配位置的起始下标
  • 【25软考网工】第五章(4)ARP和RARP
  • 【Touching China】2007-2011
  • Go语言--语法基础4--基本数据类型--类型转换
  • MPI,Pthreads和OpenMP等并行实验环境配置
  • 【第三十四周】多模态大模型调研
  • Uni-app 组件使用
  • 什么是Linux中的systemd?
  • leetcode 59. 螺旋矩阵 II
  • 小土堆pytorch--tensorboard的使用
  • 【c++深入系列】:万字详解vector(附模拟实现的vector源码)
  • Spring MVC的工作流程, DispatcherServlet 的工作流程
  • 25.1linux中外置RTC芯片的PCF8563实验(知识)_csdn
  • 嵌入式GPIO 实验(流水灯程序,八段数码管显示程序)
  • Kubernetes 安装 kubectl
  • Qt实现 hello world + 内存泄漏(5)
  • C++学习:六个月从基础到就业——C++11/14:lambda表达式
  • MATLAB实现二氧化硅和硅光纤的单模光波特性与仿真
  • 打印Excel表格时单元格文字内容被下一行遮盖的解决方法
  • CPU 的指令集存放在什么地方?
  • 深度解析ZFNet:微调优化与可视化创新
  • 【现代深度学习技术】现代循环神经网络06:编码器-解码器架构
  • WPF中Behaviors
  • JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过
  • Python速成系列二
  • 多段线和二维多段线的区别及顶点遍历
  • Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试