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

算法步骤:

(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算法的更多相关文章

  1. 《图形学》实验五:改进的Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...

  2. Python使用DDA算法和中点Bresenham算法画直线

    title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...

  3. [计算机图形学]光栅化算法:DDA和Bresenham算法

    目录 一.DDA 二.Bresenham 三.绘制图形 1. 绘制直线 2. 绘制圆 3. 绘制椭圆 一.DDA DDA算法是最简单的直线绘制算法.主要思想是利用直线的斜截式:\(y=kx+b\) 对 ...

  4. 《图形学》实验七:中点Bresenham算法画椭圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...

  5. 《图形学》实验六:中点Bresenham算法画圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...

  6. 《图形学》实验四:中点Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...

  7. 倒排索引压缩:改进的PForDelta算法

    由于倒排索引文件往往占用巨大的磁盘空间,我们自然想到对数据进行压缩.同时,引进压缩算法后,使得磁盘占用减少,操作系统在query processing过程中磁盘读取效率也能提升.另外,压缩算法不仅要考 ...

  8. 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现

    1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...

  9. 利用canvas实现的中点Bresenham算法

    Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...

随机推荐

  1. Java编程代码性能优化总结

    如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 ...

  2. Java String charAt()方法

    描述 此方法返回位于字符串的指定索引处的字符.该字符串的索引从零开始. 语法 此方法定义的语法如下: public char charAt(int index) 参数 这里是参数的细节: index  ...

  3. Unity3D调用摄像头

    代码启用摄像头 .using UnityEngine;   .using System.Collections;   .   .public class WebCamManager : MonoBeh ...

  4. SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域

    SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域 >>>>>>>>>>>> ...

  5. EntityManager 实例化方法

    Configure the EntityManager via a persistence.xml file <persistence xmlns="http://java.sun.c ...

  6. 使用C#在VS中开发:未处理AccessViolationException “System.AccessViolationException”类型的未经处理的异常

    未处理AccessViolationException: “System.AccessViolationException”类型的未经处理的异常在System.Data.dll中发生 其他信息:尝试读 ...

  7. 简单好用用js就可以保存文本文件到本地

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. [bzoj 1468][poj 1741]Tree [点分治]

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  9. Java多线程缓存器简单实现

    package com.charles.utils; import java.util.HashMap; import java.util.Map; import java.util.concurre ...

  10. (转)Linux系统安装时分区的选择

    场景:对于Linux系统的分区总是迷迷茫茫的,还是实践少,基础不牢. 以前初识Linux时,对Linux系统安装时分区的选择,一点都不了解,导致几次没法进行下一步安装,因此就静下心来,专门拿出时间研究 ...