Bresenham算法画椭圆及Open Gl实现

Bresenham算法画椭圆

Bresenham算法画直线
Bresenham算法画圆

  1. 输入椭圆的长半轴a和短半轴b。
  2. 计算初始值:d=b2+a2(-b+0.25),x=0,y=b.
  3. 绘制点(x,y)及其在四分象限上的另外3个对称点.
  4. 判断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)
  5. 当b2(x+1)
  6. 用上半部分计算的最后点(x,y)来计算下半部分中d的初值:
    d=b2(x+0.5)2+a2(y-1)2-a2b2
  7. 绘制点(x,y)及其在四分象限的另外3个对称点b
  8. 判断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).
  9. 当y>=0时,重复步骤(7)和(8),否则结束。

Open Gl实现

首先要在项目中配置Open Gl的环境


头文件
  #include 
  #include 
  #include 
  #include 
  #include
画椭圆
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;
}

输入示例

输入示例

运行结果

Bresenham算法画椭圆及Open Gl实现_第1张图片
运行结果

你可能感兴趣的:(Bresenham算法画椭圆及Open Gl实现)