《计算机图形学》课内实验报告实验三.docx
- 文档编号:30498941
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:14
- 大小:77.68KB
《计算机图形学》课内实验报告实验三.docx
《《计算机图形学》课内实验报告实验三.docx》由会员分享,可在线阅读,更多相关《《计算机图形学》课内实验报告实验三.docx(14页珍藏版)》请在冰豆网上搜索。
《计算机图形学》课内实验报告实验三
《计算机图形学》
课内实验报告
学生姓名:
及学号:
学院:
理学院
班级:
课程名称:
计算机图形学
实验题目:
区域填充算法
指导教师
姓名及职称:
讲师
讲师
2014年4月4日
目录
一、实验题目1
二、实验目的1
三、实验内容1
四、实验结果2
五、实验体会或遇到问题9
一、实验题目
区域填充算法
二、实验目的
1.掌握扫描转换矩形、多边形和扇形的扫描线填充、种子填充算法。
2.要求根据给定的图形如矩形、多边形和扇形通过扫描线填充、种子填充算法对它们进行区域填充,并用颜色显示填充后的图形。
三、实验内容
已知,多边形覆盖了12条扫描线,共有7个顶点和7条边,7个顶点分别为:
,
,
,
,
,
,
。
在1024*768的显示分辨率下,将多边形顶点放大为
,
,
,
,
,
,
。
1.使用扫描线填充算法填充所给多边形
功能说明:
1)自定义屏幕二维坐标系,原点位于客户去中心,x轴水平向右为正,y轴垂直向上为正;
2)设置屏幕背景色为白色,调用Windows的颜色对话框选择填充颜色使用单一颜色填充多边形;
3)使用有效边表填充算法填充所给多边形及其边界线。
2.使用多边形种子填充算法填充所给多边形
功能说明:
1)自定义屏幕二维坐标系,原点位于客户去中心,x轴水平向右为正,y轴垂直向上为正;
2)设置屏幕背景色为白色,调用Windows的颜色对话框选择填充颜色,默认填充色为蓝色;
3)判断种子像素是否位于多边形区域之内;
4)对于位于多边形内部的种子像素,使用区域四邻接点种子填充算法填充多边形,填充完毕给出提示信息。
注:
1,2完成其一即可。
四、实验结果
1.使用扫描线填充算法填充所给多边形
源程序:
#include
#include
#include
#include
#include
#include
#defineOX270//坐标轴原点在窗口中的位置
#defineOY320//坐标轴原点在窗口中的位置
#defineNULL0//C++中没有NULL这个符号常量,这里用宏定义
#defineWINDOW_HEIGHT640//定义窗口高为600
#defineWINDOW_WIDTH540//定义窗口宽为540
#defineROUND(a)((int)(a+0.5))
#definedrawOneLine(x1,y1,x2,y2)glBegin(GL_LINES);glVertex2f((x1),(y1));glVertex2f((x2),(y2));glEnd();
structdcPt{
intx;
inty;
};
voidsetPixel(GLintx,GLinty)//用OpenGL函数改写setPixel
{
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
typedefstructtEdge{
intyUpper;
floatxIntersect,dxPerScan;
structtEdge*next;
}Edge;
voidinsertEdge(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;
}
intyNext(intk,intcnt,dcPt*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);
}
voidmakeEdgeRec(dcPtlower,dcPtupper,intyComp,Edge*edge,Edge*edges[])
{
edge->dxPerScan=
(float)(upper.x-lower.x)/(upper.y-lower.y);
edge->xIntersect=lower.x;
if(upper.y edge->yUpper=upper.y-1; else edge->yUpper=upper.y; insertEdge(edges[lower.y],edge); } voidbuildEdgeList(intcnt,dcPt*pts,Edge*edges[]) { Edge*edge; dcPtv1,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=(Edge*)malloc(sizeof(Edge)); if(v1.y makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges); else makeEdgeRec(v2,v1,yPrev,edge,edges); } yPrev=v1.y; v1=v2; } } voidbuildActiveList(intscan,Edge*active,Edge*edges[]) { Edge*p,*q; p=edges[scan]->next; while(p){ q=p->next; insertEdge(active,p); p=q; } } voidfillScan(intscan,Edge*active) { Edge*p1,*p2; inti; p1=active->next; while(p1){ p2=p1->next; for(i=p1->xIntersect;i setPixel((int)i,scan); p1=p2->next; } } voiddeleteAfter(Edge*q) { Edge*p=q->next; q->next=p->next; free(p); } voidupdateActiveList(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; } } voidresortActiveList(Edge*active) { Edge*q,*p=active->next; active->next=NULL; while(p){ q=p->next; insertEdge(active,p); p=q; } } voidscanFill(intcnt,dcPt*pts) { Edge*edges[WINDOW_HEIGHT],*active; inti,scan; for(i=0;i edges[i]=(Edge*)malloc(sizeof(Edge)); edges[i]->next=NULL; } buildEdgeList(cnt,pts,edges); active=(Edge*)malloc(sizeof(Edge)); active->next=NULL; for(scan=0;scan buildActiveList(scan,active,edges); if(active->next){ fillScan(scan,active); updateActiveList(scan,active); resortActiveList(active); glFlush(); Sleep(3); } } } voidinit(void) { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,WINDOW_WIDTH,0.0,WINDOW_HEIGHT); } voiddrawString(constchar*str){ staticintisFirstCall=1; staticGLuintlists; if(isFirstCall){ isFirstCall=0; lists=glGenLists(128); wglUseFontBitmaps(wglGetCurrentDC(),0,128,lists); } for(;*str! ='\0';++str) glCallList(lists+*str); } voiddisplay(intnum,dcPt*pts){ charpoinx[20],poiny[5],a[3]; a[0]=(char)44; glColor3f(0.0,0.0,0.0); for(inti=0;i { glRasterPos2f(pts[i].x,pts[i].y); itoa(pts[i].x-OX,poinx,10); itoa(pts[i].y-OY,poiny,10); strcat(poinx,a); drawString(poinx); } glRasterPos2f(OX,OY); itoa(0,poinx,10); itoa(0,poiny,10); strcat(poinx,a); drawString(poinx); glutSwapBuffers(); } intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd) { staticCHOOSECOLORcc; staticCOLORREFcrCustCoLors[16]; cc.lStructSize=sizeof(CHOOSECOLOR); cc.hwndOwner=NULL; cc.hInstance=NULL; cc.rgbResult=RGB(0x80,0x80,0x80); cc.lpCustColors=crCustCoLors; cc.Flags=CC_RGBINIT|CC_FULLOPEN; cc.lCustData=0; cc.lpfnHook=NULL; cc.lpTemplateName=NULL; ChooseColor(&cc); returncc.rgbResult; } voidmyDraw(void) { dcPtpts[]={ 50+OX,100+OY, -150+OX,300+OY, -250+OX,50+OY, -150+OX,-250+OY, 0+OX,-50+OY, 100+OX,-250+OY, 300+OX,150+OY }; glClear(GL_COLOR_BUFFER_BIT); intrgb=WinMain(GetModuleHandle(NULL),NULL,NULL,2); BYTEr=GetRValue(rgb); BYTEg=GetGValue(rgb); BYTEb=GetBValue(rgb); glColor3f((float)r/255,(float)g/255,(float)b/255); scanFill(6,pts); glColor3f(0.0,0.0,0.0); drawOneLine(0,320,540,320); drawOneLine(270,0,270,640); glFlush(); display(6,pts); glFlush(); } voidmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(400,50); glutInitWindowSize(WINDOW_WIDTH,WINDOW_HEIGHT); glutCreateWindow("通用扫描线填充"); init(); glutDisplayFunc(myDraw); glutMainLoop(); } 图1颜色选择窗口 图2使用有效边表填充算法填充所给多边形及其边界线 五、实验体会或遇到问题 OPENGL是比较常用的图形处理工具,本次课内实验中我对OPENGL的使用有所了解,同时对扫描线填充算法有了更深的理解,巩固了课堂知识,复习了学过的C++课程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机图形学 计算机 图形学 实验 报告