资源描述:
《lesson06-图形裁剪》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第四节图形裁剪§1、点的裁剪§2、线段的裁剪§3、多边形的裁剪§4、文本的裁剪6/15/20211点的裁剪点的裁剪任何图形都可能包含点、直线、字符、和多边形乃至直线,但它们都可以分解成点的集合。所以点的裁剪是图形裁剪中最基本的问题。假设窗口的左下角坐标为(xmin,ymin),右上角坐标为(xmax,ymax),对于给定点P(x,y),则P点在窗口内的条件是要满足下列不等式:xmin<=x<=xmaxandymin<=y<=ymax否则,P点就在窗口外。(xmin,ymin)(xmax,ymax)6/15/20212线段的裁剪线段的裁剪当窗口采用凸多边形时,任何一
2、条线段只会至多有一段在窗口内:当一条线段的两个端点全在窗口内时,该线段整个在窗口内当一条线段的两个端点,一个在窗口内,一个在窗口外时,该线段部分在窗口内,部分在窗口外当一条线段的两个端点全在窗口外时,该线段可能整个在窗口外,也可能部分在窗口内,部分在窗口外整个线段全在窗口内;整个线段全在窗口外;线段部分在窗口外,部分在窗口内。线段与窗口的关系通常有以下三种6/15/20213Cohen-Sutherland算法基本原理线段的裁剪这是一个最早最流行的线段裁剪算法。该算法通过初始测试来减少要计算的交点数目从而加快线段裁剪算法的速度。每条线段的端点都赋以四位二进制码,
3、称为区域码(regioncode),用来标识出端点相对于裁剪矩形边界的位置。区域通过如下所示的边界设定。区域码的各位指出端点对于裁剪矩形边界的四个相对坐标位置:左,右,下,上。将区域码的各位从右到左编号,则坐标区域与各位的关系为:上下右左XXXX任何位赋值为1,代表端点落在相应的位置上,否则该位为0。若端点在裁剪矩形内,区域码为0000。如果端点落在矩形的左下角,则区域码为0101。6/15/20214Cohen-Sutherland算法基本原理直线的裁剪如果两端点的编码均为0000,表示该线段在窗口内。如果两端点的编码相与不为0000,表示该线段在窗口外。
4、如果两端点的编码不全为0000,但相与为0000,则该线段不可见或部分可见,需计算线段与窗口的交点,确定哪一部分可见。一旦给定所有的线段端点的区域码,就可以快速判断哪条线段完全在裁剪窗口内,哪条线段完全在窗口外。所以得到一下规则:6/15/20215线段的裁剪Cohen-Sutherland算法描述Cohen-Sutherland算法的关键在于总是先确定窗口外的一个端点,这样位于此端点至与窗口边的交点之间的线段必为不可见,故可将其抛弃。然后利用此法处理剩余的部分。Cohen-Sutherland算法描述如右:BOOLdone,draw;done表示是否完成,
5、draw表示是否可见;Unsignedcharcode1,code2;端点1,端口2的编码While(!done)beginif(判断code1,code2,若为第一种情况)begindone=TRUE;draw=TRUE;endelseif(为第二种情况)begindone=TRUE;draw=FALSE;endelseif(检查code1,若在窗口内)begin交换端点及端点的编码;以左,右,下,上的次序对端点1进行判断及求交;将交点的值赋给端点1;endend6/15/20216线段的裁剪Cohen-SutherlandC算法描述#defineLEFT1#d
6、efineRIGHT2#defineBOTTOM4#defineTOP8intencode(floatx,floaty,floatXL,floatXR,floatYB,floatYT){intc=0;if(x7、=LEFT;if(x>XR)c
8、=RIGHT;if(y9、=BOTTOM;if(y>YT)c
10、=TOP;retrunc;}voidCS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)floatx1,y1,x2,y2,XL,XR,YB,YT;//(x1,y1)(x2,y2)为线段的端点坐标,其他四个参数定义窗口的边界{in
11、tcode1,code2,code;code1=encode(x1,y1);code2=encode(x2,y2);while(code1!=0
12、
13、code2!=0)///线不全在窗口内{if(code1&code2!=0)return;////线在窗口外code=code1;if(code1==0)code=code2;////找窗口外的点if(LEFT&code!=0)//点在左面{x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);}elseif(RIGHT&code!=0))//点在右面{x=XR;y=y1+(y2-y1)*(XR-x1)/
14、(x2-x