




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学实验报告实验1 使用画线算法,绘制直线段姓名系别班级学号实验日期指导教师实验成绩杜艾莲地信10110081409252011.10.10一 实验目的及要求(1)掌握图形学中常用的三种画线算法:数值微分法、中点画线法和Bresenham画线算法。(2)掌握绘制直线的程序设计方法。(3)掌握使用文件来保存直线段的方法。(4)掌握从文本文件中恢复出直线的方法。二 实验内容使用VC+ 6.0开发环境,分别实现中点画线算法和Bresenham画线算法,绘制直线(注意,不能使用VC中已有的绘制直线的函数),并以文本文件的形式保存绘制的结果,可以从文本文件中恢复出以前绘制过的直线。三 算法设计与分析 输入P0(X0,Y0) 和P1(X1,Y1)计算初始值x,yd=x-2y,x=X0,y=Y0(x,y) 更新为(x+1,y+1),d更新为d+2x-2y(x,y)更新为(x+1,y),d更新为d-2y结束Bresenham算法绘制直线的程序(仅包含整数运算)。void MidBresenhamLine(int x0,int y0,int x1,int y1,int color) int dx,dy,d,UpIncre,DownIncre,x,y;if(x0x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(x=x1)putpixel(x,y,color);X+;if(d0)y+;d+=UpIncre;else d+=DownIncre;四 程序调试及运行结果的自我分析与自我评价/ testView.cpp : implementation of the CTestView class#include stdafx.h#include test.h#include testDoc.h#include testView.h#include / ifstream、ofstream等位于其中#include #include / string类型需要#include DlgInput.h/CDlgInput类的头文件usingnamespace std;#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_MENUITEM32771, OnMenuitem32771)ON_COMMAND(ID_MENUBRESENHAMLINE, OnMenubresenhamline)ON_COMMAND(ID_MENUCLEARVIEW, OnMenuclearview)ON_COMMAND(ID_FILE_OPEN, OnFileOpen)ON_COMMAND(ID_FILE_SAVE, OnFileSave)/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 herem_nFlag = -1;/ 不是任何绘图类型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 hereif(1=m_nFlag)/中点画线MidPointLine(m_X0, m_Y0, m_X1, m_Y1, RGB(255,0,0) );else if(2=m_nFlag)/ Bresenham画线BresenhamLine(m_X0, m_Y0, m_X1, m_Y1, RGB(0,255,0) );/ CTestView 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:OnMenuitem32771() / TODO: Add your command handler code herem_nFlag = 1;/中点画线CDlgInputdlg;if(IDOK=dlg.DoModal()m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow();/重绘窗口void CTestView:OnMenubresenhamline() / TODO: Add your command handler code herem_nFlag = 2;/Bresenham画线CDlgInputdlg;if(IDOK=dlg.DoModal()m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow();/重绘窗口/ 算法:中点画线/ 输入:起点(x0,y0),终点(x1,y1);/输入要求x0=x0d=2*a+b; d0=2*a-b;d1=2*a; d2=2*(a+b); d3=2*b; d4=2*(a-b); d5=a-2*b;x=x0; y=y0;pDC-SetPixel(x,y,color);if(x=x1)/ 斜率k为无穷大if(y=y1)while(ySetPixel(x,y,color); y+;elsewhile(y=y1) pDC-SetPixel(x,y,color); y-;/ if 斜率k为无穷大else/斜率k为有限值/double k=-a/b;/if( k+11e-6 & k-11e-6 | fabs(k-1)1e-6 | fabs(k+1)1e-6) /|k|=1(即:-1= k =1),与1e-6比较是浮点数比较方法if( -b=-a & -a=b )/ 用浮点数比较在|k|=1.0f时容易出问题,所以直接用整数比较(将斜率k转换为a与b的比较;之前的设置已经保证b为正数)if(y=y1)while(xx1)if(dSetPixel(x,y,color);elsewhile(xx1)if(d0SetPixel(x,y,color);/ if( |k|1if(y=y1)while(xx1)if(dSetPixel(x,y,color);elsewhile(xx1)if(d5SetPixel(x,y,color);/ else( |k|1 )/ else 斜率k为有限值ReleaseDC(pDC);/ 算法:Bresenham画线/ 输入:起点(x0,y0),终点(x1,y1);/输入要求x0=x1;void CTestView:BresenhamLine( int x0, int y0, int x1, int y1, int color )CDC * pDC=GetDC();int x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(xSetPixel(x,y,color); x+; e=e+2*dy; if(e0) y+; e=e-2*dx; void CTestView:OnMenuclearview() / TODO: Add your command handler code herem_X0=0;m_Y0=0;m_X1=0;m_Y1=0;RedrawWindow();/重绘窗口/ 打开过去保存的文件,该文件包含直线的端点坐标void CTestView:OnFileOpen()/ TODO: 在此添加命令处理程序代码if( m_nFlag!=1 & m_nFlag!=2 )MessageBox(请先在菜单中选择绘制直线的方法!,提示,MB_ICONWARNING);return;CFileDialogdlgFile (TRUE, _T(txt), _T(),OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, _T(线段端点坐标文件(*.txt)|*.txt|), this);if( IDOK = dlgFile.DoModal()CStringfileName = dlgFile.GetFileName();ifstreamrFile;rFile.open(fileName,ios:in);if ( ! rFile.is_open() )MessageBox(文件打开失败!,提示,MB_ICONWARNING);return;CStringstrLine0;stringstrLine;intnX,nY;/ 起点、终点,两个坐标rFilestrLine;strLine0 = strLine.c_str();nX = atoi( strLine0.Left( strLine0.Find(,) ) );/ 解析文件,如“220,221”表示一个点的x、y坐标nY = atoi( strLine0.Mid( strLine0.Find(,)+1 ) );m_X0 = nX;m_Y0 = nY;rFilestrLine;strLine0 = strLine.c_str();nX = atoi( strLine0.Left( strLine0.Find(,) ) );nY = atoi( strLine0.Mid( strLine0.Find(,)+1 ) );m_X1 = nX;m_Y1 = nY;RedrawWindow();rFile.close();/ 保存当前视图上绘制的所有直线的端点坐标void CTestView:OnFileSave()/ TODO: 在此添加命令处理程序代码CFileDialogdlgFile(FALSE, _T(txt), _T(), OFN_OVERWRITEPROMPT, _T(线段端点坐标文件(*.txt)|*.txt|), this);if( IDOK = dlgFile.DoModal()/ 保存文件CStringstrFileName = dlgFile.GetFileName();/ 包含完整路径的文件名称ofstreamwFile;wFile.open(strFileName,ios:out|ios:ate|ios:app);if ( ! wFile.is_open() )MessageBox(strFileName+文件创建失败!,提示,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美容院设备维护合同
- 股权质押担保合同
- 劳务合同样本提供
- 上海五金仓储托管合同样本
- 乡村路灯采购合同范例
- 专销低价混凝土合同样本
- 修路结账合同标准文本
- 关于房租合同标准文本
- 科研项目图书采购合同范文
- 共享空间租赁合同标准文本
- 医院医用耗材采购管理方案
- 2025年八省联考高考语文试卷评析及复习备考指导课件
- 《化妆品包装材料相容性试验评估指南》
- 浙江省J12共同体联盟校2024-2025学年八年级上学期期中语文试题
- 高校实验室耗材管理制度
- 2025年国家保密基本知识考试题库及答案
- 企业管理咨询服务合同与企业管理服务合同
- 《旅游市场营销》课程教案
- 《考虑碳排放权的LZ光伏发电企业价值评估案例研究》
- 2024年新疆区公务员录用考试《行测》真题及答案解析
- 《测试反应快慢》说课稿 -2023-2024学年科学二年级下册教科版
评论
0/150
提交评论