《图形学》实验七:中点Bresenham算法画椭圆
开发环境:
VC++6.0,OpenGL
实验内容:
使用中点Bresenham算法画椭圆。
实验结果:

代码:
#include <gl/glut.h> #define WIDTH 500
#define HEIGHT 500
#define OFFSET 15 //偏移量,偏移到原点
#define A 6
#define B 5 void Init() //其它初始化
{
glClearColor(1.0f,1.0f,1.0f,1.0f); //设置背景颜色,完全不透明
glColor3f(1.0f,0.0f,0.0f); //设置画笔颜色 glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 30.0, 0.0, 30.0);
glMatrixMode(GL_MODELVIEW);
} void MidBresenhamEllipse(int a,int b) //中点Bresenham算法画椭圆
{
int x,y;
float d1,d2;
x = ;y = b;
d1=b*b+a*a*(-b+0.25);
glPointSize(); //设置画笔尺寸 glBegin(GL_POINTS);
glVertex2i(OFFSET+x,OFFSET+y);
glVertex2i(OFFSET-x,OFFSET-y);
glVertex2i(OFFSET-x,OFFSET+y);
glVertex2i(OFFSET+x,OFFSET-y);
glEnd(); while(b*b*(x+) < a*a*(y-0.5)){
if(d1<=){
d1+=b*b*(*x+);
x++;
}
else{
d1+=b*b*(*x+)+a*a*(-*y+);
x++;
y--;
}
glBegin(GL_POINTS);
glVertex2i(OFFSET+x,OFFSET+y);
glVertex2i(OFFSET-x,OFFSET-y);
glVertex2i(OFFSET-x,OFFSET+y);
glVertex2i(OFFSET+x,OFFSET-y);
glEnd();
}//while上半部分
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-)*(y-)-a*a*b*b;
while(y>){
if(d2<=){
d2+=b*b*(*x+)+a*a*(-*y+);
x++,y--;
}
else{
d2+=a*a*(-*y+);
y--;
}
glBegin(GL_POINTS);
glVertex2i(OFFSET+x,OFFSET+y);
glVertex2i(OFFSET-x,OFFSET-y);
glVertex2i(OFFSET-x,OFFSET+y);
glVertex2i(OFFSET+x,OFFSET-y);
glEnd();
}
} void Display()
{
glClear(GL_COLOR_BUFFER_BIT); //清空颜色堆栈 MidBresenhamEllipse(A,B); //画一个半径为8的椭圆 glFlush(); //清空缓冲区指令
} int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化显示模式
glutInitWindowSize(WIDTH,HEIGHT); //初始化窗口大小
glutInitWindowPosition(,); //初始化窗口出现位置
glutCreateWindow("中点Bresenham画椭圆"); //初始化窗口标题 glutDisplayFunc(Display); //注册显示函数
Init(); //其它初始化
glutMainLoop(); //进入程序循环 return ;
}
Freecode : www.cnblogs.com/yym2013
《图形学》实验七:中点Bresenham算法画椭圆的更多相关文章
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- 《图形学》实验四:中点Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...
- Python使用DDA算法和中点Bresenham算法画直线
title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...
- [DEBUG]椭圆的中点Bresenham算法边缘绘制出现错误
在使用椭圆的中点Bresenham算法绘制椭圆时, 当椭圆足够大时, 椭圆的边缘会出现下面这种情况. 出错原因: 将a, b声明为了int类型, 导致中点判别式中发生溢出 关注后面的a*b*a*b当a ...
- 《图形学》实验五:改进的Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...
- 利用canvas实现的中点Bresenham算法
Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...
- 基于Bresenham算法画圆
bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...
- 《图形学》实验三:DDA算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用DDA算法画直线. 实验结果: 代码: #include <gl/glut.h> #include <math.h> ...
- Bresenham算法画填充圆及SDL代码实现
画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯 ...
随机推荐
- session过期返回登录页面跳出frame
session 过期返回登录页面 方法1, HttpSession session = request.getSession(); String LOGIN_ID = (String) session ...
- Cocos2d-x 3.X 事件分发机制
介绍 Cocos2d-X 3.X 引入了一种新的响应用户事件的机制. 涉及三个基本的方面: Event listeners 封装你的事件处理代码 Event dispatcher 向 listener ...
- linux 下载百度盘,迅雷离线文件,解压乱码文件的方法。
首先,利用bypy的自动打包功能,将百度盘里的文件自动存放至app/bypy中,这样文件就是打包形式. 再利用 axel -n 10 "下载地址",将文件下载至本地. 下载地址获取 ...
- TypeScript Declaration Merging(声明合并)
TypeScript中有一些独特的概念,来自需要描述JavaScript对象类型发生了哪些变化.举个例子,最为独特的概念就是"声明合并".理解了这个概念将会对你在当前JavaScr ...
- 增量关联规则挖掘—FUP算法
一.背景介绍 关联规则( Association rule)概念最初由Agrawal提出,是数据挖掘的一个重要研究领域, 其目的是发现数据集中有用的频繁模式. 静态关联规则挖掘,是在固定数据集和支持度 ...
- Js对map的操作
var map = {}; // 赋值 var key = "key1"; var value = "value1"; map[key] = value; // ...
- 怎样学习Java
JAVA自学之路 一:学会选择 ,当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 我讲一个通过招聘网站的观察方法: http:// ...
- js中解决函数中使用外部函数局部变量的问题(闭包问题)
如果要取得外部for循环中i的值则必须使用闭包才能解决 如果不使用闭包,直接使用 变量 i 的值是无效的,因为 i 已经在函数调用之前被回收了,所以你是调用不到它的!
- Chrome 及其 插件“个性化设置”备份
Chrome版本发布时间表 2016.10.13 v54.0.2840.59 主题颜色由 蓝色 变为 灰色 2016.11.17 重新使用 Chrome 浏览器(v54.0.2840.99),并设置 ...
- 【重装系统】线上Linux服务器(2TB)分区参考方案
如果是线上服务器,假设它是 2TB 的 SATA 硬盘.8GB 内存,建议按如下方式进行分区: / 20480M(20G)(主分区) /boot 128M swap 10240M /data 2016 ...