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

下载本文档

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

文档简介

《计算机图形学》实验报告《实验名称》直线段裁剪姓名学号专业班级天津大学计算机科学与技术学院一、实验目的纯熟掌握Cohen-Sutherland直线裁剪算法,并编程实现二、实验内容(1)裁剪窗口为矩形窗口,且矩形边和坐标轴平行,长宽自己定。(2)待裁剪线段端点坐标自己定;裁剪线段涵盖完全可见、不完全可见、完全不可见类型。(3)规定显示待裁剪线段并用不同颜色标示出裁剪结果。实现方法:一般情况下,需要判断一条直线是所有可见,所有不可见,部分裁剪(一段裁剪),所有裁剪(两端裁剪)。通过把裁剪区域提成许多部分,然后给每一段被裁剪的线段的两端分派一位代码,通过少量if语句和一个case语句就可以判断出具体情况。伪代码如下:#defineCLIP_CODE_C 0x0000#defineCLIP_CODE_N 0x0008#defineCLIP_CODE_Sﻩ0x0004#defineCLIP_CODE_Eﻩ0x0002#defineCLIP_CODE_W 0x0001#defineCLIP_CODE_NEﻩ0x000a#defineCLIP_CODE_SEﻩ0x0006#defineCLIP_CODE_NWﻩ0x0009#defineCLIP_CODE_SW 0x0005实验环节:1)生成裁剪窗口,窗口由直线xl=250,xr=850,yb=250,yt=4502)绘制直线段3)编写Cohen-Sutherland直线裁剪算法,对直线段进行裁剪编码定义规则:第一位C1:若端点位于窗口之左侧,即X<xl,则C1=1,否则C1=0。第二位C2:若端点位于窗口之右侧,即X>xr,则C2=1,否则C2=0。第三位C3:若端点位于窗口之下侧,即Y<yb,则C3=1,否则C3=0。第四位C4:若端点位于窗口之上侧,即Y>yt,则C4=1,否则C4=0。裁剪环节:对所有直线的端点都建立了区域码之后,就可按区域码判断直线在窗口之内或窗口之外。这可分为如下几种情况:①若一直线的两个端点的区域码均为0000则此直线在窗口边界之内,应子保存。②若一直线的两个端点的区域码的同一位同时为1,则此直线所有在窗口边界之外,应子裁剪。例如,若一直线的一个端点的区域码为1001,另一个端点的区域码为0101,则此两端点的区域码的第一位均为1,说明此两端点均在窗口边界之左,因此,直线在窗口边界之外,应予裁剪。可用将直线两个端点的区域码进行与操作的方法,判断直线是否在窗口之外,若与操作的结果为0000则两端点的区域码任何位均不同时为1此直线不一定被裁剪。③以上两种情况之外的直线,有也许穿过窗口,也有也许不穿过窗口,下图中所示的两条直线都不符合情况②的规定,但一条直线(P1P2)穿过窗口,另一直线(P3P4)不穿过窗口。对这类直线可以进行如下解决:取窗口外的一个端点与窗口边界比较以拟定可排除直线的哪一部分,然后,把直线剩下的部分与其他边界比较,这样一直到直线所有被排除或拟定直线的哪一部分在窗口之内为止。可按“左、右、下、上”的顺序建立检查直线端点与窗口边界关系的算法。图③三、实验结果ﻩ画线效果一:画线效果二:其他效果用户可自行绘制四、实验分析和总结掌握了openGL的基本用法,掌握了Cohen-Sutherland直线裁剪算法,并编程实现出来.五、源代码voidCCsLineView::Cohen()//Cohen-Sutherland算法{ BOOLChange;ﻩdoublex,y; RC0=EnCode(Pointx[0],Pointy[0]);ﻩRC1=EnCode(Pointx[1],Pointy[1]); while(TRUE) {ﻩ ﻩ Change=FALSE; ﻩif(0==(RC0|RC1))ﻩﻩ{//简取之ﻩ ﻩreturn; ﻩ} elseif(0!=(RC0&RC1)) {//简弃之ﻩﻩ return; ﻩ} elseﻩﻩ{ﻩﻩﻩif(0==RC0)//假如P0点在窗口内,互换P0和P1,保证p0点在窗口外 ﻩ {ﻩ ﻩ //互换点的坐标值 ﻩ doubleTPointx,TPointy;ﻩﻩﻩ TPointx=Pointx[0];TPointy=Pointy[0];ﻩ ﻩﻩPointx[0]=Pointx[1];Pointy[0]=Pointy[1];ﻩﻩﻩﻩPointx[1]=TPointx;Pointy[1]=TPointy;ﻩﻩﻩ //互换点的编码值 ﻩ unsignedintTRC; ﻩ TRC=RC0;RC0=RC1;RC1=TRC; ﻩ }ﻩﻩﻩ//按左、右、下、上的顺序裁剪 ﻩ if(RC0&LEFT)//P0点位于窗口的左侧 {ﻩﻩﻩﻩx=wxl;//求交点yﻩﻩ ﻩy=Pointy[0]+(Pointy[1]-Pointy[0])*(x-Pointx[0])/(Pointx[1]-Pointx[0]);ﻩ ﻩ Pointx[0]=x;Pointy[0]=y; ﻩ ﻩChange=TRUE;ﻩ ﻩRC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]); }ﻩﻩ ﻩif(RC0&RIGHT)//P0点位于窗口的右侧ﻩﻩ {ﻩﻩ x=wxr;//求交点yﻩ ﻩ y=Pointy[0]+(Pointy[1]-Pointy[0])*(x-Pointx[0])/(Pointx[1]-Pointx[0]);ﻩﻩ Pointx[0]=x;Pointy[0]=y;ﻩ ﻩ Change=TRUE; ﻩRC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]); ﻩ}ﻩﻩ ﻩﻩ if(RC0&BOTTOM)//P0点位于窗口的下侧ﻩﻩﻩ{ﻩﻩ ﻩy=wyb;//求交点x ﻩ x=Pointx[0]+(Pointx[1]-Pointx[0])*(y-Pointy[0])/(Pointy[1]-Pointy[0]); ﻩ Pointx[0]=x;Pointy[0]=y; ﻩ ﻩChange=TRUE;ﻩﻩﻩ RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);ﻩﻩ } ﻩﻩﻩ if(RC0&TOP)//P0点位于窗口的上侧ﻩﻩ { ﻩ ﻩy=wyt;//求交点xﻩ x=Pointx[0]+(Pointx[1]-Pointx[0])*(y-Pointy[0])/(Pointy[1]-Pointy[0]);ﻩ Pointx[0]=x;Pointy[0]=y;ﻩﻩ ﻩChange=TRUE; ﻩﻩ RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]); ﻩ }ﻩ if(FALSE==Change) ﻩ { ﻩ ﻩreturn;ﻩﻩﻩ} } }}voidCCsLineView::OnDraw(CDC*pDC){ CRectRect; GetClientRect(&Rect);//获得客户区的大小ﻩCBitmap Bitmap,*pBitmap; Bitmap.LoadBitmap(IDB_BITMAP1); CDC MemDC; 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,"窗口");//窗口标题 //绘制窗口和直线 CPenPen3,*pOldPen3;//定义3个像素宽度的画笔 Pen3.CreatePen(PS_SOLID,2,RGB(0,0,0));ﻩpOldPen3=MemDC.SelectObject(&Pen3); MemDC.MoveTo(wxl,wyt);MemDC.LineTo(wxr,wyt);ﻩMemDC.LineTo(wxr,wyb);MemDC.LineTo(wxl,wyb); MemDC.LineTo(wxl,wyt);MemDC.SelectObject(pOldPen3); Pen3.DeleteObject(); CPenPen1,*pOldPen1;//定义1个像素宽度的画笔ﻩPen1.CreatePen(PS_SOLID,2,RGB(255,0,0));ﻩpOldPen1=MemDC.SelectObject(&Pen1);ﻩ if(m_i>=1) {ﻩ MemDC.MoveTo(ROUND(Pointx[0]),ROUND(Pointy[0])); ﻩMemDC.LineTo(ROUND(Pointx[1]),ROUND(Pointy[1])); ﻩ } MemDC.SelectObject(pOldPen1); Pen1.DeleteObject();ﻩ CDC*dc=GetDC(); dc->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);ﻩMemDC.SelectObject(pBitmap);}voidCCsLineView::Ondrawline()//屏幕画线函数{ﻩﻩif(FALSE==m_Attatch)ﻩ{ ﻩPicture.CreateCompatibleDC(GetDC());ﻩﻩCBitmap *Bitmap,*pBitmap;ﻩ Bitmap=newCBitmap; 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); }voidCCsLineView::OnMouseMove(UINTnFlags,CPointpoint)//鼠标移动函数{ //TODO:Addyourmessagehandlercodehereand/orcalldefaultﻩif(TRUE==m_Draw) { ﻩif(m_i<2) {ﻩﻩﻩPointx[m_i]=point.x;Pointy[m_i]=point.y; ﻩﻩInvalidate

温馨提示

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

最新文档

评论

0/150

提交评论