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

代码:
//中点Bresenham算法生成直线
#include <gl/glut.h>
#include <math.h> #define WIDTH 500 //窗口宽度
#define HEIGHT 500 //窗口高度
#define DRAWLINE1 MidpointBresenham(100,200,200,100); //画直线
#define DRAWLINE2 MidpointBresenham(200,100,450,400); //画直线 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") //取消控制台 void Init() //初始化
{
glClearColor(1.0f,1.0f,1.0f,1.0f); //设置背景颜色,完全不透明
glColor3f(1.0f,0.0f,0.0f); //设置画笔颜色 glMatrixMode(GL_PROJECTION); //设置投影
gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT); //设置投影区域
} void MidpointBresenham(int x0,int y0,int x1,int y1) //中点Bresenham算法画线
{
int dx,dy,d,UpIncre,DownIncre,x,y;
if(x0>x1){
x=x1;x1=x0;x0=x;
y=y1;y1=y0;y0=y;
}
x = x0,y = y0;
dx = x1-x0;
dy = y1-y0;
if(dy>&&dy<=dx){ //0<k<=1
d = dx-*dy;
UpIncre = *dx-*dy;
DownIncre = -*dy;
while(x<=x1){
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
x++;
if(d<){
y++;
d+=UpIncre;
}
else
d+=DownIncre;
}
}
else if((dy>=(-dx))&&dy<=) //-1<=k<=0
{
d=dx-*dy;
UpIncre=-*dy;
DownIncre=-*dx-*dy;
while(x<=x1)
{
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
x++;
if(d>)
{
y--;
d+=DownIncre;
}
else d+=UpIncre;
}
}
else if(dy<(-dx)) //k<-1
{
d=-dy-*dx;
UpIncre=*dx+*dy;
DownIncre=*dx;
while(y>=y1)
{
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
y--;
if(d<)
{
x++;
d-=UpIncre;
}
else d-=DownIncre;
}
} else //k>1和k不存在
{
d=dy-*dx;
UpIncre=*dy-*dx;
DownIncre=-*dx;
while(y<=y1)
{
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
y++;
if(d<)
{
x++;
d+=UpIncre;
}
else d+=DownIncre;
}
}
} void Display() //显示函数
{
glClear(GL_COLOR_BUFFER_BIT); //清空颜色堆栈 DRAWLINE1 //画直线
DRAWLINE2 //画直线 glFlush(); //清空缓冲区指令
} int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化显示模式
glutInitWindowSize(WIDTH,HEIGHT); //设置窗口尺寸
glutInitWindowPosition(,); //设置窗口位置
glutCreateWindow("画直线"); //创建窗口 glutDisplayFunc(Display); //注册显示函数
Init(); //初始化
glutMainLoop(); //进入程序循环
return ;
}
Freecode : www.cnblogs.com/yym2013
《图形学》实验四:中点Bresenham算法画直线的更多相关文章
- Python使用DDA算法和中点Bresenham算法画直线
title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...
- 《图形学》实验五:改进的Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...
- 《图形学》实验七:中点Bresenham算法画椭圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- 《图形学》实验三:DDA算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用DDA算法画直线. 实验结果: 代码: #include <gl/glut.h> #include <math.h> ...
- 利用canvas实现的中点Bresenham算法
Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...
- 基于Bresenham算法画圆
bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...
- [DEBUG]椭圆的中点Bresenham算法边缘绘制出现错误
在使用椭圆的中点Bresenham算法绘制椭圆时, 当椭圆足够大时, 椭圆的边缘会出现下面这种情况. 出错原因: 将a, b声明为了int类型, 导致中点判别式中发生溢出 关注后面的a*b*a*b当a ...
- Bresenham’s algorithm( 布兰森汉姆算法)画直线
Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点.这个算法只会用到较为快速的整数加法.减法和位元移位,常用于绘制电脑画面中的直线.是计算机图形学 ...
随机推荐
- Python自动化之配置Python模块国内镜像
Linux环境 在~/.pip/pip.conf文件中添加或修改 [global] index-url = http://mirrors.aliyun.com/pypi/simple/ [instal ...
- [ruby on rails] 深入(2) ruby基本语法
1. 调试&注释&打印输出 1.1 调试 ruby属于解释型语言,即脚本,在linux上,脚本的执行无非三种: 1. 用解释器运行脚本 解释器 脚本文件 即:ruby 脚本文件 2. ...
- [ruby on rails] 深入(1) ROR的一次request的响应过程
示意图 即: 1. 浏览器发起请求 2. Routes对请求进行一个url映射,交给对应的Controller来处理 3/4. Contoller从Model中获取数据(或者操作数据) 5. 返回给 ...
- 基于HTK语音工具包进行孤立词识别的使用教程
选自:http://my.oschina.net/jamesju/blog/116151 1前言 最近一直在研究HTK语音识别工具包,前几天完成了工具包的安装编译和测试,这几天又按耐不住好奇,决定自己 ...
- phpcms前台退出登录的时候提示信息'退出成功0'
问题背景: phpcms前台退出登录的时候,提示了一个退出成功0 让我很困惑为啥有个0呢? 问题分析: 进入 ./phpcms/modules/member/index.php 找到logout方法, ...
- 打印log
入口文件 //日志记录配置 if (!defined('DS')) { define('DS', '/'); } if(!defined('APP_PATH_LOG')){ define('APP_P ...
- How can I determine the URL that a local Git repository was originally cloned from?
git remote show origin from: http://stackoverflow.com/questions/4089430/how-can-i-determine-the-url- ...
- window.navigate 与 window.location.href 的使用区别介绍
window.navigate(sURL)方法是针对IE的,不适用于FF,在HTML DOM Window Object中,根本没有列出window.navigate方法. 要在javascript中 ...
- 使用Grub Rescue恢复Ubuntu引导
装了Ubuntu和Window双系统的电脑,通常会使用Ubuntu的Grub2进行引导. Grub2会在MBR写入引导记录,并将引导文件放在/boot/grub,破坏任意一项都会导致系统无法正常启动. ...
- VC++ LoadLibrary失败,错误126(找不到指定的模块)
在VS中调用一个资源模块dll,LoadLibrary返回值为NULL,没有加载成功.GetLastError后原因为"找不到指定的模块"!代码如下: HINSTANCE hIns ...