lesson06-图形裁剪

lesson06-图形裁剪

ID:21967710

大小:642.00 KB

页数:42页

时间:2018-10-21

lesson06-图形裁剪_第1页
lesson06-图形裁剪_第2页
lesson06-图形裁剪_第3页
lesson06-图形裁剪_第4页
lesson06-图形裁剪_第5页
资源描述:

《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,表示该线段在窗口内。如果两端点的

4、编码相与不为0000,表示该线段在窗口外。如果两端点的编码不全为0000,但相与为0000,则该线段不可见或部分可见,需计算线段与窗口的交点,确定哪一部分可见。一旦给定所有的线段端点的区域码, 就可以快速判断哪条线段完全在裁剪窗口内,哪条线段完全在窗口外。 所以得到一下规则:6/15/20215线段的裁剪Cohen-Sutherland算法描述Cohen-Sutherland算法的关键在于总是先确定窗口外的一个端点,这样位于此端点至与窗口边的交点之间的线段必为不可见,故可将其抛弃。然后利用此法处理剩余的部分。Cohen-Sutherland算法描述如

5、右:BOOLdone,draw; done表示是否完成,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线段的裁剪

6、Cohen-SutherlandC算法描述#defineLEFT1#defineRIGHT2#defineBOTTOM4#defineTOP8intencode(floatx,floaty,floatXL,floatXR,floatYB,floatYT){intc=0;if(x

7、=LEFT;if(x>XR)c

8、=RIGHT;if(y

9、=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

11、;//(x1,y1)(x2,y2)为线段的端点坐标,其他四个参数定义窗口的边界{intcode1,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

14、(RIGHT&code!=0))//点在右面{x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。