博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bresenham画椭圆算法
阅读量:5126 次
发布时间:2019-06-13

本文共 2749 字,大约阅读时间需要 9 分钟。

这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步。

算法步骤:

(1) 输入椭圆的长半轴a和短半轴b。

(2) 计算初始值d = b*b + a * a * (-b + 0.25),  x = 0, y = b。

(3) 绘制点 (x, y)及其在四分象限上的另外3个对称点。

(4) 判断d的符号。若d <= 0,则先将d更新为d + b * b * (2 * x + 3),再将 (x, y)更新为(x+1, y);否则先将d更新为d + b * b * (2 * x + 3) + a * a (-2 * y + 2),再将(x, y)更新为(x+1, y-1)。

(5) 当b*b * (x+1) < a * a * (y - 0.5)时,重复步骤(3)和(4),否则转到步骤(6)。

(6) 用上半部分计算的最后点(x, y)来计算下半部分中d的初值: d = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b。

(7) 绘制点(x, y)及其在四分象限上的另外3个对称点。

(8) 判断d的符号。若d <= 0,则先将d更新为d + b * b * (2 * xi + 2) + a * a * (-2 * yi + 3), 再将(x, y)更新为(x+1, y-1);否则先将d更新为d + a * a * (-2 * yi + 3),再将(x, y)更新为(x, y-1)。

(9) 当y >= 0, 重复步骤(7)和(8),否则结束。

下面是算法:

 

#include 
void init (void){ glClearColor (0.0f, 0.0f, 0.0f, 1.0f);}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){ glClear (GL_COLOR_BUFFER_BIT); glLoadIdentity (); glColor3f (1.0f, 0.0f, 0.0f); // draw a ellipse drawEllipse (200, 300, 50, 50); glutSwapBuffers ();}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 ();}void keyboard (unsigned char key, int x, int y){ switch (key) { case 27: // 'VK_ESCAPE' exit (0); break; default: break; }}int main (int argc, char ** argv){ glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (600, 600); glutCreateWindow ("Bresenham ellipse"); init (); glutReshapeFunc (reshape); glutDisplayFunc (display); glutKeyboardFunc (keyboard); glutMainLoop (); return 0;}

 

转载于:https://www.cnblogs.com/tangshiguang/p/6748361.html

你可能感兴趣的文章
django迁移数据库错误
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
距离公式汇总以及Python实现
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
php match_model的简单使用
查看>>