第五章 二维变换及二维观察
二维变换
基本几何变换
图形的几何变换是指对图形的几何信息颠末平移、比例、旋转等变换后产生新的图形。
基本几何变换都是相对于坐标原点和坐标轴进行的几何变换。
平移变换
推导:
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} [x′y′]=[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} [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]⋅ 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} [x′y′1]=[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} [x′y′1]=[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} [x′y′1]=[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} [x′y′1]=[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} 1000−10001
关于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} −1000−10001
关于 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} 0−10−100001
错切变换
错切变换,也称为剪切、错位变换,用于产生弹性物体的变形处理处罚。
其变换矩阵为:
[ 1 b 0 c 1 0 0 0 1 ] \begin{bmatrix} 1 & b & 0\\ c & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} 1c0b10001
二维图形几何变换的盘算
[ 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]⋅ aclbdmpqr
- 直线的变换
$$
\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+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} Sx1⋅Sx2000Sy1⋅Sy20001
二维复合旋转
[ 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)作二维几何变换,其变换过程为:
- 平移/旋转。
- 针对原点进行二维几何变换。
- 反平移/反旋转。
光栅变换
直接对帧缓存中象素点进行操作的变换称为光栅变换。
光栅平移变换:
恣意角度的光栅旋变化换:
光栅比例变换:进行地区的映射处理处罚
变换的性子:
二维仿射变换是具有如下形式的二维坐标变换:
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企服之家,中国第一个企服评测及商务社交产业平台。 |