计算机图形学实验报告实验3.docx
- 文档编号:12158494
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:15
- 大小:64.85KB
计算机图形学实验报告实验3.docx
《计算机图形学实验报告实验3.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告实验3.docx(15页珍藏版)》请在冰点文库上搜索。
计算机图形学实验报告实验3
贵州大学第三次实验报告
学院:
计算机科学与技术专业:
计科班级:
101
姓名
吕杨
学号
1008060040
同组成员
实验时间
2010-4-14
指导教师
吴云
成绩
实验项目名称
多边形填充算法
实验目的
1、掌握用扫描线法、边缘填充法、种子填充法种子填充算法或扫描线填充算法填充任一多边形区域的方法,并编程实现。
2、掌握4连通与8连通区域的扩展性
3、掌握用堆栈结构实现种子算法
实验要求
1、用一种填充算法对一多边形进行填充
2、写出该填充算法的基本原理。
3、写出该填充算法的程序
实验原理
区域填充的扫描线算法
算法的基本过程如下:
给定种子点(x,y),首先填充种子点所在扫描线上给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。
反复这个过程,直到填充结束。
区域填充的扫描线算法可由下列3个步骤实现。
(1)初始化:
确定种子点元素(x,y)。
(2)判断种子点(x,y)是否满足非边界、非填充色的条件,若满足条件,以y作为当前扫描线沿当前扫描线向左、右两个方向填充,直到边界。
(3)确定新的种子点:
检查与当前扫描线y上、下相邻的两条扫描线上的像素。
若存在非边界、未填充的像素,则返回步骤
(2)进行扫描填充。
直至区域所有元素均为填充色,程序结束。
实验环境
操作系统:
WindowsXP
编程环境:
VC++6.0
实验步骤
1.创建单文档应用程序框架
2.编辑菜单资源
3.添加消息处理函数
4.程序结构代码,在CMyView.cpp文件中相应位置添加代码
实验内容
(1)创建应用程序框架
(2)编辑菜单资源。
在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表中的定义添加编辑菜单资源。
此时建好的菜单如图所示。
菜单资源表
菜单标题
标示符ID
多边形扫描填充
ID_WUJIAOXING
清屏
ID_CLEAR
封闭多边形
ID_CLOSE
填充
ID_Fill
(3)添加消息处理函数。
利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。
菜单项的消息处理函数
菜单项ID
消息
消息处理函数
ID_WUJIAOXING
CONMMAN
OnWujiaoxing
ID_CLOSE
CONMMAN
OnClose
ID_CLEAR
CONMMAN
OnClear
ID_Fill
CONMMAN
OnFill
(4)添加程序结构代码。
①在“Test1View.h”适当位置添加以下黑体字部分代码
typedefstructtEdge
{
intyUpper;
floatxIntersect,dxPerScan;
structtEdge*next;
}Edge;
classCTest1View:
publicCView
{
protected:
//createfromserializationonly
CTest1View();
DECLARE_DYNCREATE(CTest1View)
//Attributes
public:
CTest1Doc*GetDocument();
//Operations
②在OnDraw()函数中添加如下黑体字部分代码
voidCTest1View:
:
OnDraw(CDC*pDC)
{
CTest1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CPointpt[11];
if(iswujiao)
{
pt[0].x=181;
pt[0].y=26,
pt[1].x=143;
pt[1].y=133;
pt[2].x=19;
pt[2].y=133;
pt[3].x=119;
pt[3].y=199;
pt[4].x=82;
pt[4].y=306;
pt[5].x=181;
pt[5].y=242;
pt[6].x=279;
pt[6].y=305;
pt[7].x=242;
pt[7].y=199;
pt[8].x=342;
pt[8].y=133;
pt[9].x=218;
pt[9].y=133;
pt[10].x=181;
pt[10].y=26;
pDC->MoveTo(pt[0]);
for(inti=1;i<=10;i++)
pDC->LineTo(pt[i]);}
scanfill(11,pt);
if(isFill)
{
CPoint*pt1=newCPoint[ptnum];
for(inti=0;i<=ptnum;i++)
pt1[i]=m_pt[i];
scanfill(ptnum+1,pt1);
pDC->MoveTo(pt1[0]);
for(i=1;i<=ptnum;i++)
pDC->LineTo(pt1[i]);
pDC->LineTo(pt1[0]);
}
③在菜单项的消息处理函数实体中添加以下黑体字部分代码
实验结果
运行界面如下:
选择黑色进行填充
填充之后结果如下:
实验总结
通过此次试验,我对多边形填充算法有了更深的理解,对其算法的实现和编程有了进一步的了解。
通过对多边形填充算法的编程。
实现了对一个多边形的颜色填充,让我更加熟练了对VC++编程的能力的同时,也了解了程序设计与图形学科的紧密联系关系,对以后的图形学的学习打下了良好的基础。
指导教师意见
签名:
年月日
附:
各控件代码程序:
voidCTest1View:
:
insertEdge(Edge*list,Edge*edge)
{Edge*p,*q=list;
p=q->next;
while(p!
=NULL)
{
if(edge->xIntersect
p=NULL;
else{q=p;
p=p->next;
}
}
edge->next=q->next;
q->next=edge;
}
intCTest1View:
:
yNext(intk,intcnt,CPoint*pts)
{
intj;
if((k+1)>(cnt-1))
j=0;
else
j=k+1;
while(pts[k].y==pts[j].y)
{
if((j+1)>(cnt-1))
j=0;
else
j++;
}
return(pts[j].y);
}
voidCTest1View:
:
makeEdgeRec(CPointlower,CPointupper,intyComp,Edge*edge,Edge*edges[])
{
edge->dxPerScan=(float)(upper.x-lower.x)/(upper.y-lower.y);
edge->xIntersect=lower.x;
if(upper.y<=yComp)
edge->yUpper=upper.y-1;
else
edge->yUpper=upper.y;
insertEdge(edges[lower.y],edge);
}
voidCTest1View:
:
buildEdgeList(intcnt,CPoint*pts,Edge*edges[])
{
Edge*edge;
CPointv1,v2;
inti,yPrev=pts[cnt-2].y;
v1.x=pts[cnt-1].x;
v1.y=pts[cnt-1].y;
for(i=0;i { v2=pts[i]; if(v1.y! =v2.y) { edge=(structtEdge*)malloc(sizeof(structtEdge)); if(v1.y makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges); else makeEdgeRec(v2,v1,yPrev,edge,edges); } yPrev=v1.y; v1=v2; } } voidCTest1View: : buildActiveList(intscan,Edge*active,Edge*edges[]) { Edge*p,*q; p=edges[scan]->next; while(p) { q=p->next; insertEdge(active,p); p=q; } } voidCTest1View: : fillScan(intscan,Edge*active) {CClientDCdc(this); Edge*p1,*p2; inti; p1=active->next; while(p1) { p2=p1->next; for(i=p1->xIntersect;i //putpixel((int)i,scan,color); //putpixel((int)i,scan,color); dc.SetPixel((int)i,scan,RGB(255,255,0)); p1=p2->next; } } voidCTest1View: : deleteAfter(Edge*q) { Edge*p=q->next; q->next=p->next; free(p); } voidCTest1View: : updateActiveList(intscan,Edge*active) { Edge*q=active,*p=active->next; while(p) { if(scan>=p->yUpper) { p=p->next; deleteAfter(q); } else{ p->xIntersect=p->xIntersect+p->dxPerScan; q=p; p=p->next; } } } voidCTest1View: : resortActiveList(Edge*active) { Edge*q,*p=active->next; active->next=NULL; while(p) { q=p->next; insertEdge(active,p); p=q; } } voidCTest1View: : scanfill(intcnt,CPoint*pts) { Edge*edges[Window_Height],*active; inti,scan; for(i=0;i { edges[i]=(structtEdge*)malloc(sizeof(structtEdge)); edges[i]->next=NULL; } buildEdgeList(cnt,pts,edges); active=(structtEdge*)malloc(sizeof(structtEdge)); active->next=NULL; for(scan=0;scan { buildActiveList(scan,active,edges); if(active->next) { fillScan(scan,active); updateActiveList(scan,active); resortActiveList(active); } } } voidCTest1View: : OnLButtonDown(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault //isFill=! isFill; //Invalidate(); ptnum++; CDC*pDC=GetDC(); CPointtemp; m_pt[ptnum]=point; if(ptnum==0) { pDC->MoveTo(m_pt[0]); } else { pDC->MoveTo(m_pt[ptnum-1]); pDC->LineTo(m_pt[ptnum]); } //Invalidate(); CView: : OnLButtonDown(nFlags,point); } voidCTest1View: : OnCancelMode() { CView: : OnCancelMode(); //TODO: Addyourmessagehandlercodehere } voidCTest1View: : OnDrawpoint() { //TODO: Addyourcommandhandlercodehere isFill=false; iswujiao=false; } voidCTest1View: : OnClose() { //TODO: Addyourcommandhandlercodehere CClientDCdc(this); dc.MoveTo(m_pt[0]); dc.LineTo(m_pt[ptnum]); } voidCTest1View: : OnFill() { //TODO: Addyourcommandhandlercodehere isFill=true; iswujiao=false; Invalidate(); } voidCTest1View: : OnWujiaoxing() { //TODO: Addyourcommandhandlercodehere iswujiao=true; isFill=false; Invalidate(); } voidCTest1View: : OnClear() { //TODO: Addyourcommandhandlercodehere iswujiao=false; isFill=false; ptnum=-1; Invalidate(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告