直线段剪裁实验资料报告材料.doc

上传人:夺命阿水 文档编号:14626 上传时间:2022-06-28 格式:DOC 页数:11 大小:110.50KB
返回 下载 相关 举报
直线段剪裁实验资料报告材料.doc_第1页
第1页 / 共11页
直线段剪裁实验资料报告材料.doc_第2页
第2页 / 共11页
直线段剪裁实验资料报告材料.doc_第3页
第3页 / 共11页
直线段剪裁实验资料报告材料.doc_第4页
第4页 / 共11页
直线段剪裁实验资料报告材料.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《直线段剪裁实验资料报告材料.doc》由会员分享,可在线阅读,更多相关《直线段剪裁实验资料报告材料.doc(11页珍藏版)》请在课桌文档上搜索。

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

2、ine 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_NE 0x000a#define CLIP_CODE_SE 0x0006#define CLIP_CODE_NW 0x0009#define CLIP_CODE_SW 0x0005实验步骤:1生成裁剪窗口,窗口由直线xl=250,xr=850,yb=250,yt=4502绘制直线段3编写Cohen-Suther

3、land直线裁剪算法,对直线段进展裁剪编码定义规如此:第一位C1:假设端点位于窗口之左侧,即 Xxr,如此 C2=1,否如此 C2=0。第三位C3:假设端点位于窗口之下侧,即 Yyt,如此 C4=1,否如此 C4=0。裁剪步骤:对所有直线的端点都建立了区域码之后,就可按区域码判断直线在窗口之或窗口之外。这可分为如下几种情况:假设一直线的两个端点的区域码均为0000如此此直线在窗口边界之,应子保存。假设一直线的两个端点的区域码的同一位同时为1,如此此直线全部在窗口边界之外,应子裁剪。例如,假设一直线的一个端点的区域码为1001,另一个端点的区域码为0101,如此此两端点的区域码的第一位均为1,说

4、明此两端点均在窗口边界之左,因此,直线在窗口边界之外,应予裁剪。可用将直线两个端点的区域码进展与操作的方法,判断直线是否在窗口之外,假设与操作的结果为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 = (RC0|RC1)/简取之return;else if(0!=(RC0 & RC1)/

6、简弃之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(RC0 & LEFT )/P0点位于窗口的左侧x=wxl;/求交点yy=Pointy0+(Pointy1-Poin

7、ty0)*(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;Change=TRUE;RC0=EnCode(Pointx0,Pointy0);RC1=EnCode(Pointx1,Po

8、inty1);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+(Pointx1-Pointx0)*(y-Pointy0)/(Pointy1-Pointy0);Pointx0=x;Poin

9、ty0=y;Change=TRUE;RC0=EnCode(Pointx0,Pointy0);RC1=EnCode(Pointx1,Pointy1);if(FALSE=Change)return;void CCsLineView:OnDraw(CDC* pDC)CRect Rect;GetClientRect(&Rect);/获得客户区的大小CBitmapBitmap,*pBitmap;Bitmap.LoadBitmap(IDB_BITMAP1);CDCMemDC;MemDC.CreatepatibleDC(GetDC();pBitmap=MemDC.SelectObject(&Bitmap);

10、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.MoveTo(wxl,wyt);MemDC.LineTo(wxr,wyt);MemDC.LineTo(wxr,wyb);MemDC.LineTo(wx

11、l,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),ROUND(Pointy0);MemDC.LineTo(ROUND(Pointx1),ROUND(Pointy1);MemDC.SelectObject(pO

12、ldPen1);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.CreatepatibleDC(GetDC();CBitmap*Bitmap,*pBitmap;Bitmap=new CBitmap;Bitmap-LoadBitmap(IDB_BITMAP1);pBitm

13、ap=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 her

14、e and/or call defaultif(TRUE=m_Draw)if(m_i2)Pointxm_i=point.x;Pointym_i=point.y;Invalidate(FALSE);CView:OnMouseMove(nFlags, point);void CCsLineView:OnLButtonDown(UINT nFlags, CPoint point) /单击鼠标左键函数if(TRUE=m_Draw)if(m_i2)Pointxm_i=point.x;Pointym_i=point.y;m_i+;CView:OnLButtonDown(nFlags, point);11 / 11

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号