




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、洛阳理工学院实验报告系别计算机与信 息工程系班级B120531学号B12053113姓名课程名称计算机图形学实验日期2013-11-7实验名称多边形填充算法编程成绩实验目的:熟悉多边形填充算法,掌握MFC图形编程的基本方法和调试技巧。实验条件:计算机;VS2008; OpenGL实验内容:1.使用MFCft术实现多边形有效边表填充算法,参考界面效果如下:r/ ChildView.cpp : CChildView类的实现#include "stdafx.h"#include "demo.h"#include "ChildView.h"#
2、include <math.h>#define Round(d) int (floor(d+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()/ CChild
3、View消息处理程序BOOL CChildView:PreCreateWindow(CREATESTRUCT& 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 <HBRUSH>(COLOR
4、_WINDOW+1), NULL);return TRUE;void CChildView:OnPaint()CPaintDC dc( this ); /用于绘制的设备上下文/ 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
5、.y = -250;P6.x = 300; P6.y = 150;void CChildView:DrawPolygon(CDC *pDC)/ 绘制多边形边界CLine *line = new CLine;CP2 t;for (int i = 0; i < 7; i+)if (i = 0)line->MoveTo(pDC, Pi);t = Pi;elseline->LineTo(pDC, Pi);line->LineTo(pDC, t);/绘制多边形/闭合多边形delete line;void CChildView:DrawGraph()CRect rect;GetCl
6、ientRect(&rect);CDC *pDC = GetDC();pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(), rect.Height();pDC->SetViewportExt(rect.Width(), -rect.Height();垂直向上/绘制图形/定义客户区/获得客户区的大小/定义设备上下文指针/自定义坐标系/设置窗口比例/设置视区比例,且x轴水平向右,y轴pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2)
7、;rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);if (!bFill)DrawPolygon(pDC);/ 绘制多边形elseFillPolygon(pDC);/ 填充多边形ReleaseDC(pDC);/ 释放 DC/设置客户区中心为坐标系原点/矩形与客户区重合void CChildView:FillPolygon(CDC *pDC)/填充多边形for (int i = 0; i < 7; i+)/转储顶点坐标,y坐标取为整数P1i.x = Pi.x;P1i.y = Round(Pi.y);P1i.c = CRGB(bRe
8、d / 255.0, bGreen / 255.0, bBlue / 255.0);CFill *fill =new CFill;/动态分配内存fill->SetPoint(P1, 7);/初始化Fill对象fill->CreateBucket();/建立桶表fill->CreateEdge();/ 建立边表fill->Gouraud(pDC);/ 填充多边形delete fill;/ 撤销内存int CChildView:OnCreate(LPCREATESTRUCT IpCreateStruct)if (CWnd:OnCreate(lpCreateStruct) =
9、 -1) return -1;/ 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);/获取红色分量bG
10、reen = GetGValue(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 <math.h>#define Ro
11、und(d) int (floor(d+0.5)/ 四舍五入宏定义#ifdef _DEBUG#define new DEBUG_NEW#endif/ CdemoViewIMPLEMENT_DYNCREATE(CdemoView, CView)BEGIN_MESSAGE_MAP(CdemoView, CView)/标准打印命令ON_COMMAND(ID_, &CView:On)ON_COMMAND(ID_, &CView:On)ON_COMMAND(ID_, &CdemoView:On)ON_COMMAND(ID_DRAW_PIC, &CdemoView:OnDr
12、awPic)END_MESSAGE_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 = GetDocum
13、ent();ASSERT_VALID(pDoc);if (!pDoc) return ;/ TODO:在此处为本机数据添加绘制代码DrawGraph();/ CdemoView 打印void CdemoView:On()AFXPrintPreview( this );BOOL CdemoView:OnPreparePrinting(CPrintInfo* pInfo) /默认准备return DoPreparePrinting(pInfo);void CdemoView:OnBeginPrinting(CDC* /*pDC*/ , CPrintInfo* /*pInfo*/ ) / TODO:
14、添加额外的打印前进行的初始化过程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()->
15、;ShowPopupMenu(IDR_POPUP_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 =
16、0; i < 7; i+)if (Pi.x > MaxX)MaxX = Pi.x;if (Pi.x < MinX)MinX = Pi.x;if (Pi.y > MaxY)MaxY = Pi.y;if (Pi.y < MinY)MinY = Pi.y;CLine *line = new CLine;CP2 t;for (int i = 0; i < 7; i+)if (i = 0)line->MoveTo(pDC, Pi);t = Pi;else line->LineTo(pDC, Pi);line->LineTo(pDC, t);line-
17、>MoveTo(pDC, CP2(MinX, MinY);line->LineTo(pDC, CP2(MinX, MaxY);/计算多边形边界/绘制多边形/闭合多边形/绘制包围盒/背景色/填充色/边的最小y值与最大y值/x,y当前点,酬率的倒数/循环多边形所有边/计算/k/得到每条边y的最大值与最小值/ 得到 x|ymin/沿每一条边循环扫描线/对每一条扫描线与边的交点的右侧像素循环/如果是填充色/置为背景色/置为填充色/计算下一条扫描线的x起点坐标/绘制图形/定义客户区/获得客户区的大小line->LineTo(pDC, CP2(MaxX, MaxY);line->L
18、ineTo(pDC, CP2(MaxX, 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;double x, y, k;for (int i = 0; i < 7; i+)int j = (i + 1) % 7;k = (Pi.x - Pj.x) / (Pi.y - Pj.y);if (Pi.y < Pj.
19、y) ymin = Round(Pi.y);ymax = Round(Pj.y);x = Pi.x; else ymin = Round(Pj.y); ymax = Round(Pi.y);x = Pj.x;for (y = ymin; y < ymax; y+)for (int m = Round(x); m < MaxX; m+)if (FClr = pDC->GetPixel(m, Round(y) pDC->SetPixelV(m, Round(y), BClr);elsepDC->SetPixelV(m, Round(y), FClr); x += k;
20、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轴垂直向上pDC->SetViewportOrg(rect.Width() / 2, rect.
21、Height() / 2);/设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);/矩形与客户区重合if (!bFill)DrawPolygon(pDC);/ 绘制多边形else FillPolygon(pDC);/ 填充多边形ReleaseDC(pDC);/ 释放 DC / CdemoView 诊断 #ifdef _DEBUG void CdemoView:AssertValid() const CView:AssertValid(); void CdemoView:Dump(CDumpContext&
22、; dc) const CView:Dump(dc); CdemoDoc* CdemoView:GetDocument() const / 非调试版本是内联的 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CdemoDoc); return (CdemoDoc*)m_pDocument; #endif /_DEBUG / CdemoView消息处理程序 void CdemoView:OnInitialUpdate() CView:OnInitialUpdate();/ TODO:在此添加专用代码和/或调用基类 bFill = FALSE; Read
23、Point();GetClr = RGB(0,0,0);MinX = MaxX = P0.x; MinY = MaxY = P0.y; void CdemoView:OnDrawPic() / TODO:在此添加命令处理程序代码 CColorDialog ccd(GetClr, CC SOLIDCOLOR);if (IDOK = ccd.DoModal() /调用颜色对话框选取填充色 GetClr = ccd.GetColor();else return ;bFill = TRUE;Invalidate(FALSE);3.使用MFC技术实现种子填充算法,参考界面效果如下:/ demoView.
24、cpp : CdemoView类的实现#include "stdafx.h"#include "demo.h"#include "demoDoc.h"#include "demoView.h"#include <math.h>#define Round(d) int (floor(d+0.5)/ 四舍五入宏定义#ifdef _DEBUG#define new DEBUG_NEW#endif/ CdemoViewIMPLEMENT_DYNCREATE(CdemoView, CView) BEGIN_MES
25、SAGE_MAP(CdemoView, CView)/标准打印命令ON_COMMAND(ID_, &CView:On)ON_COMMAND(ID_, &CView:On) ON_COMMAND(ID_, &CdemoView:On) ON_WM_LBUTTONDOWN()ON_COMMAND(ID_DRAW_PIC, &CdemoView:OnDrawPic) END_MESSAGE_MAP() / CdemoView 构造/析构 CdemoView:CdemoView() / TODO:在此处添加构造代码bFill = FALSE;SeedClr = RGB(
26、255, 0, 0);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(pDoc); if (!pDoc) return ;/ TODO:在此处为本机数据添加绘制
27、代码 DrawGraph();/ CdemoView 打印void CdemoView:On() AFXPrintPreview( this );BOOL CdemoView:OnPreparePrinting(CPrintInfo* pInfo) /默认准备return DoPreparePrinting(pInfo);void CdemoView:OnBeginPrinting(CDC* /*pDC*/ , CPrintInfo* /*pInfo*/ )/ TODO:添加额外的打印前进行的初始化过程 void CdemoView:OnEndPrinting(CDC* /*pDC*/ , C
28、PrintInfo* /*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_POPUP_EDIT, point.x, point.y, this , TR
29、UE); / CdemoView 诊断#ifdef _DEBUGvoid CdemoView:AssertValid() constCView:AssertValid();void CdemoView:Dump(CDumpContext& dc) constCView:Dump(dc);CdemoDoc* CdemoView:GetDocument() const / 非调试版本是内联的ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CdemoDoc);return (CdemoDoc*)m_pDocument;#endif /_DEBUGv
30、oid CdemoView:DrawGraph() / 绘制图形/定义设备上下文指针/获得客户区的大小/自定义坐标系/设置窗口比例/设置视区比例,且x轴水平向右,y轴/设置客户区中心为坐标系原点CDC *pDC = GetDC();GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(), rect.Height();pDC->SetViewportExt(rect.Width(), -rect.Height();垂直向上pDC->SetViewport
31、Org(rect.Width() / 2, rect.Height() / 2);rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);CDC MemDC/;内存 DCCBitmap NewBitmap, *pOldBitmap;MemDC.CreateCompatibleDC(pDC);NewBitmap.LoadBitmap(IDB_BITMAP1);pOldBitmap = MemDC.SelectObject(&NewBitmap);MemDC.SetMapMode(MM_ANISOTROPIC);MemDC.SetWin
32、dowExt(rect.Width(), rect.Height();/矩形与客户区重合/内存中承载图像的位图/建立与屏幕pDCl容的MemDC/导入空心汉字位图/将兼容位图选入MemDC/MemDC自定义坐标系MemDC.SetViewportExt(rect.Width(), -rect.Height();MemDC.SetViewportOrg(rect.Width() / 2, rect.Height() / 2);pDC->BitBlt(-rect.Width() / 2, -rect.Height() / 2, rect.Width(), rect.Height(), &am
33、p;MemDC, -rect.Width() / 2, -rect.Height() / 2, SRCCOPY);if (bFill)CharFill(pDC);MemDC.SelectObject(pOldBitmap);NewBitmap.DeleteObject();MemDC.DeleteDC();ReleaseDC(pDC);void CdemoView:CharFill(CDC *pDC)COLORREF BoundaryClr = RGB(0,0,0);BOOL bSpanFill;pHead = new CStackNode;pHead->pNext = NULL;Pus
34、h(Seed);int x, y, x0 = Round(Seed.x), y0 = Round(Seed.y);/将内存位图拷贝到屏幕/填充空心汉字/恢复位图/删除位图/ 删除 MemDC/释放DC/文字填充函数/边界色/建立栈结点/栈头结点的指针域总为空/种子像素入栈/x , y用于判断种子与图形的位置关系x = x0 - 1;while (pDC->GetPixel(x, y0) != BoundaryClr && pDC->GetPixel(x, y0) != SeedClr )/ 左方判断x-;if (x <= -rect.Width() / 2)
35、MessageBox(L"种子不在图形之内",L "警告");/到达客户区最左端return ;y = y0 + 1;while (pDC->GetPixel(x0, y) != BoundaryClr && pDC->GetPixel(x0, y) != SeedClr)/ 上方判断y+;if (y >= rect.Height() / 2)到达客户区最上端MessageBox(L"种子不在图形之内",L "警告");return ; x = x0 + 1;while (pDC-
36、>GetPixel(x, y0) != BoundaryClr && pDC->GetPixel(x, y0) != SeedClr)/ 右方判断x+;if (x >= rect.Width() / 2)/到达客户区最右端MessageBox(L"种子不在图形之内",L "警告");return ;y = y0 - 1;while (pDC->GetPixel(x0, y) != BoundaryClr && pDC->GetPixel(x0, y) != SeedClr)/ 下方判断y-;i
37、f (y <= -rect.Height() / 2)/ 到达客户区最下端MessageBox(L"种子不在图形之内",L "警告");return ; double xleft, xright; /区间最左端与最右端像素CP2 PopPoint, PointTemp;while (pHead->pNext != NULL) / 如果栈不为空Pop(PopPoint);if (pDC->GetPixel(Round(PopPoint.x), Round(PopPoint.y) = SeedClr) continue ;/分别向左和向右填
38、充扫描线PointTemp = PopPoint;while (pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != BoundaryClr && pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != SeedClr)pDC->SetPixelV(Round(PointTemp.x), Round(PointTemp.y), SeedClr);PointTemp.x+;xright = PointTemp.x - 1;PointTemp.x =
39、PopPoint.x - 1;while (pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != BoundaryClr && pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != SeedClr)pDC->SetPixelV(Round(PointTemp.x), Round(PointTemp.y), SeedClr);PointTemp.x-; xleft=PointTemp.x + 1;/处理上一条扫描线PointTemp.x = xle
40、ft;PointTemp.y = PointTemp.y + 1;while (PointTemp.x < xright) bSpanFill = FALSE;while (pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != BoundaryClr && pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != SeedClr)bSpanFill = TRUE;PointTemp.x+;if (bSpanFill)if (PointTemp.x =
41、 xright && pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != BoundaryClr &&pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != SeedClr)PopPoint = PointTemp;elsePopPoint.x = PointTemp.x - 1; PopPoint.y = PointTemp.y;Push(PopPoint); bSpanFill = FALSE;while (pDC->GetP
42、ixel(Round(PointTemp.x), Round(PointTemp.y) = BoundaryClr &&PointTemp.x < xright) | (pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) = SeedClr &&PointTemp.x < xright)PointTemp.x+;/处理下一条扫描线PointTemp.x = xleft;PointTemp.y = PointTemp.y - 2;while (PointTemp.x < xright) bSpanFill = FALSE;while (pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != BoundaryClr && pDC->GetPixel(Round(PointTemp.x), Round(PointTemp.y) != SeedClr)bSpanFill = TRUE;PointTemp.x+;if (bSpanFill)if (PointTemp.x =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《如何制作课件》教程
- 2025年地理高考复习 专题05“演变过程类”选择题答题技巧(原卷版)
- 给予员工转正评语简短
- 2025版权转让合同协议书
- 工作计划中的学习与成长机会
- 浙江省9+1高中联盟2023-2024学年高二上学期期中考试历史 无答案
- 四川省南充市2021-2022学年高一上学期模拟质量监测物理试题 含解析
- 广东省茂名市2021-2022学年高二下学期期末教学质量监测政治含答案
- 安徽省池州市贵池区2022-2023学年高一下学期期中语文 含解析
- 黑龙江省鸡西市密山市高级中学2023-2024学年高三上学期1月期末考生物含解析
- 2023年上海市普通高中学业水平等级性考试化学真题试卷含答案
- 高考英语单词3500记忆短文40篇
- PE管安装施工方案
- 童装陈列手册
- 十二指肠癌学习课件
- 电动自行车骑行安全与维护
- 社区获得性肺炎教学查房课件
- 2024年国家电投招聘笔试参考题库含答案解析
- JCT2166-2013 夹层玻璃用聚乙烯醇缩丁醛(PVB)胶片
- 建设工程竣工消防验收记录表
- 完整版融资方案ppt样本
评论
0/150
提交评论