Bresenham椭圆算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GIS专业实验报告(计算机图形学)
实验3 使用Bresenham画椭圆算法,绘制一个椭圆
一.实验目的及要求
根据Bresenham画椭圆算法,掌握绘制椭圆的程序设计方法。
在绘制时应利用椭圆的对称性。
注意,不能使用语言库中的画圆函数。
二.理论基础
1.Bresenham椭圆算法:
中点Bresenham椭圆绘制算法的基本原理与中点Bresenham画圆算法类似,也是尽可能的迫近椭圆(多边形迫近法),推导出圆弧的增量算法的表达式,找到最接近椭圆圆弧的像素点。
三.算法设计与分析
程序源码如下:
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
#include <stdio.h>
void drawEllipse (int a, int b, int xLoc, int yLoc)
{
glPushMatrix ();
int x, y;
float d1, d2, aa, bb;
aa = a * a;
bb = b * b;
d1 = bb + aa * (-b + 0.25);
glTranslatef ((GLfloat) xLoc, (GLfloat) yLoc, 0.0f);
x = 0;
y = b;
glBegin (GL_POINTS);
glVertex2i ( x, y);
glVertex2i (-x, y);
glVertex2i (-x, -y);
glVertex2i ( x, -y);
while (bb * (x + 1) < aa * (y - 0.5))
{
if (d1 <= -0.000001)
{
d1 += bb * ((x << 1) + 3);
}
else
{
d1 += bb * ((x << 1) + 3) + aa * (2 - (y << 1));
-- y;
}
++ x;
glVertex2i ( x, y);
glVertex2i (-x, y);
glVertex2i (-x, -y);
glVertex2i ( x, -y);
}
d2 = bb * (0.25 * x) + aa * (1 - (y << 1));
while (y > 0)
{
if (d2 <= -0.000001)
{
++ x;
d2 += bb * ((x + 1) << 1) + aa * (3 - (y << 1));
}
else
{
d2 += aa * (3 - (y << 1));
}
-- y;
glVertex2i ( x, y);
glVertex2i (-x, -y);
glVertex2i (-x, y);
glVertex2i ( x, -y);
}
glEnd ();
glPopMatrix ();
}
void display (void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear (GL_COLOR_BUFFER_BIT);
glLoadIdentity ();
glColor3f (1.0f, 0.0f, 0.0f);
drawEllipse (400, 300, 50, 50);
glutSwapBuffers ();
glFlush();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
if (w <= h)
{
gluOrtho2D (-600.0, 600.0, -600.0 * (GLfloat) h / (GLfloat) w, 600.0 * (GLfloat) h / (GLfloat) w);
}
else
{
gluOrtho2D (-600.0 * (GLfloat) w / (GLfloat) h,600.0 * (GLfloat) w / (GLfloat) h, -600.0, 600.0);
}
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}
int main (int argc, char ** argv)
{
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (450,450);
glutCreateWindow ("Bresenham 椭圆");
glClearColor(0.0,0.0,0.0,0.0);
glutReshapeFunc (reshape);
glutDisplayFunc (display);
glutMainLoop ();
}
四.试及运行结果的自我分析与自我评价
图1 椭圆运行结果五.实验心得及建议。