1.Bresenham画圆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include<gl/glut.h> #include<math.h> void SetPixel(int x, int y)//画点 { glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); } //8路对称 void Cirpot(int x0, int y0, int x, int y) { SetPixel((x0 + x), (y0 + y));//第1象限,90度至45度 SetPixel((x0 + y), (y0 + x));//第1象限,45度至0度 SetPixel((x0 + y), (y0 - x));//第4象限,0度至-45度 SetPixel((x0 + x), (y0 - y));//第4象限,-45度至-90度 SetPixel((x0 - x), (y0 - y));//第3象限 SetPixel((x0 - y), (y0 - x)); SetPixel((x0 - y), (y0 + x));//第2象限 SetPixel((x0 - x), (y0 + y)); } void Bres_Circle(int x0, int y0, double r)//x0,y0为圆心,r为半径 { int x, y, d; //考虑圆心在原点处,第一个点(x,y)位于90度的y轴上 x = 0; y = (int)r; d = int(3 - 2 * r); //递推初值 for (; x <= y; x++) //从90度到45度 { Cirpot(x0, y0, x, y); //画点,同时画8个对称的点,若圆心不在原点处,平移还原 if (d < 0)//递推公式 d += 4 * x + 6; else { d += 4 * (x - y) + 10; y--; } } } void myDisplay() { glClearColor(1.0, 1.0, 1.0, 1.0);//清除颜色,白色 glClear(GL_COLOR_BUFFER_BIT);//消除缓冲区,使用上述清除颜色消除 Bres_Circle(200, 200, 100.0); glFlush();//强制刷新 } void Reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); //定义视口大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);//使左下角坐标为(0,0),右上角坐标为(w,h) } void main(int argc, char* argv[]) { glutInit(&argc, argv);//初始化GLUT glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//显示模式 glutInitWindowPosition(100, 100);//窗口位置,窗口左上角在屏幕的坐标 glutInitWindowSize(400, 400);//窗口大小 glutCreateWindow("Bresenham画圆");//创建窗口,参数是窗口的标题 glutDisplayFunc(myDisplay);//告诉GLUT哪个函数负责绘图,即注册一个绘图函数myDisplay glutReshapeFunc(Reshape); //窗口发生改变时,使用什么函数进行重绘 glutMainLoop();//处理永不结束的循环监听 } |
2.角度离散法绘制圆弧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include<gl/glut.h> #include<math.h> const double pi = 3.1415926; void Arc(int xc, int yc, double r, double ts, double te) { int x, y; if (te < ts) //当终止角比起始角还小时,则将终止角加上2π te += 2 * pi; double dt = 1 / r; //弧度=弧长/半径,用dt作弧度的改变量 glBegin(GL_LINE_STRIP); //如果绘制整圆,选GL_LINE_LOOP更好 double t = ts; //ts为初始弧度,te为终止弧度 while (t <= te) { glColor3f(1.0f, 0.0f, 0.0f); x = int(xc + r * cos(t));//按参数方程求出坐标 y = int(yc + r * sin(t)); glVertex2i(x, y); t += dt; } glEnd(); } void myDisplay() { glClearColor(1.0, 1.0, 1.0, 1.0);//清除颜色,白色 glClear(GL_COLOR_BUFFER_BIT);//消除缓冲区,使用上述清除颜色消除 Arc(200, 200, 100.0, 0, 2 * pi); glFlush();//强制刷新 } void Reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); //定义视口大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);//使左下角坐标为(0,0),右上角坐标为(w,h) } void main(int argc, char* argv[]) { glutInit(&argc, argv);//初始化GLUT glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//显示模式 glutInitWindowPosition(100, 100);//窗口位置,窗口左上角在屏幕的坐标 glutInitWindowSize(400, 400);//窗口大小 glutCreateWindow("角度离散法绘制圆弧");//创建窗口,参数是窗口的标题 glutDisplayFunc(myDisplay);//告诉GLUT哪个函数负责绘图,即注册一个绘图函数myDisplay glutReshapeFunc(Reshape); //窗口发生改变时,使用什么函数进行重绘 glutMainLoop();//处理永不结束的循环监听 } |
3.中点画圆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include<gl/glut.h> #include<math.h> void SetPixel(int x, int y)//画点 { glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); } //8路对称 void Cirpot(int x0, int y0, int x, int y) { SetPixel((x0 + x), (y0 + y));//第1象限,90度至45度 SetPixel((x0 + y), (y0 + x));//第1象限,45度至0度 SetPixel((x0 + y), (y0 - x));//第4象限,0度至-45度 SetPixel((x0 + x), (y0 - y));//第4象限,-45度至-90度 SetPixel((x0 - x), (y0 - y));//第3象限 SetPixel((x0 - y), (y0 - x)); SetPixel((x0 - y), (y0 + x));//第2象限 SetPixel((x0 - x), (y0 + y)); } void MidPoint_Circle(int x0, int y0, int r)//x0,y0为圆心,r为半径 { //考虑圆心在原点处,第一个点(x,y)位于90度的y轴上 int x = 0; int y = r; int d = 1 - r; //是d=1.25 – r取整后的结果 Cirpot(x0, y0, x, y); for (; x <= y; x++) { Cirpot(x0, y0, x, y); //画点,同时画8个对称的点,若圆心不在原点处,平移还原 if (d < 0) d += 2 * x + 3; else { d += 2 * (x - y) + 5; y--; } } } void myDisplay() { glClearColor(1.0, 1.0, 1.0, 1.0);//清除颜色,白色 glClear(GL_COLOR_BUFFER_BIT);//消除缓冲区,使用上述清除颜色消除 MidPoint_Circle(200, 200, 100.0); glFlush();//强制刷新 } void Reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); //定义视口大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);//使左下角坐标为(0,0),右上角坐标为(w,h) } void main(int argc, char* argv[]) { glutInit(&argc, argv);//初始化GLUT glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//显示模式 glutInitWindowPosition(100, 100);//窗口位置,窗口左上角在屏幕的坐标 glutInitWindowSize(400, 400);//窗口大小 glutCreateWindow("中点画圆算法");//创建窗口,参数是窗口的标题 glutDisplayFunc(myDisplay);//告诉GLUT哪个函数负责绘图,即注册一个绘图函数myDisplay glutReshapeFunc(Reshape); //窗口发生改变时,使用什么函数进行重绘 glutMainLoop();//处理永不结束的循环监听 } |
以上是Opengl的学习笔记,仅供参考呀