Bresenham算法画圆
- 输入圆的半径R。
- 计算初始值d=1-R、x=0、y=R。
- 绘制点(x,y)及其在八分圆中的另外七个对称点。
- 判断d的符号。若d≤0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。
- 当x ≤y时,重复步骤3和4。否则结束。
Open Gl实现
首先要在项目中配置Open Gl的环境
头文件
#include <cmath>
#include <GL/glew.h>
#include <GL/glut.h>
#include <GL\freeglut.h>
#include<Windows.h>
画圆
void DrawCircle() {
int r;
cin >> r;
int d = 1 - r;
int x = 0, y = r;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
while (x <= y) {
glVertex2i(x, y);
glVertex2i(y, x);
glVertex2i(-y, x);
glVertex2i(-x, y);
glVertex2i(-x, -y);
glVertex2i(-y, -x);
glVertex2i(y, -x);
glVertex2i(x, -y);
if (d <= 0)
d += 2 * x + 3;
else {
d += 2 * (x - y) + 5;
y--;
}
x++;
}
glEnd();glFlush();
}
主函数
int main(int argc, char** argv) {
glutInit(&argc, argv);//glut初始化
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);// 显示模式:双缓冲、RGBA
glutInitWindowPosition(50, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("Draw");
glClearColor(1.0, 1.0, 1.0, 1.0);// 缓存清空后的颜色值
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//恢复初始坐标系
gluOrtho2D(-200, 200.0, -200, 200.0);
int choice = 0;
cin >> choice;
if(choice==1)
glutDisplayFunc(DrawLine);
if(choice==2)
glutDisplayFunc(DrawCircle);
if(choice==3)
glutDisplayFunc(DrawEllipse);
// 通知开始GLUT的内部循环
glutMainLoop();
return 0;
}
输入示例输入示例
运行结果运行结果
网友评论