直线段剪裁实验报告_第1页
直线段剪裁实验报告_第2页
直线段剪裁实验报告_第3页
直线段剪裁实验报告_第4页
直线段剪裁实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、.计算机图形学实验报告实验名称直线段裁剪姓名学号专业班级天津大学计算机科学与技术学院.一、实验目的熟练掌握 cohen-sutherland直线裁剪算法,并编程实现二、实验内容(1) 裁剪窗口为矩形窗口,且矩形边和坐标轴平行,长宽自己定。(2) 待裁剪线段端点坐标自己定;裁剪线段涵盖完全可见、不完全可见、完全不可见类型。(3) 要求显示待裁剪线段并用不同颜色标示出裁剪结果。实现方法:一般情况下,需要判断一条直线是全部可见,全部不可见,部分裁剪 ( 一段裁剪 ) ,全部裁剪 ( 两端裁剪 ) 。通过把裁剪区域分成许多部分,然后给每一段被裁剪的线段的两端分配一位代码,通过少量 if 语句和一个ca

2、se语句就可以判断出具体情况。伪代码如下:#define clip_code_c 0x0000#define clip_code_n 0x0008#define clip_code_s 0x0004#define clip_code_e 0x0002#define clip_code_w 0x0001#define clip_code_ne0x000a#define clip_code_se0x0006#define clip_code_nw0x0009#define clip_code_sw0x0005.实验步骤:1)生成裁剪窗口,窗口由直线xl=250,xr=850,yb=250,yt=4

3、502)绘制直线段3)编写 cohen-sutherland 直线裁剪算法,对直线段进行裁剪编码定义规则:第一位 c1:若端点位于窗口之左侧,即 xxr ,则 c2=1,否则 c2=0。第三位 c3:若端点位于窗口之下侧,即 yyt ,则 c4=1,否则 c4=0。裁剪步骤:对所有直线的端点都建立了区域码之后,就可按区域码判断直线在窗口之内或窗口之外。这可分为如下几种情况:若一直线的两个端点的区域码均为 0000 则此直线在窗口边界之内, 应子保留。若一直线的两个端点的区域码的同一位同时为 1,则此直线全部在窗口边界之外,应子裁剪。例如,若一直线的一个端点的区域码为 1001,另一个端点的区域

4、码为 0101,则此两端点的区域码的第一位均为 1,说明此两端点均在窗口边界之左,因此,直线在窗口边界之外,应予裁剪。可用将直线两个端点的区域码进行与操作的方法,判断直线是否在窗口之外,若与操作的结果为 0000 则两端点的区域码任何位均不同时为1 此直线不一定被裁剪。以上两种情况之外的直线,有可能穿过窗口,也有可能不穿过窗口,下图中所示的两条直线都不符合情况的要求,但一条直线( p1p2)穿过窗口,另一直线( p3p4)不穿过窗口。对这类直线可以进行如下处理:取窗口外的一个端点与窗口边界比较以确定可排除直线的哪一部分,然后,把直线剩下的部分与其他边界比较, 这样一直到直线全部被排除或确定直线

5、的哪一部分在窗口之内为止。可按“左、右、下、上”的次序建立检查直线端点与窗口边界关系的算法。图三、实验结果画线效果一:.画线效果二:其他效果用户可自行绘制.四、实验分析和总结掌握了 opengl的基本用法 , 掌握了 cohen-sutherland 直线裁剪算法 , 并编程实现出来 .五、源代码void ccslineview:cohen()/cohensutherland算法bool change;double x,y;rc0=encode(pointx0,pointy0);rc1=encode(pointx1,pointy1);while(true)change=false;if(0 =

6、 (rc0|rc1)/简取之return;else if(0!=(rc0 & rc1)/简弃之return;elseif(0=rc0)/如果 p0 点在窗口内,交换p0 和 p1, 保证 p0 点在窗口外/ 交换点的坐标值double tpointx,tpointy;tpointx=pointx0;tpointy=pointy0;pointx0=pointx1;pointy0=pointy1;pointx1=tpointx;pointy1=tpointy;/ 交换点的编码值unsigned int trc;trc=rc0;rc0=rc1;rc1=trc;/ 按左、右、下、上的顺序裁剪if(rc

7、0 & left )/p0点位于窗口的左侧x=wxl;/求交点 y.y=pointy0+(pointy1-pointy0)*(x-pointx0)/(pointx1-pointx0); pointx0=x;pointy0=y;change=true;rc0=encode(pointx0,pointy0);rc1=encode(pointx1,pointy1);if(rc0 & right )/p0点位于窗口的右侧x=wxr;/求交点 yy=pointy0+(pointy1-pointy0)*(x-pointx0)/(pointx1-pointx0); pointx0=x;pointy0=y;c

8、hange=true;rc0=encode(pointx0,pointy0);rc1=encode(pointx1,pointy1);if(rc0 & bottom )/p0点位于窗口的下侧y=wyb;/求交点 xx=pointx0+(pointx1-pointx0)*(y-pointy0)/(pointy1-pointy0); pointx0=x;pointy0=y;change=true;rc0=encode(pointx0,pointy0);rc1=encode(pointx1,pointy1);if(rc0 & top )/p0点位于窗口的上侧y=wyt;/求交点 xx=pointx0

9、+(pointx1-pointx0)*(y-pointy0)/(pointy1-pointy0); pointx0=x;pointy0=y;change=true;rc0=encode(pointx0,pointy0);rc1=encode(pointx1,pointy1);if(false=change)return;void ccslineview:ondraw(cdc* pdc).crect rect;getclientrect(&rect);/获得客户区的大小cbitmap bitmap,*pbitmap;bitmap.loadbitmap(idb_bitmap1);cdc memdc

10、;memdc.createcompatibledc(getdc();pbitmap=memdc.selectobject(&bitmap);memdc.bitblt(0,0,rect.width(),rect.height(),&picture,0,0,srccopy);memdc.textout(wxl+wxr)/2,wyb-20,窗口 );/窗口标题/ 绘制窗口和直线cpen pen3,*poldpen3;/定义 3 个像素宽度的画笔pen3.createpen(ps_solid,2,rgb(0,0,0);poldpen3=memdc.selectobject(&pen3);memdc.m

11、oveto(wxl,wyt);memdc.lineto(wxr,wyt);memdc.lineto(wxr,wyb);memdc.lineto(wxl,wyb);memdc.lineto(wxl,wyt);memdc.selectobject(poldpen3);pen3.deleteobject();cpen pen1,*poldpen1;/定义 1 个像素宽度的画笔pen1.createpen(ps_solid,2,rgb(255,0,0);poldpen1=memdc.selectobject(&pen1);if(m_i=1)memdc.moveto(round(pointx0),rou

12、nd(pointy0);memdc.lineto(round(pointx1),round(pointy1);memdc.selectobject(poldpen1);pen1.deleteobject();cdc *dc=getdc();dc-bitblt(0,0,rect.width(),rect.height(),&memdc,0,0,srccopy);memdc.selectobject(pbitmap);void ccslineview:ondrawline() /屏幕画线函数if(false=m_attatch)picture.createcompatibledc(getdc();

13、cbitmap *bitmap,*pbitmap;bitmap=new cbitmap;bitmap-loadbitmap(idb_bitmap1);pbitmap=picture.selectobject(bitmap);m_attatch=true;m_draw=true;.m_i=0;invalidate(false);afxgetmainwnd()-setwindowtext(cohen-sutherland直线裁剪算法);/显示标题messagebox( 请使用鼠标在屏幕上绘制直线,然后点击裁剪按钮进行裁剪,提示,mb_okcancel);void ccslineview:onmousemove(uint nflags, cpoint point) /鼠标移动函数/ todo: add your message handler code here and/or call default if(true=m_draw)if(m_i2)pointxm_i=point.x;pointym_i=point.y;inva

温馨提示

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

评论

0/150

提交评论