美文网首页
Bresenham算法画椭圆及Open Gl实现

Bresenham算法画椭圆及Open Gl实现

作者: jocelynzhang97 | 来源:发表于2018-05-21 11:30 被阅读0次

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)<a2(y-0.5)时,重复步骤(3)和(4),否则转(6)
  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 <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;
}

输入示例

输入示例

运行结果

运行结果

相关文章

网友评论

      本文标题:Bresenham算法画椭圆及Open Gl实现

      本文链接:https://www.haomeiwen.com/subject/sprfjftx.html