Bresenham算法实现
来源:互联网 发布:小学生近视数据 编辑:程序博客网 时间:2024/06/08 02:53
Bresenham算法的实现
记录Bresenham算法的实现。
</pre><p></p><p>实现的环境是windows7和VS2015。vs的opengl配置可以看这里:http://blog.csdn.net/baidu_27962861/article/details/52826829</p><p>没有调用绘点函数,所以每种情况都有绘点的部分。</p><p>一共有五种情况,分别是斜率0<k<1,k>1,-1<k<0,k<-1,k不存在。其中k>1和k<-1合并为一种情况,k的绝对值大于1,步长取y。0<k<1和-1<k<0合并为一种情况,k绝对值值在0和1之间;还有就是斜率不存在的情况,步长取y。</p><p>算法思路完全参照《计算机图形学及其实践教程》中Bresenham算法的伪代码实现。</p><p>display函数调用了Bresenham函数,Bresenham函数中实现了绘点和x,y的变化。没有输入;输出是在display中的Bresenham调用的参数输出的多条直线,斜率分别是0,1/2,1,2;-1,-1/2,-2;0和不存在的情况。</p><p>经过测试,程序可以在我的环境中正确运行。</p><p>代码如下:</p><p><pre name="code" class="cpp">#include "stdafx.h"#include "GL/glut.h"#include<cmath>int winWidth = 500, winHeight = 500;//窗口大小void init(){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, winWidth, 0, winHeight);}void Bresenham(int x1, int y1, int x2, int y2){ float dx, dy, h, x, y; x = x1; y = y1;//用于递增 glPointSize(2.0); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); dx = abs(x1 - x2); dy = abs(y1 - y2); bool isAbsluteSlopeBetweenZeroToOne = (dy <= dx && dy != 0) && (dx != 0);//斜率绝对值0->1 bool isAbsluteSlopeBiggerThanOne = (dy > dx) && ((dy != 0) && (dx != 0));//斜率绝对值 > 1 bool isSlopeIsZeroOrNoEixsts = (dx == 0) || (dy == 0);//斜率不存在或者为零 if (isAbsluteSlopeBetweenZeroToOne) { h = 2 * dy - dx; while ((x1 < x2 && x < x2) || (x1 > x2 && x > x2)) { glPointSize(2.0); glBegin(GL_POINTS); if (h < 0) { h += 2 * dy; }else{ h += 2 * (dy - dx); if (y1 < y2) { y++; }else { y--; } } glVertex2f(x, y); glEnd(); //区分正负,步长取x if (x1 < x2) { x++; }else { x--; } } } else if (isAbsluteSlopeBiggerThanOne) { h = 2 * dx - dy; while ((x1 < x2 && x < x2) || (x1 > x2 && x > x2)) { glPointSize(2.0); glBegin(GL_POINTS); if (h < 0) { h += 2 * dx; }else{ h += 2 * (dx - dy); if (x1 < x2) { x++; }else { x--; } } glVertex2f(x, y); glEnd(); //区分正负,步长取y if (y1 < y2) { y++; }else { y--; } } } else if(isSlopeIsZeroOrNoEixsts) { x = x1; y = y1; if (dx == 0) { if (y1 < y2) { while (y < y2) { glPointSize(2.0); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); y++; } }else { while (y > y2) { glPointSize(2.0); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); y--; } } } else { if (x1 < x2) { while (x < x2) { x++; glPointSize(2.0); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); } }else { while (x > x2) { x--; glPointSize(2.0); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); } } } } else { //do nothing }}void display(){ glClearColor(1.0, 1.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 0.0); Bresenham(0, 0, 500, 250);//k = 1 / 2 Bresenham(0, 0, 250, 500);//k = 2 Bresenham(0, 500, 250, 0);//k = -2 Bresenham(0, 500, 500, 250);//k = -1 / 2 Bresenham(250, 0, 250, 500);//k 不存在,y = 250 Bresenham(0, 250, 500, 250);//k = 0,x = 250 Bresenham(0, 0, 500, 500);//k = 1 Bresenham(0, 500, 500, 0);//k = -1 glFlush();}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitWindowPosition(100, 100); glutInitWindowSize(winWidth, winHeight); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutCreateWindow("Bresenham_Line"); init(); glutDisplayFunc(display); glutMainLoop(); return 0;}
0 0
- Bresenham算法opencv实现
- erlang实现bresenham算法
- Bresenham算法实现
- Bresenham直线算法的实现
- 比较好的一个bresenham算法实现
- Bresenham算法实现任意斜率直线绘制
- 圆的Bresenham算法的opengL实现
- 任意斜率下的Bresenham算法实现
- 用OPenGL实现 Bresenham画线算法
- C# 实现Bresenham算法(vs2010)
- 画线算法 - Bresenham原理及Java实现
- Bresenham 中点画圆算法实现
- Bresenham 算法——matlab实现
- Bresenham算法
- Bresenham算法
- Bresenham算法
- bresenham算法
- Bresenham算法
- 文章标题
- Linux 下阅读源码工具(Vim + ctags+Cscope)
- linux启动文件---一个好玩的记忆法delsb
- mysql--mysql简单实现查询结果添加序列号的方法
- java语言基础组成
- Bresenham算法实现
- 随机数
- 爬虫抓取火车票信息
- firebug常用命令
- hdu 1028 母函数
- 在jsp中调用js函数传参出现乱码
- 嵌入式开发之Linux基础第三天学习笔记 linux系统命令(二)
- JAVA大数处理(BigInteger,BigDecimal)
- python总结