Bresenham算法画椭圆
- 输入椭圆的长半轴a和短半轴b。
- 计算初始值:d=b2+a2(-b+0.25),x=0,y=b.
- 绘制点(x,y)及其在四分象限上的另外3个对称点.
- 判断d的符号。若d<=0,则先将d更新为d+b2(2xi+3),再将(xi,yi)更新为(xi+1,yi);否则先将d更新为d+b2(2xi+3)+a2(-2yi+2),再将(xi,yi)更新为(xi+1,yi-1)
- 当b2(x+1)<a2(y-0.5)时,重复步骤(3)和(4),否则转(6)
- 用上半部分计算的最后点(x,y)来计算下半部分中d的初值:
d=b2(x+0.5)2+a2(y-1)2-a2b2 - 绘制点(x,y)及其在四分象限的另外3个对称点b
- 判断d的符号.若d<=0,则先将d更新为d+b2(2xi+2)+a2(-2yi+3),再将(x,y))更新为(x+1,y-1);
否则先将d更新为d+a2(-2yi+3),再将(x,y)更新为(x,y-1). - 当y>=0时,重复步骤(7)和(8),否则结束。
Open Gl实现
首先要在项目中配置Open Gl的环境
头文件
#include <cmath>
#include <GL/glew.h>
#include <GL/glut.h>
#include <GL\freeglut.h>
#include<Windows.h>
画椭圆
void DrawEllipse() {
int a, b;
cin >> a >> b;
double d = pow(b, 2) + pow(a, 2)*(-1 * b + 0.25);
int x = 0, y = b;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
while (pow(b, 2)*(x + 1) < pow(a, 2)*(y - 0.5)) {
glVertex2i(x, y);
glVertex2i(x, -y);
glVertex2i(-x, y);
glVertex2i(-x, -y);
if (d <= 0) {
d += pow(b, 2)*(2 * x + 3);
}
else {
d += pow(b, 2)*(2 * x + 3) + pow(a, 2)*(-2 * y + 20);
y--;
}
x++;
}
d = pow(b, 2)*(x + 0.5)*(x + 0.5) + pow(a, 2)*(y - 1)*(y - 1) - a*a*b*b;
while (y >= 0) {
glVertex2i(x, y);
glVertex2i(x, -y);
glVertex2i(-x, y);
glVertex2i(-x, -y);
if (d <= 0) {
d += pow(b, 2)*(2 * x + 2) + pow(a, 2)*(-2 * y + 3);
x++;
}
else {
d += pow(a, 2)*(-2 * y + 3);
}
y--;
}
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;
}
输入示例
运行结果