改进的Bresenham算法
这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步。
算法步骤:
(1) 输入直线的两端点P0 (x0, y0)和P1 (x1, y1)。
(2) 计算初始值dx, dy, e = -dx, x = x0, y = y0。
(3) 绘制点 (x, y)。
(4) e更新为e+2 * dy。判断e的符号,若e > 0, 则(x, y)更新为(x+1, y+1), 同时将e更新为e-2*dx;否则(x, y)更新为(x+1, y)。
(5) 当直线没有画完时,重复步骤(3)和(4)否则结束。
水平、垂直和|k| = 1的直线可以直接装入帧缓冲存储器面无须进行画线算法处理。下面是我的算法,如有错误请指出。
#include <GL/freeglut.h>
void init (void)
{
glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
} void drawLine (int x1, int y1, int x2, int y2)
{
int x, y, dx, dy, e;
// k does not exist
if (x1 == x2)
{
if (y1 < y2)
{
y = y1;
glBegin (GL_POINTS);
while (y <= y2)
{
glVertex2i (x1, y);
++ y;
}
glEnd ();
} // if (y1 < y2)
else
{
y = y2;
glBegin (GL_POINTS);
while (y <= y1)
{
glVertex2i (x1, y);
++ y;
}
glEnd ();
}
} // if (x1 == x2)
else if (y1 == y2) // k = 0
{
if (x1 < x2)
{
x = x1;
glBegin (GL_POINTS);
while (x <= x2)
{
glVertex2i (x, y1);
++ x;
}
glEnd ();
} // if (x1 < x2)
else
{
x = x2;
glBegin (GL_POINTS);
while (x <= x1)
{
glVertex2i (x, y1);
++ x;
}
glEnd ();
}
}
else
{
if (x1 > x2)
{
int temp = x1;
x1 = x2;
x2 = temp;
temp = y1;
y1 = y2;
y2 = temp;
}
x = x1;
y = y1;
dx = x2 - x1;
dy = y2 - y1;
// k = 1
if (dx == dy)
{
glBegin (GL_POINTS);
while (x <= x2)
{
glVertex2i (x, y);
++ x;
++ y;
}
glEnd ();
}
else if (dx == -dy) // k = -1
{
glBegin (GL_POINTS);
while (x <= x2)
{
glVertex2i (x, y);
++ x;
-- y;
}
glEnd ();
}
else if (dy > dx) // k > 1
{
glBegin (GL_POINTS);
dx <<= 1;
e = - dy;
dy <<= 1;
y = y1 > y2 ? y2 : y1;
int maxY = y1 > y2 ? y1 : y2;
while (y <= maxY)
{
glVertex2i (x, y);
++ y;
e += dx;
if (e > 0)
{
++ x;
e -= dy;
}
}
glEnd ();
}
else if (dy > 0) // 0 < k < 1
{
e = -dx;
dx <<= 1;
dy <<= 1;
glBegin (GL_POINTS);
while (x <= x2)
{
glVertex2i (x, y);
++ x;
e += dy;
if (e > 0)
{
e -= dx;
++ y;
} }
glEnd ();
}
else if (-dy < dx) // 0 > k > -1
{
e = -dx;
dx <<= 1;
dy <<= 1;
glBegin (GL_POINTS);
while (x <= x2)
{
glVertex2i (x, y);
++ x;
e += dy;
if (e < 0)
{
-- y;
e += dx;
}
}
glEnd ();
}
else if (-dy > dx) // k < -1
{
e = dy;
dx <<= 1;
dy <<= 1;
glBegin (GL_POINTS);
y = y1 > y2 ? y1 : y2;
int minY = y1 > y2 ? y2 : y1;
while (y >= minY)
{
glVertex2i (x, y);
-- y;
e += dx;
if (e > 0)
{
++ x;
e += dy;
}
}
glEnd ();
}
}
} void display (void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0f, 0.0f, 0.0f);
// Vertical line
drawLine (0, -200, 0, 200);
// Horizontal line
drawLine (-200, 0, 200, 0);
// k = 1 line
drawLine (-200, -200, 200, 200);
// k = -1 line
drawLine (-200, 200, 200, -200);
// k = 1/2 line
drawLine (200, 100, -200, -100);
// k = 2 line
drawLine (-100, -200, 100, 200);
// k = -1/2 line
drawLine (-200, 100, 200, -100);
// k = -2 line
drawLine (-100, 200, 100, -200); drawLine (30, 120, 10, 70); drawLine (10, 70, 30, 10); drawLine (30, 10, 60, 50); drawLine (60, 50, 80, 10); drawLine (80, 10, 120, 80); drawLine (120, 80, 70, 80); drawLine (70, 80, 30, 120); 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 ("optimized Bresenham line");
init ();
glutReshapeFunc (reshape);
glutDisplayFunc (display);
glutKeyboardFunc (keyboard);
glutMainLoop ();
return 0;
}
改进的Bresenham算法的更多相关文章
- 《图形学》实验五:改进的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 ...
- [计算机图形学]光栅化算法:DDA和Bresenham算法
目录 一.DDA 二.Bresenham 三.绘制图形 1. 绘制直线 2. 绘制圆 3. 绘制椭圆 一.DDA DDA算法是最简单的直线绘制算法.主要思想是利用直线的斜截式:\(y=kx+b\) 对 ...
- 《图形学》实验七:中点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 ...
- 《图形学》实验四:中点Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...
- 倒排索引压缩:改进的PForDelta算法
由于倒排索引文件往往占用巨大的磁盘空间,我们自然想到对数据进行压缩.同时,引进压缩算法后,使得磁盘占用减少,操作系统在query processing过程中磁盘读取效率也能提升.另外,压缩算法不仅要考 ...
- 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现
1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...
- 利用canvas实现的中点Bresenham算法
Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...
随机推荐
- Oracle,Mysql ,SQL Server 三大数据库带参数的模糊查询, 拼接查询条件问题
最近项目开发一直在不断切换数据库,有时候一条sql 要同时考虑多种数据库中的兼容问题 , 先总结一条模糊查询拼接查询条件的问题,后续追加总结. 目前使用 mybatis: 1. Oracle 中使 ...
- 打造属于自己的支持版本迭代的Asp.Net Web Api Route
在目前的主流架构中,我们越来越多的看到web Api的存在,小巧,灵活,基于Http协议,使它在越来越多的微服务项目或者移动项目充当很好的service endpoint. 问题 以Asp.Net W ...
- 微信iOS消息拦截插件教程-Tweak HelloWorld
微信iOS消息拦截插件教程-Tweak HelloWorld 标签(空格分隔): 越狱开发教程 1.环境准备 准备一台越狱的手机,具体参照上一篇教程 搭建Theos越狱开发环境 2.开发过程 新建一个 ...
- Centos7架设NMP服务器笔记
安装centos7.3 1.从mirrors.163.com下载7.3 2.准备虚拟机vitualbox,网络我使用的桥接到无线网卡,直接连我到路由器,IP自动分配(本来想搞静态IP的,搞了好久没成功 ...
- 使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
上文<使用 VS2017 和 js 进行桌面程序开发 - electron 之 Hello Word>介绍了如何使用 VS2017 开发 electron 桌面程序,今天来点有看头的,但是 ...
- 次小生成树学习+例题 poj 1679 The Unique MST
次小生成树学习: 顾名思义,次小生成树,就是将图的所有生成树排序后,权值第二小的生成树. 次小生成树的朴素求法是很好想的,即首先求出最小生成树,之后枚举最小生成树中的所有边,将当前枚举的边" ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- pc端的企业网站(IT修真院test8)详解1-3
一,base.css基础样式表的意义 我昨天,整理了一下代码规范. 发现现在这个程度的页面还原.有必要创建一个规范的base.css库和framework.css库 而且也要为日后的工作整理一些常用的 ...
- Django源码学习 了解render与render_to_response
render与render_to_response def render_to_response(template_name, context=None, content_type=None, sta ...
- MySQL数据库“十宗罪”(十大经典错误案例)
Top 1: Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 1 2 3 4 5 6 mysql> show variables lik ...