已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学 实验报告实验四:梁友栋-Barsky直线裁剪算法学 生: 杨双涛 学 号: 0 班 级: 网络121班 实验时间: 2014.11.27 学 院: 电气与信息工程学院 梁友栋-Barsky直线裁剪算法1.实验目的1、深入理解Liang-Barsky裁剪算法的原理;2、学会使用Liang-Barsky裁剪算法实现对直线段以及多边形的裁剪函数;3、比较Liang-Barsky裁剪算法与Cohen-Sutherland裁剪算法的区别,并动手实现两种算法,体会Liang-Barsky裁剪算法的优势;4、掌握Liang-Barsky裁剪算法的裁剪原理,在理解的基础上动手完成实验任务。2、实验环境Visual C+6.03、实验原理梁友栋与Barsky提出了比Cohen-Sutherland裁剪算法速度更快的直线段裁剪算法。该算法是以直线的参数方程为基础设计的,把判断直线段与窗口边界求交的二维裁剪问题转化为求解一组不等式,确定直线段参数的一维裁剪问题。Liang-Barsky裁剪算法把直线段与窗口的相互位置关系划分为两种情况进行讨论:平行于窗口边界的直线段与不平行与窗口边界的直线段。设起点为P0(x0,y0),终点坐标为P1(x1,y1)的直线段参数方程为:P=P0+t(P1-P0)展开形式为:X=x0+t(x1-x0)Y=y0+t(y1-y0)式中,0 t 1。对于对角点(Wxl,Wyt)、(Wxr,Wyb)的矩形裁剪窗口,直线段裁剪条件如下:Wxl x0+t(x1-x0) WxrWyty0+t(y1-y0) Wyb分解后有:t(x0-x1)x0-Wxlt(x1-x0)Wxr-x0t(y0-y1)y0-Wybt(y1-y0)Wyt-y0将x=x1-x0,y=y1-y0代入上式得到:t*(-x)x0-Wxl t*xWxr-x0 t*(-y)y0-Wyb t*yWyt-y0令:u1=-x,v1=x0-Wxlu2=x,v2=Wxr-x0u3=-y,v3=y0-Wybu4=y,v4=Wyt-y0则统一表示为:t*UnVn,n=1,2,3,4N代表直线段裁剪时,窗口的边界顺序,n=1表示左边界;n=2表示右边界;n=3表示下边界;n=4表示上边界。上式给出了直线段的参数方程裁剪条件。4. 实验内容绘制一个裁剪框,在裁剪框内绘制直线,点击裁剪,实现对直线的裁剪。5. 源程序清单/ TestView.cpp : implementation of the CTestView class/#include stdafx.h#include Test.h#include TestDoc.h#include TestView.h#define ROUND(a) int(a+0.5)/四舍五入#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)/AFX_MSG_MAP(CTestView)ON_COMMAND(ID_MENUDrawLine, OnMENUDrawLine)ON_COMMAND(ID_MENUClip, OnMENUClip)ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CTestView construction/destructionCTestView:CTestView()/ TODO: add construction code here/窗口位置坐标wxl=250;wxr=850;wyb=250;wyt=450;m_Attatch=FALSE;m_i=0;m_Draw=FALSE;CTestView:CTestView()BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CTestView drawingvoid CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect Rect;GetClientRect(&Rect);/获得客户区的大小CBitmapBitmap,*pBitmap;Bitmap.LoadBitmap(IDB_BITMAP);CDCMemDC;MemDC.CreateCompatibleDC(GetDC();pBitmap=MemDC.SelectObject(&Bitmap);MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);MemDC.TextOut(ROUND(wxl+wxr)/2),ROUND(wyb-20),窗口);/窗口标题/绘制窗口和直线CPen Pen3,*pOldPen3;/定义3个像素的画笔Pen3.CreatePen(PS_SOLID,3,RGB(0,0,0);pOldPen3=MemDC.SelectObject(&Pen3);MemDC.MoveTo(ROUND(wxl),ROUND(wyt);MemDC.LineTo(ROUND(wxr),ROUND(wyt);MemDC.LineTo(ROUND(wxr),ROUND(wyb);MemDC.LineTo(ROUND(wxl),ROUND(wyb);MemDC.LineTo(ROUND(wxl),ROUND(wyt);MemDC.SelectObject(pOldPen3);Pen3.DeleteObject();CPen Pen1,*pOldPen1;/定义1个像素的画笔Pen1.CreatePen(PS_SOLID,1,RGB(0,0,255);pOldPen1=MemDC.SelectObject(&Pen1);if(m_i=1)MemDC.MoveTo(ROUND(Pointx0),ROUND(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);/ Rect printingBOOL CTestView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CTestView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CTestView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CTestView diagnostics#ifdef _DEBUGvoid CTestView:AssertValid() constCView:AssertValid();void CTestView:Dump(CDumpContext& dc) constCView:Dump(dc);CTestDoc* CTestView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CTestDoc);return (CTestDoc*)m_pDocument;#endif /_DEBUG/ CTestView message handlersvoid CTestView:OnMENUDrawLine()/绘制直线菜单函数 / TODO: Add your command handler code hereif(FALSE=m_Attatch)Picture.CreateCompatibleDC(GetDC();CBitmap*Bitmap,*pBitmap;Bitmap=new CBitmap;Bitmap-LoadBitmap(IDB_BITMAP);pBitmap=Picture.SelectObject(Bitmap);m_Attatch=TRUE;m_Draw=TRUE;m_i=0;Invalidate(FALSE);AfxGetMainWnd()-SetWindowText(案例12:梁友栋Barsky直线裁剪算法);/显示标题MessageBox(请使用鼠标在屏幕上绘制直线,然后点击裁剪按钮进行裁剪,提示,MB_OKCANCEL);void CTestView:OnMENUClip()/裁剪菜单函数 / TODO: Add your command handler code hereClip(&Pointx0,&Pointy0,&Pointx1,&Pointy1);Invalidate(FALSE);void CTestView:OnLButtonDown(UINT nFlags, CPoint point)/单击鼠标左键函数 / TODO: Add your message handler code here and/or call defaultif(TRUE=m_Draw)if(m_i2)Pointxm_i=point.x;Pointym_i=point.y;m_i+;CView:OnLButtonDown(nFlags, point);void CTestView:OnMouseMove(UINT nFlags, CPoint point)/鼠标移动函数 / TODO: Add your message handler code here 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 CTestView:Clip(double *x1,double *y1,double *x2,double *y2)/裁剪函数double tmax,tmin,dx,dy;dx=*x2-*x1;dy=*y2-*y1;tmax=0.0,tmin=1.0;/窗口边界的左、右、下、上顺序裁剪直线if(ClipTest(-dx,*x1-wxl,&tmax,&tmin)/n1,左边界u1x,v1x1wxlif(ClipTest(dx,wxr-*x1,&tmax,&tmin)/n2,右边界u2x,v2wxrx1if(ClipTest(-dy,*y1-wyb,&tmax,&tmin)/n3,下边界u3y,v3y1-wybif(ClipTest(dy,wyt-*y1,&tmax,&tmin)/n4,上边界u4y,v4wyt-y1if(tmin0.0)/判断直线的起点*x1+=tmax*dx;*y1+=tmax*dy;int CTestView:ClipTest(double u,double v,double *tmax,double *tmin)/裁剪测试函数/顺序左右下上double t;int ReturnValue=TRUE;if(u*tmin)ReturnValue=FALSE;else if(t*tmax
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年高考地理临考冲刺卷02(浙江专用)(全解全析)
- 化学01(浙江卷)(考试版)-2026年高考考前预测卷
- 压铸工段冷却系统监测维护计划
- 预结算审核制度招标资料规范
- 混凝土搅拌站设备日常维护规范
- 装配车间电气安全维护标准
- 机加工车间订单交付进度方案
- 防水层施工质量交底措施指南
- 重症医学科患者转运规范
- 施工围挡景观亮化安全管理规范
- 第4章 光谱表型分析技术
- 山西2026届高三天一小高考五(素质评价)地理+答案
- 2026年上海对外经贸大学辅导员招聘笔试模拟试题及答案解析
- 《数智化零售品类管理实务》课件-情境三 仓储会员店:人货场重构与价值逻辑
- AI赋能地理教学的应用实践研究-初中-地理-论文
- 浙江省杭州山海联盟2024-2025学年度七年级英语下册期中试题卷(含答案)
- 2026山东青岛海上综合试验场有限公司招聘38人备考题库含完整答案详解(历年真题)
- 护理团队建设与沟通技巧
- 芯片销售培训内容
- 耳石症手法复位治疗课件
- 美世3P绩效管理
评论
0/150
提交评论