实验三计算机图形学多边形填充算法.doc
《实验三计算机图形学多边形填充算法.doc》由会员分享,可在线阅读,更多相关《实验三计算机图形学多边形填充算法.doc(17页珍藏版)》请在咨信网上搜索。
1、洛阳理工学院实验报告系别计算机与信息工程系班级B120531学号B12053113姓名课程名称计算机图形学实验日期2013-11-7实验名称多边形填充算法编程成绩实验目的: 熟悉多边形填充算法,掌握MFC图形编程的基本方法和调试技巧。实验条件: 计算机;VS2008;OpenGL实验内容: 1使用MFC技术实现多边形有效边表填充算法,参考界面效果如下:/ ChildView.cpp : CChildView 类的实现#include stdafx.h#include demo.h#include ChildView.h#include #define Round(d) int(floor(d+
2、0.5)/四舍五入宏定义#ifdef _DEBUG#define new DEBUG_NEW#endif/ CChildViewCChildView:CChildView()CChildView:CChildView()BEGIN_MESSAGE_MAP(CChildView, CWnd)ON_WM_PAINT()ON_WM_CREATE()ON_COMMAND(ID_DRAW_PIC, &CChildView:OnDrawPic)END_MESSAGE_MAP()/ CChildView 消息处理程序BOOL CChildView:PreCreateWindow(CREATESTRUCT&
3、cs) if (!CWnd:PreCreateWindow(cs)return FALSE;cs.dwExStyle |= WS_EX_CLIENTEDGE;cs.style &= WS_BORDER;cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, :LoadCursor(NULL, IDC_ARROW), reinterpret_cast(COLOR_WINDOW+1), NULL);return TRUE;void CChildView:OnPaint() CPaintDC dc(this); / 用
4、于绘制的设备上下文/ TODO: 在此处添加消息处理程序代码DrawGraph();/ 不要为绘制消息而调用CWnd:OnPaint()void CChildView:ReadPoint()/点表P0.x = 50; P0.y = 100;P1.x = -150;P1.y = 300;P2.x = -250;P2.y = 50;P3.x = -150;P3.y = -250;P4.x = 0; P4.y = -50;P5.x = 100; P5.y = -250;P6.x = 300; P6.y = 150;void CChildView:DrawPolygon(CDC *pDC)/绘制多边形
5、边界CLine *line = new CLine;CP2 t;for(int i = 0; i MoveTo(pDC, Pi);t = Pi;elseline-LineTo(pDC, Pi);line-LineTo(pDC, t);/闭合多边形delete line;void CChildView:DrawGraph()/绘制图形CRect rect; /定义客户区GetClientRect(&rect); /获得客户区的大小CDC *pDC = GetDC();/定义设备上下文指针 pDC-SetMapMode(MM_ANISOTROPIC);/自定义坐标系pDC-SetWindowExt
6、(rect.Width(), rect.Height();/设置窗口比例pDC-SetViewportExt(rect.Width(), -rect.Height();/设置视区比例,且x轴水平向右,y轴垂直向上pDC-SetViewportOrg(rect.Width() / 2, rect.Height() / 2);/设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);/矩形与客户区重合if(!bFill)DrawPolygon(pDC);/绘制多边形elseFillPolygon(pDC);/填充多边形
7、ReleaseDC(pDC);/释放DCvoid CChildView:FillPolygon(CDC *pDC)/填充多边形for(int i = 0; i SetPoint(P1, 7);/初始化Fill对象fill-CreateBucket();/建立桶表fill-CreateEdge();/建立边表 fill-Gouraud(pDC);/填充多边形delete fill;/撤销内存int CChildView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CWnd:OnCreate(lpCreateStruct) = -1)return -1;/
8、 TODO: 在此添加您专用的创建代码bFill = FALSE;ReadPoint();return 0;void CChildView:OnDrawPic()/ TODO: 在此添加命令处理程序代码COLORREF GetClr = RGB(0, 0, 0);/调色板颜色CColorDialog ccd(GetClr, CC_SOLIDCOLOR);if(IDOK = ccd.DoModal()/调用颜色对话框选取填充色GetClr = ccd.GetColor();elsereturn;bRed = GetRValue(GetClr);/获取红色分量bGreen = GetGValue(
9、GetClr);/获取绿色分量bBlue = GetBValue(GetClr);/获取蓝色分量bFill = TRUE;Invalidate(); 2使用MFC技术实现多边形边缘填充算法,参考界面效果如下:/ demoView.cpp : CdemoView 类的实现#include stdafx.h#include demo.h#include demoDoc.h#include demoView.h#include #define Round(d) int(floor(d+0.5)/四舍五入宏定义#ifdef _DEBUG#define new DEBUG_NEW#endif/ Cdem
10、oViewIMPLEMENT_DYNCREATE(CdemoView, CView)BEGIN_MESSAGE_MAP(CdemoView, CView)/ 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CdemoView:OnFilePrintPreview)ON_COMMAND(ID_DRAW_PIC, &CdemoView:OnDrawPic)END_MESSA
11、GE_MAP()/ CdemoView 构造/析构CdemoView:CdemoView()/ TODO: 在此处添加构造代码CdemoView:CdemoView()BOOL CdemoView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: 在此处通过修改/ CREATESTRUCT cs 来修改窗口类或样式return CView:PreCreateWindow(cs);/ CdemoView 绘制void CdemoView:OnDraw(CDC* /*pDC*/)CdemoDoc* pDoc = GetDocument();ASSERT_VALID(
12、pDoc);if (!pDoc)return;/ TODO: 在此处为本机数据添加绘制代码DrawGraph();/ CdemoView 打印void CdemoView:OnFilePrintPreview()AFXPrintPreview(this);BOOL CdemoView:OnPreparePrinting(CPrintInfo* pInfo)/ 默认准备return DoPreparePrinting(pInfo);void CdemoView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加额外的打印前
13、进行的初始化过程void CdemoView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加打印后进行的清理过程void CdemoView:OnRButtonUp(UINT nFlags, CPoint point)ClientToScreen(&point);OnContextMenu(this, point);void CdemoView:OnContextMenu(CWnd* pWnd, CPoint point)theApp.GetContextMenuManager()-ShowPopupMenu(IDR_P
14、OPUP_EDIT, point.x, point.y, this, TRUE);void CdemoView:ReadPoint()/点表P0.x = 50; P0.y = 100;P1.x = -150;P1.y = 300;P2.x = -250;P2.y = 50;P3.x = -150;P3.y = -250;P4.x = 0; P4.y = -50;P5.x = 100; P5.y = -250;P6.x = 300; P6.y = 150;void CdemoView:DrawPolygon(CDC *pDC) for(int i = 0; i MaxX)MaxX = Pi.x;
15、if(Pi.x MaxY)MaxY = Pi.y;if(Pi.y MinY)MinY = Pi.y;CLine *line = new CLine;CP2 t;for(int i = 0; i MoveTo(pDC, Pi);t = Pi;elseline-LineTo(pDC, Pi);line-LineTo(pDC, t);/闭合多边形line-MoveTo(pDC, CP2(MinX, MinY);/绘制包围盒line-LineTo(pDC, CP2(MinX, MaxY);line-LineTo(pDC, CP2(MaxX, MaxY);line-LineTo(pDC, CP2(Max
16、X, MinY);line-LineTo(pDC, CP2(MinX, MinY);delete line;void CdemoView:FillPolygon(CDC *pDC) COLORREF BClr = RGB(255, 255, 255);/背景色COLORREF FClr = GetClr;/填充色int ymin, ymax;/边的最小y值与最大y值double x, y, k;/x,y当前点,k斜率的倒数for(int i = 0; i 7; i+)/循环多边形所有边int j = (i + 1) % 7;k = (Pi.x - Pj.x) / (Pi.y - Pj.y);/
17、计算/kif(Pi.y Pj.y)/得到每条边y的最大值与最小值ymin = Round(Pi.y);ymax = Round(Pj.y);x = Pi.x;/得到x|yminelseymin = Round(Pj.y);ymax = Round(Pi.y);x = Pj.x;for(y = ymin; y ymax; y+)/沿每一条边循环扫描线for(int m = Round(x); m GetPixel(m, Round(y)/如果是填充色pDC-SetPixelV(m, Round(y), BClr);/置为背景色elsepDC-SetPixelV(m, Round(y), FClr
18、);/置为填充色x += k;/计算下一条扫描线的x起点坐标void CdemoView:DrawGraph()/绘制图形CRect rect;/定义客户区GetClientRect(&rect);/获得客户区的大小CDC *pDC = GetDC();/定义设备上下文指针 pDC-SetMapMode(MM_ANISOTROPIC);/自定义坐标系pDC-SetWindowExt(rect.Width(), rect.Height();/设置窗口比例pDC-SetViewportExt(rect.Width(), -rect.Height();/设置视区比例,且x轴水平向右,y轴垂直向上pD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 计算机 图形学 多边形 填充 算法
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。