//Bresenham算法画圆 // //参数说明:x,y 圆心坐标 // // R 圆半径 // // num 扫描转换时从起点开始输出的点的数目,用于动画 // ///////////////////////////////////////////////////////////////////
void BresenhamCircle(GLsizei x, GLsizei y, GLsizei R, GLsizei num) { }
//初始化窗口 void Initial(void) {
// 设置窗口颜色为蓝色 glClearColor(1.0f, 1.0f, 1.0f, 1.0f); }
// 窗口大小改变时调用的登记函数 void ChangeSize(GLsizei w, GLsizei h)
if(num == 1)
printf(\算法画圆:各点坐标及判别式的值\\n\); int d,k=0,xa,ya; xa=0;ya=R;d=1-R; while(xa<=ya){ }
putpixel(xa+x,ya+y); putpixel(ya+x,xa+y); putpixel(-ya+x,xa+y); putpixel(-xa+x,ya+y); putpixel(-xa+x,-ya+y); putpixel(-ya+x,-xa+y); putpixel(ya+x,-xa+y); putpixel(xa+x,-ya+y); if (k>=num-1) { } k++;
if(d<0) d+=2*xa+3; else{ } xa++;
d+=2*(xa-ya)+5; ya--;
printf(\ , xa+x,ya+y); break;
glColor3f(1.0f,0.0f,0.0f);
{ }
// 在窗口中绘制图形 void ReDraw(void) {
glFlush(); }
//画出坐标线 DrawCordinateLine(); switch(m_DrawMode) { case 1: }
DDACreateLine(0,0,20,15,m_PointNumber); break;
BresenhamLine(0,0,20,15,m_PointNumber); break;
Bresenham2Line(1,1,8,6,m_PointNumber); break;
BresenhamCircle(12,12,10,m_PointNumber); break; break;
//用当前背景色填充窗口
glClear(GL_COLOR_BUFFER_BIT); if(h == 0)
h = 1;
// 设置视区尺寸 // 重置坐标系统
glMatrixMode(GL_PROJECTION); glLoadIdentity();
// 建立修剪空间的范围
glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);
glViewport(0, 0, w, h);
if (w <= h) else
case 2:
case 3:
case 4:
default:
//设置时间回调函数 void TimerFunc(int value) { }
//设置键盘回调函数
void Keyboard(unsigned char key, int x, int y) {
if (key == '1') m_DrawMode = 1; }
int main(int argc, char* argv[]) { }
glutCreateWindow(\基本图元绘制程序\); glutDisplayFunc(ReDraw);
glutKeyboardFunc(Keyboard);//键盘响应回调函数 glutTimerFunc(500, TimerFunc, 1); // 窗口初始化
glutMainLoop(); //启动主GLUT事件处理循环 return 0;
glutInit(&argc, argv);
//初始化GLUT库OpenGL窗口的显示模式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(600,600); glutInitWindowPosition(100,100); m_PointNumber = 0; glutPostRedisplay();
if (key == '2') m_DrawMode = 2; if (key == '3') m_DrawMode = 3; if (key == '4') m_DrawMode = 4; glutPostRedisplay();
glutTimerFunc(500, TimerFunc, value+1); m_PointNumber = value; if(m_PointNumber == 0)
value = 1;
glutReshapeFunc(ChangeSize);
Initial();