二维图形转换Word文档下载推荐.docx
《二维图形转换Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二维图形转换Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
如图2-1所示。
一般视窗口的四条边界分别为:
左边界x=x1、右边界x=x2.下边界y=y1,上边界y=y2。
视口的四条边界分别为:
左边界sx=sx1,右边界sx=sx2,上边界sy=sy1,下边界sy=sy2。
经变换后应有,窗口的上边界线段(或下边界线段)长x2-x1变换成视口上边界线段(或下边界线段)长sx2-sx1。
设其比例变换因子为k1,则可得
k1*(x2-x1)=sx2-sx1
k1=(sx2-sx1)/(x2-x1)
对窗口内任一x坐标(x1<
=x<
=x2)变换后为视口内水平方向sx坐标(sx1<
=sx<
=sx2)。
由上述有:
k1*(x-x1)=sx-sx1
sx=sx1+k1*(x-x1)
=sx1+(x-x1)*(sx2-sx1)/(x2-x1)
同样,经变换后窗口的左边界线段(或右边界线段)长y2-y1变换成视口左边界线段(或右边界线段)长sy2-sy1。
设其比例变换因子为k2,则可得
k2*(y2-y1)=sy2-sy1
k2=(sy2-sy1)/(y2-y1)
对窗口内任一y坐标(y1<
=y<
=y2)变换后为视口内垂直sy坐标(sy1<
=sy<
=sy2),应有
k2*(y-y1)=sy-sy1
sy=sy1+k2*(y-y1)
=sy1+(y-y1)*(sy2-sy1)/(y2-y1)
于是对窗口内图形上任一点坐标(x,y)变换到屏幕上视口内成为(sx,sy),则
sx=sx1+(x-x1)*(sx2-sx1)/(x2-x1)
sy=sy1+(y-y1)*(sy2-sy1)/(y2-y1)
写成简式
sx=k1*x+a
sy=k2*y+b
这里
a=sx1-k1*x1
b-sy1-k2*y1
2.实型值到整型值的变换
上面对窗口内图形上任一点坐标(x,y)变换到屏幕上视口内成为(sx,sy),
sy=k2*y+bk1,k2,a,b同上
这样计算出来的sx,sy一般是实型值,而屏幕上视口内屏幕坐标是整型值,因此要将sx,sy实型值转换成屏幕坐标系的整型值。
这可以通过四舍五入的方法将实型值的绝对值圆整化。
由于c语言中已经替我们想到了这点,它提供的函数可以自动取整,因此用户在调用标准函数在屏幕上绘图时一般不需要考虑这个问题。
当然也可以用赋值的类型转换规则来实现实型值到整型值的变换。
3.y坐标值方向变换
一般屏幕坐标系是直角左手系,y轴方向向下为正,原点在屏幕的左上角,如图2-2所示。
<
css.shtml'
target='
_blank'
title='
div视频教程'
>
divalign=left>
窗口内图形上任一点(x,y)变换到视口内成为(sx,xy),而(x,y)是相对用户坐标系(直角右手系)的。
(sx,sy)是相对屏幕坐标系(直角左手系)的,因此y轴方向相反。
为使窗口内图形变换到视口上图形其外形一致,需将视口上图形y轴方向变换成窗口内图形y轴方向。
这只要将求得的视口内各点的sy整型坐标均用sy2去减,即sy2-sy(整型)代替sy(整型)即可,经这样的坐标轴方向变换后得到的视口内图形与窗口内图形一致。
4.长宽比例变换
屏幕坐标系x方向与y方向上的刻度可能不一样,这取决于水平方向像素间距与垂直方向偈素间距大小是否一致。
假如两个方向的刻度不相等,那么用户坐标系下一个正方形将显示(或绘制)成为一个长方形有,一个圆将成为一个椭圆。
为保持原图形的长宽比。
使图形显示(或绘制)后不走样,需求出屏幕上两侍标轴刻度的比值(即纵横比)。
可以用函数getaspectratio()(见前文所述)返回x方向和y方向的比例数,从而求得这个比值。
再瘵原图形y方向坐标乘以该比值,这样显示(或绘制)出来的图形应不走样。
若不考虑图形的走样,就不必作这个变换。
图形的几何变换一般是指对图形的几何信息经过变换后产生新的图形,图形几何变换既可以看作是坐标系不动而图形变动,变动后的图形在坐标系中的坐标值发生变化;
出可以看作图形不动而坐标系变动,变动后的图形在新坐标系下具有新的坐标值。
这两种情况本质上都是一样的,都是图形由新的坐标值表示,因此是新产生的图形。
图形几何变换包括比例变换、对称变换、错切变换、旋转变换、平移变换及其复合变换。
图形上所有的点在几何变换前后的坐标关系一般用解析几何方法可以求得,但这些几何关系用矩阵方法表示,运算更为方便。
一、基本变换
图形基本几何变换是指比例变换、对称变换、错切变换、旋转变换和平移变换等。
除平移变换外,这里其它四种几何变换都可以用组成图形的点向量(或称1×
2阶矩阵)和2×
2阶变换矩阵相乘表示,而平移变换需引入新方法来实现。
1、比例变换
设图形上一点P(x,y),经比例变换后成为新的菜上一点P'
(x'
y'
),即有
x'
=a*x
y'
=d*y
式中a,d为比例因子
将此比例变换式写成矩阵式得
a0
[x'
]=[xy]=[xy]*T
0d
这里T=叫做比例变换矩阵。
若a=d,则x,y坐标按同一比例变换。
当a=d>
1时,图形放大;
当0<
a=d<
1时,
图形缩小。
若a≠d,则x,y坐标按各自不同比例变换。
30
例1:
设有比例变换矩阵T=,三角形abc经过比例变换成为三角形a'
b'
c'
。
如图2-3所示。
01
a[12]=[32]a'
b[22]=[62]b'
c[23]=[63]c'
2.对称变换
图形上一点P(x,y)经关于原点对称变换后成为新图形上一点P'
),则
=-x
=-y
写成矩阵形式成为
-10
]=[xy]=[xy]*T
0-1
这里T=为关于原点对称变换矩阵。
若关于x轴对称,则对称变换的矩阵表示为
10
于是关于x轴对称变换矩阵T=
若关于y轴对称,则对称变换的矩阵表示为
于是关于y轴对称变换矩阵T=
若关于直线y=-x对称,则对称变换矩阵表示为
于是关于直线y=x对称变换矩阵T=
各种对称变换的图形均可由实例程序绘出,参见实例程序图形。
3.错切变换
对图形的任一点P(x,y),作线性变换如下
=x+by
=y+dx
式中b,d为不全为零的常数,点P'
)为新图形上相应的点,这个变换称为图形的错切变换。
错切变换的矩阵表示为
1d
b1
T=叫做错切变换矩阵(b,d不全为零)。
①当d=0时,x'
=x+by,y'
=y,这时图形的y坐标不变,x坐标值随(x,y)及系数b作线性变化。
若b>
0时,图形沿x轴作错切位移;
若b<
0,图形沿x轴负向作错切位移。
②当b=0时,x'
=x,y'
=dx+y,此时图形的x坐标不变y坐标随(x,y)及系数d作线性变化。
如d>
0,图形沿y轴正向作错切位移;
如d<
0,图形沿y轴负向作错切位移。
③当b≠0且d≠0时,x'
=y+dx,图形沿x,y两个方向作错切位移。
12
例2:
设有错切变换矩阵T=,正方形abcd经此错切变换成为四边形a'
d'
,如图2-4所示。
a[00]=[00]a'
b[10]=[12]b'
c[11]=[13]c'
d[01]=[01]d'
4.旋转变换
设图形上一点P(x,y)绕原点逆时针旋转θ角后成为新的图形上一点P'
),则由解析几何方法可得
=xcosθ+ysinθ
=-xsinθ+ycosθ
用矩阵表示为
cosθ-sinθ
sinθcosθ
这里T=为绕原点逆时针变换矩阵。
若顺时针旋转时,θ角为负值。
5.平移变换
若图形上一点P(x,y)沿x轴平移l距离,沿y轴平移m距离后成为新的图形上一点P'
),则有
=x+l
=y+m
式中l,m不全为零,这称为平移变换。
但此变换无法用组成图形的点向量和2×
2阶变换矩阵相乘来实现。
用二维点向量和2×
2阶矩阵相乘不能表示图形的平移变换,那么自然会想到用三维点向量和3×
3阶矩阵相乘来实现图形的平移变换。
因此对图形上二个坐标的点向量需要添加一个坐标,使之成为三维点向量以便与三阶矩阵相乘,进而实现用矩阵表示平移变换。
实际上就是对上面的二个坐标变换式添加第三个坐标变换式,即成为
k=k
这第三个坐标变换式(即k=k)必须是恒等式,因为不需作变换,本质上是为了进行矩阵运算而引入的。
将此三个变换式(仍然是图形的平移变换,不妨将k=k取成1=1)写成矩阵得
100
l]=[xyl]010=[xy1]*T
lm1
显然T=010为图形的平移变换矩阵。
这里通过对原图形上二维点向量引进第三个坐标成为三维点向量,从而使原图形的平移变换能用矩阵表示。
同样其它基本变换也可以如此用矩阵表示。
因此图形的基本变换都可以在这样的三维点向量下统一、整洁用矩阵表示。
这样的三维点向量称为齐次点向量,也叫三维齐次坐标点,简称三维齐次坐标。
只有在三维齐次坐标下,二维几何变换才都可以用矩阵表示。
下面再进一步讨论一下齐次坐标的优点。
引用齐次坐标后,可将上面各种基本变换矩阵统一在一个三阶矩阵中。
即
ab0
T=cd0
式中左上角二阶矩阵实现比例、对称、错切、旋转等变换,左下角1×
2阶矩阵实现平移变换,其中a,b,c,d,l,m只要赋以相应的值,并建立图形上点的齐次坐标(即在图形上点的坐标后引入第三个坐标1),这样就可以用图形上点的三维齐次坐标与此三阶矩阵相乘来表示三维图形的基本几何变换了。
而变换后,不用考虑第三个坐标1,前面两个坐标就反映了图形的整个变换情况。
用齐次坐标表示一个图形上的点,可以有多种表示,如(6,8,1)、(12,16,2)、(30,40,5)等均表示图形上同一个点(6,8)。
这样,齐次坐标可以表示计算机无法容纳的数。
例如当计算机的字长为16位时,它能表示的最大整数为216-1=32767。
若点坐标为(80000,40000),则计算机无法表示。
但用齐次坐标可表示为(20000,10000,1/4),经过处理后再用第三个坐标支除前面两个坐标,从而得到原来通常的坐标。
齐次坐标优点很多,在计算机绘图中都采用这种表示来处理图形。
下面介绍的图形复合几何变换就是如此。
二、复合变换
图形的复合几何变换是指图形作一次以上的基本几何变换,变换结果是每次基本变换矩阵的乘积。
图殂的复合几何变换简称复合变换。
1.复合平移
若对图形首先作平移变换T1,然后再作平移变换T2,相应的平移变换矩阵分别为
T1=010
l1m11
T2=010
l2m21
则变换结果为复合平移变换T,其复合平移变换矩阵为
T=T1*T2
100100
=010*010
l1m11l2m21
=010
l1+l2m1|m21
2.复合比例
设比例变换T1矩阵为
a100
T1=0d10
001
比例变换T2矩阵为
a200
T2=0d20
则复合比例变换T矩阵为
a100a200a1*a200
T=T1*T2=0d10*0d20=0d1*d20
001001001
3.复合旋转
设旋转变换T1矩阵为
cosθ1-sinθ10
T1=sinθ1cosθ10
cosθ2-sinθ20
T2=sinθ2cosθ20
则复合旋转变换T矩阵为
cosθ1-sinθ10cosθ2-sinθ20
=sinθ1cosθ10*sinθ2cosθ20
001001
cos(θ1+θ2)-sin(θ1+θ2)0
=sin(θ1+θ2)cos(θ1+θ2)0
旋转变换和比例变换翥与参考点有关,上面的旋转变换和比例变换均是相对原点的。
假如相对某一参考点(xo,yo)作比例、旋转变换,则其变换过程是先把坐标系原点平移至(xo,yo),再在新的坐标系下作比例、旋转变换,然后将坐标原点平移回去,这实际上是复合变换。
4.相对点(xo,yo)的比例变换
100a00100
T=0100d0010
-xo-yo1001xoyo1
a00
=0d0
(1-a)*xo(1-d)*yo1
5.相对点(xo,yo)的旋转变换
100cosθ-sinθ0100
T=010sinθcosθ0010
cosθ-sinθ0
=sinθcosθ0
(1-cosθ)*xo+yo*sinθ(1-cosθ)*yo+xo*sinθ1
解决复合变换问题,要害是将其分解为一定顺序的基本变换,然后逐一进行这些基本变换,从而复合变换问题得到解决;
或者求出这些基本变换矩阵连乘积,即得复合变换矩阵,进而由矩阵作复合变换使得问题被解决。
例3:
设三角形abc其顶点坐标a=(6,4),b=(9,4),c=(6,6),绕点(5,3)逆时针旋转60度,试求变换后的图形。
解:
此变换可分解成下面顺序的基本变换来实现:
1)将三角形abc连同点(5,3)与原点重合,即沿x轴平移-5,沿y轴平移-3;
2)平移后的三解形绕原点逆时针旋转60度;
3)再将旋转后的三角形连同原点平移回点(5,3)。
这三步具体变换过程计算如下:
由前面复合变换中的计算公式并代入cosθ=cos60o=0.5,sinθ=sin60o=0.866便得
本文章来自21视频教程网
C语言图形编程(五、二维图形变换-01)_C语言程序设计教程原文链接:
二维裁剪
一、线段裁剪
二、多边形裁剪
第三节二维裁剪
在二维图形的绘制或显示处理中,有时需要给出或显示某一部分原始图形。
这可在适当位置按一定边界范围定义一个矩形区域(即窗口),使窗口内图形为所需部分,将其保留下来作为绘制或显示之用,而窗口边界以外的图形则予以舍弃。
这种对二维原始图形的处理称为二维裁剪。
二维裁剪处理主要是判定图形元素是否在所开的窗口内,若在内则进一步求出窗口内的那一部分。
也就是说裁剪处理工作有两点:
第一是窗口内外的判定;
第二是计算图形元素与窗口边界的交点。
在定义一个窗口时,一般规定窗口为矩形框。
它在用户坐标系中的位置和大小用窗口对角点坐标或右下角点坐标(x1,y1)和右上角点坐标(x2,y2)来表示,有时也可用窗口原点(左下角点或右上角点)和窗口边长来表示。
在某些情况下,用户也可以用圆心和半径来定图形窗口,或定义其它窗口。
在实际应用中,往往需要观察某一图形的各个细部,或切产生不同比例的显示图形,这些都需要对原图形作二维处理。
裁剪处理是把每个图形元素分成窗口内的与窗口外两部分,舍弃窗口外部分。
虽然对不同的图形元素(如点、线段、多边形等)有不同的裁剪算法,但它们的原理都是一致的。
都是一对简单的不等式,由这对不等式来确定图形上的点(x,y)是否位于窗口内。
在选定窗口的情况下,如窗口的四条边线是x=x1,x=x2,y=y1,y=y2时,不等式为
x1≤x≤x2
y1≤y≤y2
根据此式对图形进行逐点裁剪,不满足其中任何一个不等式的点就不在窗口内,应舍弃。
显然这种算法效率很低。
因此要另外设计对较大图形是行裁剪的算法,如对线段、多边形进行裁剪的算法,下面分别介绍。
一、线段裁剪
裁剪处理的要害是如何去掉窗口外的图形,这要设计出相应的算法。
在线段裁剪算法中,需要检查线段相对于窗口的位置关系。
对整个位于窗口内的线段须全部保留,对整个位于窗口外的线段要全部予以舍弃。
对于部分位于窗口内而其余部分位于窗口外的线段则须计算出该线段与窗口边的交点作为线段的分段点,保留位于窗口内的那部分线段,舍弃其余部分线段。
一般线段两端点相对于窗口的位置有下面几种情况:
1、两端点均在窗口外同一侧位置。
如图2-6中线段视频教程'
cd,这时线段全部位于窗口之外,故整个线段舍弃。
2、两端点均在窗口内,如图2-6中线段MN,显然整个线段位于窗口内,应全部保留。
3、两端点线段中,一点在窗口内,另一点在窗口外,如图2-6中线段PQ,在这种情况应计算出线段PQ与窗口边的交点T,保留窗口内部分线段TQ,舍弃其余部分线段PT。
4、两端点均不在窗口内,但又不处于边界外同一侧位置,如图2-6中线段AB和线段EF,这时线段可能穿过窗口(如线段AB)也可能全部位于窗口之外(如线段EF),因此需要根据线段与窗口边界的交点来判定。
若线段与窗口边线的交点中有两个交点处于窗口上,则此两交点间线段位于窗口内,予以保留,线段的其余部分位于窗口外,应舍弃;
若线段与窗口边界的所有交点均在之外,则整个线段位于窗口外,应予全部舍弃。
下面介绍线段裁剪算法(编码裁剪法)。
由上面线段相对于窗口的位置的几种情况讨论可以得知,有些线段被窗口边界切割后会产生一条以上的窗口外的线段,而窗口内的线段却只有一条。
这一点很重要,它意味着要确定窗口内的线段,只要计算出它位于窗口内的两个端点。
丹科恩和伊凡.瑟萨兰德就根据这一思路设计出了线段裁剪的算法。
这种算法分为两步:
第一步先确定该线段是否整个位于窗口内或全部位于窗口外,若属于这两种情况,则全部保留或全部舍弃;
第二步对不属于第一步那两种情况的线段,则被窗口某一边界线分成两部分,再对每一部分进行第一步。
具本这两步留舍测试如下进行:
延长窗口各边界,将窗口及其四周共划分为九个区域,中心就是所要裁剪的区域。
每个区域各用一个四位二进制数组成的代码(即代码中每一位分别为0或1)来表示,如图2-7所示。
当线的一端点位于某一区域时,便将该区域的代码赋予端点。
然后根据线从而段两端点代码就能很方便地判定出线段相对于窗口的位置关系,并决定对该线段如何进行裁剪。
四位代码中每位(位的顺序由右向左排序)代码的意义如下:
第一位,点在窗口左边界线之左为1,否则为0;
第二位,点在窗口右边界线之右为1,否则为0;
第三位,点在窗口底边界线之下为1,否则为0;
第四位,点在窗口顶边界线之上为1,否则为0。
对线段进行测试时,首先对全部保留和全部舍弃线段这两种情况进行判定,即
1、当线段两端点的四位代码全由零组成时,则表示两端点均在窗口内,要全部保留该线段。
2、当线段的四位代码逻辑乘不等于零时,则表示两个端点的代码中有一相同位,同时为1;
若线段两个端点在侣边界线外的同侧位置,则整个线段在窗口之外,应予全部舍弃。
如图2-6中各线段端点代码(或称编码)逻辑乘如表2-1所示。
表2-1线段端点代码及其逻辑
----------------------------------------------------------------------
线段端点代码逻辑乘注释
(见图2-6)(见图2-7中代码规则)(窗口内为可见)
AB000100100000部分可见