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

付费下载

下载本文档

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

文档简介

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

2、伪代码如下:#defineCLIP_CODE_C0x0000#defineCLIPCODE._N0x0008#defineCLIPCODE_s0x0004#defineCLIPCODE_E0x0002#defineCLIPCODEw0x0001#defineCLIPCODE._NE0x000a#defineCLIPCODE_SE0x0006#defineCLIPCODE.NW0x0009#defineCLIPCODESW0x0005Clip. code_rnr: 0x0009Clip_code_north:OxOOOQCl ip.code.rie: OkOOOA实验步骤:1) 生成裁剪窗口,窗

3、口 由直线 xl=250, xr=850. yb=250. yt=4502) 绘制直线段3) 编写Cohen-Sutherland直线裁剪算法,对直线段进行裁剪 编码定义规则:第一位C1: 第二位C2: 第三位C3: 第四位C4: 裁剪步骤:若端点位于窗口之左侧,即 若端点位于窗口之右侧,即 若端点位于窗口之下侧,即 若端点位于窗口之上侧,即Xxr,则Yyt,则C1C2C3C4否否否否12 3 4 c c c Cdu du du du 贝贝贝贝对所有直线的端点都建立了区域码之后,就可按区域码判断直线在窗口 之内或窗口之外。这可分为如下几种情况: 若一直线的两个端点的区域码均为0000则此直线在

4、窗口边界之内,应 子保留。 若一直线的两个端点的区域码的同一位同时为1,则此直线全部在窗 口边界之外,应子裁剪。例如,若一直线的一个端点的区域码为1001,另一 个端点的区域码为0101,则此两端点的区域码的第一位均为1,说明此两端 点均在窗口边界之左,因此,直线在窗口边界之外,应予裁剪。可用将直线 两个端点的区域码进行与操作的方法,判断直线是否在窗口之外,若与操作 的结果为0000则两端点的区域码任何位均不同时为1此直线不一定被裁剪。 以上两种情况之外的直线,有可能穿过窗口,也有可能不穿过窗口, 下图中所示的两条直线都不符合情况的要求,但一条直线(P1P2)穿过窗 口,另一直线(P3P4)不

5、穿过窗口。对这类直线可以进行如下处理:取窗口 外的一个端点与窗口边界比较以确定可排除直线的哪一部分,然后,把直线 剩下的部分与其他边界比较,这样一直到直线全部被排除或确定直线的哪一 部分在窗口之内为止。可按“左、右、下、上”的次序建立检查直线端点与 窗口边界关系的算法。P2P1三、实验结果画线效果一:其他效果用户可自行绘制四、实验分析和总结掌握了 openGL的基本用法,掌握了 Cohen-Sutherland直线裁剪算法,并编 程实现出来.五、源代码vo i d CCsLi neV i ew: : Cohen () /Cohen Suther I and 算法BOOL Change;doub

6、le x.y;RC0=EnCode (Pointx0. Pointy0);RC1=EnCode (Pointx1. Pointy1);whi le(TRUE)Change=FALSE;if(0 = (RC0|RC1)/简取之return;else if (0! = (RC0 & RC1)/简弃之return;elseif (0=RC0)/如果PO点在窗口内,交换PO和P1.保证p0点在窗口外 交换点的坐标值double TPointx. TPointy;TPoi ntx=Pointx0;TPointy=Pointy0;Pointx0=Pointx1;Pointy0=Pointy1;Pointx

7、1=TPointx;Pointy1=TPoi nty;/交换点的编码值unsigned int TRC;TRC=RC0:RC0=RC1;RC1=TRC;/按左、右、下、上的顺序裁剪i f (RC0 & LEFT )/P0点位于窗口的左侧X=wxl;/求交点yy=Pointy0 + (Pointy1-Pointy0)*(x-Pointx0)/(Pointx 1-Pointx 0); Pointx0=x;Po i nty0=y;Change二TRUE;RC0=EnCode(Pointx0. Pointy0);RC1=EnCode(Pointx1.Pointy1);if (RCO & RIGHT )

8、/P0点位于窗口的右侧x=wxr;/求交点yy=Poi nty0 + (Pointy1-Po i nty0)* (x-Poi ntx0)/(Pointx 1-Rointx 0); Pointx0=x;Po i nty0=y;Change=TRUE;RCO二EnCode(Pointx0 Pointy0);RC1=EnCode (Pointx 1.Pointy 1);i f (RCO & BOTTOM )/P0点位于窗口的下侧y=wyb; /求交点xx=Poi ntx0 + (Pointx1-Po intx0)*(y-Pointy0)/ (Pointy 1-Poi nty 0); Pointx0=

9、x;Po i nty0=y;Change二TRUE;RC0=EnCode(Pointx0, Pointy0);RC1=EnCode(Pointx1.Pointy1);i f (RCO & TOP )/P0点位于窗口的上侧y=wyt: /求交点xx=Pointx0 + (Pointx1 -Pointx0)*(y-Pointy0)/(Pointy1 -Pointy0); Pointx0=x;Pointy0 =y;Change=TRUE;RCO二EnCode (Pointx0. Pointy0);RC1=EnCode (Pointx 1.Pointy 1);if (FALSE=Change)retu

10、rn;void CCsLineView:OnDraw(CDC* pDC)CRect Rect;GetCI ientRect (&Rect) ;/获得客户区的大小CBitmap Bitmap, *pBitmap;Bi tmap. LoadBi tmap (IDB_BITMAP1);CDC MemDC;MemDC. CreateCompat i bI eDC(GetDC();pBi tmap二MemDC. SeIectObject(&Bi tmap);MemDC. BitBlt(0, 0, Rect. W i dth (), Rect. He i ght O.&Pi cture. 0, 0, SR

11、CCOPY);MemDC. TextOut (wx I +wxr)/2. wyb-20r M窗口 “) ;/窗口标题绘制窗口和直线CPen Pen3, *P0ldPen3:/定义3个像素宽度的画笔Pen3. CreatePen(PS_SOLID, 2. RGB(0, 0. 0);pOIdPen3=MemDC. SeIectObject(&Pen3);MemDC. MoveTo(wxl. wyt);MemDC. L i neTo(wxrr wyt);MemDC. L i neTo (wxr. wyb) : MemDC. L i neTo (wx I r wyb);MemDC. L ineTo(w

12、xI, wyt) ;MemDC. SeIectOb ject(pOIdPen3);Pen3. De leteOb ject ();CPen Pen1,*p0ldPen1;定义1个像素宽度的画笔Pen1. CreatePen(PS.SOLID, 2. RGB(255. 0.0):p0ldPen1=MemDC. Sei ectObject(&Pen1);if (m_i=1)MemDC. MoveTo(ROUND(Pointx0). ROUND(Pointy0);MemDC. LineTo(ROUND(Pointx1j). ROUND(Pointy1);MemDC. SeiectObject(pOl

13、dPenl);Pen1 DeleteObject ();CDC *dc=GetDC ();dc-BitBIt (0. 0, Rect. Width (). Rect. Height (). SMemDC, 0. 0. SRCCOPY); MemDC. SeIectObject (pBitmap);void CCsLineView: :0ndrawl ine() /屏幕画线函数if (FALSE=m_Attatch)Picture.CreateCompat i bI eDC (GetDC 0);CB i tmap *Bitmap. *pBitmap;Bitmap二new CBitmap;Bitm

14、ap-LoadBitmap(IDB_BITMAP1);pBi tmap=Picture SeIectObject(B i tmap);m_Attatch=TRUE:m Draw二TRUE;m_ i =0;Invalidate(FALSE);AfxGetMa i nV/nd () -SetV/ indov/Text C Cohen - Suthe r I and 直线裁剪算法);/显示标题MessageBoxC1请使用鼠标在屏幕上绘制直线,然后点击裁剪按钮进行裁剪,”提示MB.0KCANCEL);void CCsL i neV i ev/: : OnMouseMove (UI NT nF lags, CPoin t point) /鼠标移动函数/ TODO: Add your message handler code here and/or caI I defauItif (TRUE=mDraw)if (m_i2)Poi ntxm_i=poi nt x:Pointym_i=poi nt. y;Invalidate (FALSE)

温馨提示

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

最新文档

评论

0/150

提交评论