计算机图形学第八章开窗口及二维裁剪_第1页
计算机图形学第八章开窗口及二维裁剪_第2页
计算机图形学第八章开窗口及二维裁剪_第3页
计算机图形学第八章开窗口及二维裁剪_第4页
计算机图形学第八章开窗口及二维裁剪_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、概述概述8.1 开窗口及裁剪的基本概念开窗口及裁剪的基本概念 8.1.1 坐标系坐标系 建模坐标系建模坐标系 世界坐标系世界坐标系 设备坐标系设备坐标系 规格化设备坐标系规格化设备坐标系 坐标系变换坐标系变换8.1.2 窗口与视区窗口与视区 8.1.2 窗口与视区窗口与视区窗口与视区窗口与视区8.1.3 窗口在图形显示中的应用窗口在图形显示中的应用 8.2 窗口到视区的变换窗口到视区的变换 -minminmaxminmaxminxwxwxv xvxwxwxvxv-m inm inm axm inm axm inywywyvyvywywyvyv窗口到视区的变换窗口到视区的变换-=(-)+-max

2、minminminmaxminxvxvxvxwxwxvxwxw-=(-)+-maxminminminmaxminyvyvyvywywyvywyw窗口到视区的变换窗口到视区的变换()m axm inm axm inm axm inm axm inxv -xvyv -yvS,xw -xwyw -yw窗口到视区的变换窗口到视区的变换(,) () (,)00maxminmaxminWC DCminminminminmaxminmaxminmaxminmaxminminminmaxminmaxminmaxminmaxminWC DCminmaxminmaxmxv-xvyv-yvNT xvyvS,T xw

3、ywxw -xwyw -ywxvxvxvxvxwxvxwxwxwxwyvyvyvyvNywywywywyw 001mininyv11wwDCWCvvyxNyx8.3 裁剪裁剪 点的裁剪点的裁剪8.3.1直线的裁剪直线的裁剪直线段和窗口边界的交点直线段和窗口边界的交点基本思想基本思想:对每条直线段p1(x1,y1)p2(x2,y2)分三种情况处理:(1) 直线段完全可见,“简取”之。(2) 直线段完全不可见,“简弃”之。(3) 直线段既不满足“简取”的条件,也不满足“简弃”的条件,需要对直线段按交点进行分段,分段后重复上述处理。8.3.2 Cohen-Sutherland算法算法P1P2P5P6

4、P3P4 若xxr,则D1=1,否则D1=0; 若yyt,则D3=1,否则D3=0。 任何位赋值为任何位赋值为1,代表端点落在相应的位置上,否则该位为,代表端点落在相应的位置上,否则该位为0。若端点在。若端点在裁剪矩形内,区域码为裁剪矩形内,区域码为0000。如果端点落在矩形的左下角,则区域码为。如果端点落在矩形的左下角,则区域码为0101,其它类推。,其它类推。000010000100000110010101101000100110Cohen-Sutherland算法算法n(1)若code1|code2=0,对直线段应简取之。n(2)若code1&code20,对直线段可简弃之。n(

5、3)若上述两条件均不成立。则需求出直线段与窗口边界的交点。在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。再对另一段重复进行上述处理,直到该线段完全被舍弃或者找到位于窗口内的一段线段为止。000010000100000110010101101000100110Cohen-Sutherland算法算法Cohen-Sutherland算法算法算法的步骤算法的步骤:(1)输入直线段的两端点坐标:p1(x1,y1)、p2(x2,y2),以及窗口的四条边界坐标:yt、yb、xl和xr。(2)对p1、p2进行编码:点p1的编码为code1,点p2的编码为code2。(3)若code1|code

6、2=0,对直线段应简取之,转(6);否则,若code1&code20,对直线段可简弃之,转(7);当上述两条均不满足时,进行步骤(4)。(4)确保p1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和编码。(5)按左、右、下、上的顺序求出直线段与窗口边界的交点按左、右、下、上的顺序求出直线段与窗口边界的交点,并用该交点的坐标值替换p1的坐标值。也即在交点也即在交点s s处把线段一分为二,并去掉处把线段一分为二,并去掉p p1 1s s这一段。这一段。考虑到p1是窗口外的一点,因此可以去掉p1s。转(2)。(6)用直线扫描转换算法画出当前的直线段p1p2。(7)算法结束。Cohen-

7、Sutherland算法算法/程序程序8-1区域码直线裁剪算法区域码直线裁剪算法void Line_Clipping(x1,y1,x2,y2,xw_xmin,yw_ymin,xw_max,yw_max)float x1,y1,x2,y2,xw_xmin,yw_ymin,xw_max,yw_max;/*(x1,y1)和和(x2,y2)是线段端点坐标是线段端点坐标*/ int draw,done; int code1,code2,code; f1oat x,y; draw=FALSE; done=FALSE; code1=get_code(x1 t y1-xw_xminf yw_yminI xw_

8、maxt yw_max); code2=get_code(x2,y2,xw_xmin,yw_ymin,xw_max,yw_max); while(!Done) if(code1=0&code2=0)/*完全可见完全可见*/ draw=TRUE; done=TRUE; else if(code1&code2 !=0) /*显然完全不可见显然完全不可见*/ done=TRUE; else if(code1!=0) code=code1; else code=code2; if(code&TOP!=0) /*求线段与窗口上边界的交点求线段与窗口上边界的交点*/ y=yw_ym

9、ax; x=x1+(y_y1)*(x2-x1)/(y2-y1); else if(code&BOTTOM!=0) /*求线段与窗口下边界的交点求线段与窗口下边界的交点*/ y=yw_ymin; x=x1+(y_y1)*(x2-x1)/(y2-y1); else if(code&RTGHT!=0) /*求线段与窗口右边界的交点求线段与窗口右边界的交点*/ x=xw_xmax; y=y1+(x-x1)*(y2-y1)/(x2-x1); else if(code&LIFT!=0) /*求线段与窗口左边界的交点求线段与窗口左边界的交点*/ x=xw_xmin; y=y1+(x-

10、x1)*(y2-y1)/(x2-x1); if (code=code1) x1=x; y1=y; code1=get_code(x1,y1,xw_xmin, yw_ymin,xw_xmax,yw_ymax); else x2=x;y2=y; code2=get_code(x2,y2,xw_xmin, yw_ymin,xw_xmax,yw_ymax); if(draw) Draw_line(x1,y1,x2,y2); /*端点坐标为实线的画线算法端点坐标为实线的画线算法*/ int get_code(x,y,xw_xmin, yw_ymin,xw_xmax,yw_ymax) /*得到点得到点(x

11、,Y)所在区域的编码所在区域的编码*/ float x,y,xw_xmin,yw_ymin,xw_max,yw_max; int code; code=0; if(yyw_ymax) code|=TOP; else if(yxw_xmax) code|=RIGHT; eise if xxw xmin) code|=LEFT; return code; 8.3.3 中点分割算法中点分割算法 8.3.4 Liang - Barsky算法算法 12111211=+(-) =+=+(-)u=+x xxx u xx uyyyyyy u 11+minmaxminmaxxwxx uxwywyy uyw Li

12、ang - Barsky算法算法, =1,2,3,4kkp uqk111221331441=-,=-=,=-=-,=-=,=-minmaxminmaxpxqxxwpxqxwxpyqyywpyqywy11+minmaxminmaxxwxx uxwywyy uyw Liang - Barsky算法算法Liang - Barsky算法算法EnterEnterLeaveLeaveEnterLeaveEnterLeaveLiang - Barsky算法算法(1)(1)初始化初始化,u1=0,u2=1;,u1=0,u2=1;(2)(2)对每一窗口边界计算出相应的对每一窗口边界计算出相应的p p及及q q值

13、值; ;(3)(3)用函数用函数CliptestCliptest由参数由参数p p及及q q决定此直线能否被排除或者决定交点参数决定此直线能否被排除或者决定交点参数是否要调整是否要调整; ;(4)(4)当当p0p0p0时时, ,用参数用参数r r修改修改u2u2值值, ,如果最后有如果最后有u1 u2,u1 u2,则排除此直线则排除此直线; ;否则否则, ,只有当新值使直线缩短时只有当新值使直线缩短时, ,才修改相应的才修改相应的u;u;(5)(5)当当p=0p=0且且q0qxw_xmin,t0,&t1) if(Clip_Top (dx,rect-xw_xmax-xl,t0,&

14、t1) dy=y2-ylj if(Clip_Top (-dy,yl-rect-yw_xmin,&t0,&t1) if(Clip_Top (dy,rect-xw_xmax-yl,&t0,&t1) Line(int)(xl+t0*dx),(int)(yl+t0*dy), (int)(xl+tl*dx), (int)(yl+tl*dy); return; WriteText(“plp2完全不可见完全不可见”);8.4 多边形裁剪多边形裁剪 多边形裁剪多边形裁剪8.4.1 Sutherland-Hodgman算法算法 Sutherland-Hodgman算法算法/程序程序8-3 Sutherland-Hodgman多边形裁剪多边形裁剪Sutherland

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论