《计算机图形学 Bresenham完整算法 画直线、椭圆和圆》由会员分享,可在线阅读,更多相关《计算机图形学 Bresenham完整算法 画直线、椭圆和圆(10页珍藏版)》请在人人文库网上搜索。
1、include #include #include stdio.hint m_PointNumber = 0; /动画时绘制点的数目int m_DrawMode = 1; /绘制模式 1 DDA算法画直线/ 2 中点Bresenham算法画直线/ 3 改进Bresenham算法画直线/ 4 八分法绘制圆/ 5 四分法绘制椭圆/绘制坐标线void DrawCordinateLine(void)int i = -250 ;/坐标线为黑色glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES);for (i=-250;i abs(dy) epsl = abs(dx)。
2、;else epsl = abs(dy);xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k=num-1) printf(x=%f , y=%f,取整后 x=%d,y=%dn, x, y, (int)(x+0.5),(int)(y+0.5);break;x += xIncre;y += yIncre;if(x = 25 | y = 25) break;/中点Bresenham算法画直线(0x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-y0;。
3、k=dy/dx;if(k=0&k=num-1) printf(x=%d,y=%dn, x, y);break;p+;x+;if(d1) d=dy-2*dx; UpIncre=2*dy-2*dx; DownIncre=-2*dx; while(y=num-1) printf(x=%d,y=%dn, x, y);break;p+;y+;if(d=-1)d=dx-2*dy;UpIncre=-2*dy;DownIncre=-2*dx-2*dy;while(x=num-1) printf(x=%d,y=%dn, x, y);break;p+;x+;if(d0)y-;d+=DownIncre;else d。
4、+=UpIncre;if(k=y1)putpixel(x,y);if (p=num-1) printf(x=%d,y=%dn, x, y);break;p+;y-;if(dx1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;dx=x1-x0;dy=y1-y0;k=dy/dx;if(k=0&k=num-1) printf(x=%d,y=%dn, x, y);break;p+;x+; e=e+2*dy; if(e0)y+;e=e-2*dx; if(k1)e=-dy;x=x0;y=y0; while(y=num-1) printf(x=%d,y=%dn, x, y);break;p。
5、+;y+; e=e+2*dx; if(e0) x+; e=e-2*dy; if(k=-1)e=-dx;x=x0;y=y0;while(x=num-1) printf(x=%d,y=%dn, x, y);break;p+;x+;e=e+2*dy;if(e=y1)putpixel(x,y);if (p=num-1) printf(x=%d,y=%dn, x, y);break;p+;y-;e=e-2*dx;if(e=num-1) printf(x=%d,y=%d,d=%dn, x, y,d);break;if(d=num-1) printf(x=%d,y=%d,d1=%dn, x, y,d1);b。
6、reak;if(d10)if (x=num-1) printf(x=%d,y=%d,d2=%dn, x, y,d2);break;if(d2=0)d2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;elsed2+=a*a*(-2*y+3);y-;putpixel(x,y); putpixel(-x,-y);putpixel(-x,y);putpixel(x,-y);/初始化窗口void Initial(void)/ 设置窗口颜色为蓝色glClearColor(0.0f, 0.0f, 1.0f, 1.0f);/ 窗口大小改变时调用的登记函数void ChangeSize(GLs。
7、izei w, GLsizei h)if(h = 0)h = 1;/ 设置视区尺寸glViewport(0,0, w, h);/ 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围if (w = h) glOrtho (-250.0f, 250.0f, -250.0f, 250.0f*h/w, 1.0, -1.0);else glOrtho (-250.0f, 250.0f*w/h, -250.0f, 250.0f, 1.0, -1.0);/ 在窗口中绘制图形void ReDraw(void)/用当前背景色填充窗口glC。
8、lear(GL_COLOR_BUFFER_BIT);/画出坐标线DrawCordinateLine();switch(m_DrawMode)case 1:DDACreateLine(0,0,20,15,m_PointNumber);break;case 2:BresenhamLine(0,0,-20,15,m_PointNumber);break;case 3:Bresenham2Line(1,1,8,6,m_PointNumber);break;case 4:BresenhamCircle(0,0,20,m_PointNumber);break;case 5:Bresenham2Circle。
9、(10,8,m_PointNumber);default:break;glFlush();/设置时间回调函数void TimerFunc(int value)if(m_PointNumber = 0)value = 1;m_PointNumber = value;glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1);/设置键盘回调函数void Keyboard(unsigned char key, int x, int y) if (key = 1) m_DrawMode = 1;if (key = 2) m_DrawMode =。
10、 2;if (key = 3) m_DrawMode = 3;if (key = 4) m_DrawMode = 4;if (key = 5) m_DrawMode = 5;m_PointNumber = 0;glutPostRedisplay();/void main(void)int main(int argc, char* argv)glutInit(&argc, argv);/初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(600,600);glutInitWindowPosition(100,100);glutCreateWindow(基本图元绘制程序); glutDisplayFunc(ReDraw); glutReshapeFunc(ChangeSize); glutKeyboardFunc(Keyboard);/键盘响应回调函数glutTimerFunc(500, TimerFunc, 1);/ 窗口初始化Initial();glutMainLoop(); /启动事件处理循环return 0。
本文深入探讨了Bresenham算法在计算机图形学中的应用,包括使用DDA算法、中点Bresenham算法和改进Bresenham算法来绘制直线。同时,介绍了如何利用Bresenham算法实现八分法绘制圆以及四分法绘制椭圆。通过实例代码展示了算法的实现过程,并提供了交互式的图形绘制功能。
1325

被折叠的 条评论
为什么被折叠?



