实验三画圆与凸多边形填充算法.doc
《实验三画圆与凸多边形填充算法.doc》由会员分享,可在线阅读,更多相关《实验三画圆与凸多边形填充算法.doc(19页珍藏版)》请在三一办公上搜索。
1、word华北水利水电大学 计算机图形学 实验报告计算机科学与技术 专业实验三、画圆与凸多边形填充算法1. 实验目的练习直线和圆的光栅扫描线算法,多边形的扫描转换算法。2. 实验内容和要求按要求完成以下三个作业。提交纸质实验报告,同时提交实验报告和源代码的电子版。(I). 利用Bresenham直线扫描算法绘制任意直线段。输入为起点坐标(x0,y0)和终点坐标(x1,y1)以与线宽w,利用Bresenham算法计算离散的近似像素点,并在OpenGL窗口中绘制该线段。要求绘制至少五条线段,具有不同的斜率,不同的起点和终点,不同的线宽。不允许直接调用GL_LINES来实现。(II). 利用中点画圆算
2、法绘制圆。输入为圆心(xc,yc)和圆的的半径r,利用中点画圆算法计算离散的近似像素点,并在OpenGL窗口中绘制。要求绘制至少四个圆,构成一个图案,比如奥迪车标或五环。(III). 实现多边形的扫描转换算法。输入一个凸多边形的顶点序列,利用活性边表计算每条扫描线上位于多边形内部的像素,并填充上一个新颜色,最终达到填充多边形内部的目的。建议:为了实现坐标点和像素的一一对应,建议坐标轴的X围和窗口像素宽高一致,比如:glutInitWindowSize(800, 600);/像素宽800,高600坐标系设定为:gluOrtho2D(-400, 400, -300, 300);/坐标轴x方向宽为8
3、00,y方向高为6003. 算法描述使用OpenGL进展画图,采用VS编程环境。4. 源程序代码1/ bresenham直线.cpp : 定义控制台应用程序的入口点。/#includestdio.h#includestdafx.h#includeglut.h#includestdlib.h#includemath.h#includeiostreamusingnamespace std;GLsizei winWidth = 400, winHeight = 300; / 屏幕显示宽高.int a100,b100,c100,d100,n=-1;void init( )glClearColor(1.
4、0, 1.0, 1.0, 1.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 200.0, 0.0, 150.0);void lineBres(intx0,inty0,intxEnd,intyEnd)int dx = abs(xEnd - x0),dy = abs(yEnd - y0);int p = 2*dy - dx;int twoDy = 2*dy, twoDyMinusDx = 2*(dy - dx);int x,y;if(x0 xEnd) x = xEnd; y = yEnd;xEnd = x0;else x = x0; y = y0;
5、glBegin(GL_POINTS); glVertex2i(x,y); glEnd();while(xxEnd) x+;if(p 0)p += twoDy;elsey+;p += twoDyMinusDx;glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); void displayF()glColor3f(1.0, 0.0, 0.0); for(int i=0;i=n;i+) lineBres(ai,bi,ci,di);glFlush();void winReshpeF(GLintnewWidth, GLintnewHeight)glMatrixMod
6、e(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight);glClear(GL_COLOR_BUFFER_BIT);winWidth = newWidth;winHeight = newHeight;int_tmain(intargc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutI
7、nitWindowSize(winWidth, winHeight);glutCreateWindow(bresenham直线);init();int h=1;while(h=1)printf(输入起点和终点的坐标);n+;scanf_s(%d %d %d %d,&an,&bn,&cn,&dn);glutDisplayFunc(displayF);printf(继续输入请按1,退出请按0);scanf_s(%d,&h);glutReshapeFunc(winReshpeF);glutMainLoop();return 0;2/ 中点画圆法.cpp : 定义控制台应用程序的入口点。/#inclu
8、destdafx.h#includeglut.h#includestdlib.h#includemath.h#includeiostreamusingnamespace std;constGLdouble twoPi = 6.283185;GLsizei winWidth = 400, winHeight = 300; / 屏幕显示宽高.classscreenPt public:screenPt()x = y = 0;GLint x, y;void setCoords(GLintxCoordValue, GLintyCorrdValue)x = xCoordValue;y = yCorrdVa
9、lue;GLint getx() constreturn x;GLint gety() constreturn y;void incrementx()x+;void incrementy()y-;void init( )glClearColor(1.0, 1.0, 1.0, 1.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 200.0, 0.0, 150.0);void setPixel(GLintxCoord, GLintyCoord)glBegin(GL_POINTS);glVertex2i(xCoord, yCoord);glEnd();v
10、oid circleMidpoint(GLintxc, GLintyc, GLintradius)screenPt circPt;GLint p = 1 - radius;/中点参数初值circPt.setCoords(0, radius);void circlePlotPoints(GLint, GLint, screenPt);circlePlotPoints(xc, yc, circPt);while (circPt.getx() circPt.gety()circPt.incrementx();if (p 0)p += 2 * circPt.getx() + 1;elsecircPt.
11、incrementy();p += 2 * (circPt.getx() - circPt.gety() + 1;circlePlotPoints(xc, yc, circPt);void circlePlotPoints(GLintxc, GLintyc, screenPtcircPt)setPixel(xc + circPt.getx(), yc + circPt.gety();setPixel(xc - circPt.getx(), yc + circPt.gety();setPixel(xc + circPt.getx(), yc - circPt.gety();setPixel(xc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 三画圆 凸多边形 填充 算法
链接地址:https://www.31ppt.com/p-1091304.html