1、1.DDA算法画直线2. 中点Bresenham算法画直线3. 改进Bresenham算法画直线4. Bresenham算法画圆四. 源程序#include gl/glut.h#include stdio.hint m_PointNumber = 0; /动画时绘制点的数目int m_DrawMode = 4; /绘制模式 1 DDA算法画直线 / 2 中点Bresenham算法画直线 / 3 改进Bresenham算法画直线 / 4 八分法绘制圆 / 5 四分法绘制椭圆/绘制坐标线void DrawCordinateLine(void) int i = 0 ; /坐标线为黑色 glColor
2、3f(0.0f, 0.0f ,0.0f); glBegin(GL_LINES); for (i=10;i abs(dy) epsl = abs(dx); 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;
3、void BresenhamLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)中点Bresenham算法画直线:各点坐标及判别式的值n GLsizei dx,dy,d,UpIncre,DownIncre,x,y,xend=0; if(x0x1) x=x1;x1=x0;x0=x; y=y1;y1=y0;y0=y; x=x0;y=y0; dx=x1-x0;dy=y1-y0; d=dx-2*dy; UpIncre=2*dx-2*dy;DownIncre=-2*dy; while (x x+; if(d= 50) brea
4、k;void Bresenham2Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)改进的Bresenham算法画直线: GLsizei x,y,dx,dy,e; dy=y1-y0; e=-dx;x=x0; e=e+2*dy; if(e e=e-2*dx;void BresenhamCircle(GLsizei x, GLsizei y, GLsizei r, GLsizei num)Bresenham算法画圆: x=0,y=r; GLsizei d=1-r;y)=num) putpixel(y,x); putpi
5、xel(-y,x); putpixel(-x,y); putpixel(-x,-y); putpixel(-y,-x); putpixel(y,-x); putpixel(x,-y);0)d+=2*x+3; else d+=2*(x-y)+5; y-;/初始化窗口void Initial(void) / 设置窗口颜色为蓝色 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);/ 窗口大小改变时调用的登记函数void ChangeSize(GLsizei w, GLsizei h) if(h = 0) h = 1; / 设置视区尺寸 glViewport(0, 0, w,
6、h); / 重置坐标系统 glMatrixMode(GL_PROJECTION); glLoadIdentity(); / 建立修剪空间的范围 if (w = h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);/ 在窗口中绘制图形void ReDraw(void) /用当前背景色填充窗口 glClear(GL_COLOR_BUFFER_BIT); /画出坐标线 DrawCordinateLine(); switch(m_
7、DrawMode) case 1: DDACreateLine(0,0,20,15,m_PointNumber); break; case 2: BresenhamLine(0,0,20,15,m_PointNumber); case 3: Bresenham2Line(1,1,8,6,m_PointNumber); case 4: BresenhamCircle(5,5,18,m_PointNumber); default: glFlush();/设置时间回调函数void TimerFunc(int value) if(m_PointNumber = 0) value = 1; m_Poin
8、tNumber = value; glutPostRedisplay(); glutTimerFunc(500, TimerFunc, value+1);/设置键盘回调函数void Keyboard(unsigned char key, int x, int y) if (key = 1) m_DrawMode = 1;2) m_DrawMode = 2;3) m_DrawMode = 3;4) m_DrawMode = 4; m_PointNumber = 0;/void main(void)int main(int argc, char* argv) glutInit(&argc, argv); /初始化GLUT库OpenGL窗口的显示模式 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); glutCreateWindow(基本图元绘制程序 glutDisplayFunc(ReDraw); glutReshapeFunc(ChangeSize); glutKeyboardFunc(Ke
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1