本博客仅限于斜率在0~1之间的直线

原算法

设直线起始点坐标为(xs,ys),均为整数,即
x1 = xs, y1 = ys
e(x2) = y2 - y1 - 0.5 = m - 0.5
终点坐标为(xe,ye)
dx = xe-xs,dy = ye-ys;

m = (double)dy/(double)dx;
e = m-0.5;
for(int i = 0;i<dx;i++){gl_Point(x,y);if(e>=0){y = y+1;e=e-1;}x = x+1;e=e+m;

为了去掉算法中的除法,提高算法的效率和减少算法的复杂性,可以令f = 2*e*dx;

f = 2 * dy - dx;
for (int i = 0; i<dx; i++) {gl_Point(x,y);if (f >= 0) {y = y + 1;f = f - 2*dx;}x = x + 1;f = f + 2 * dy;
}

用openGL实现如下:

#include<iostream>
#include "gl\glut.h"
using namespace std;int xx, yy, x2, y2;
void bresenham(int xs, int ys, int xe, int ye);
void lineSegment()
{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0);//设置点的颜色为红色glBegin(GL_POINTS);bresenham(xx, yy, x2, y2);glEnd();glFlush();//必须得加
}void bresenham(int xs, int ys, int xe, int ye) {int x = xs, y = ys, dx, dy;dx = xe - xs;dy = ye - ys;int f = 2 * dy - dx;for (int i = 0; i<dx; i++) {glVertex2d(x, y);if (f >= 0) {printf("f=%d>=0  ", f);}else {printf("f=%d<0   ", f);}if (f >= 0) {y = y + 1;f = f - 2*dx;}x = x + 1;f = f + 2 * dy;printf("(%d,%d)\n", x, y);}
}int main(int argc, char * argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);printf("输入起始坐标和终点坐标:\n");scanf("%d,%d,%d,%d", &xx, &yy, &x2, &y2);glutInitWindowPosition(50, 100);glutInitWindowSize(500, 500);glutCreateWindow("Bresenham画线算法");glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景为黑色glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 500.0, 0.0, 500.0);glutDisplayFunc(lineSegment);glutMainLoop();}

输入1,1,400,300结果如下:

Bresenham算法画直线相关推荐

  1. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

  2. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  3. 布兰森汉姆画圆matlab,bresenham算法画直线

    实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...

  4. Bresenham 算法画直线

    参考:Bresenham 画线算法推导过程_在到处之间找我-CSDN博客_bresenham画线算法今天复习这个算法的时候,有一点没有立马反应过来,故特此记此篇博客作为备忘.文章目录描点原理用 $p_ ...

  5. java 2d划线 刷子_Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO2DGRAPHICS)...

    Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO2DGRAPHICS) (2007-04-05 23:37:39) Java 2D Graphics提供了强大的画线功能,可 ...

  6. 使用openGL,用Bresenham算法画椭圆

    运行结果 源代码 //用Bresenham算法画椭圆 #include<iostream> #include<stdlib.h> #include <GL/glut.h& ...

  7. Bresenham快速画直线算法

    现在的计算机的图像的都是用像素表示的,无论是点.直线.圆或其他图形最终都会以点的形式显示.人们看到屏幕的直线只不过是模拟出来的,人眼不能分辨出来而已.那么计算机是如何画直线的呢,其实有比较多的算法,这 ...

  8. Bresenham改进算法结合wu反走样算法画直线

    自己打造了CLine画直线类 1.CP2类 定义了点类 class CP2 { public:CRGB clr;double y;double x;CP2();CP2(double,double,CR ...

  9. Bresenham’s algorithm( 布兰森汉姆算法)画直线

    简介 1967年,IBM的J.Bresenham提出了Bresenham算法.     Bresenham算法是在一些约定条件下的最佳逼近.     Bresenham算法通过前一个像素点提供的信息来 ...

最新文章

  1. 每日一皮:不同的视角看待问题...
  2. ddl mysql_mysql 5.6 在线 DDL
  3. 使用JDBC连接SQL Server数据库
  4. Cortex‐M3-存储器映射
  5. MFC 双击控件 提示重载函数已存在
  6. 《Cortex-M0权威指南》之体系结构---嵌套中断控制器(NVIC)
  7. JS 继承(类式 与 原型式)
  8. token与sessionId的区别——学习笔记
  9. bdm导入mysql_MySQL数据库导入教程
  10. 181123每日一句
  11. 记录下关于qt使用windeployqt.exe打包程序之后运行报错无法定位程序输入点
  12. IsPostBack
  13. 德雷福斯(Dreyfus)技能获取模型
  14. Java链表(基本操作)
  15. 使用stm32f407和stm32f103板子进行can通信
  16. python图画制作_python语言创意绘画-用python画画
  17. 打造新型产教融合平台,开放原子校源行引领开源人才培养迈入新高地
  18. 企微整合,钉钉进化,飞书抢占toB下半场
  19. 040 OpenVAS的下载与安装
  20. 很jiong的一天又过去了

热门文章

  1. postman查询ElasticSearch数据
  2. 留学生CS计算机编程专业作业写作攻略
  3. 谷粒商城三阶段课件_初一地理课堂37:(课件)4.1人口与人种
  4. Web开发种色系搭配方案和常用颜色码
  5. Unity Texture转Texture2D
  6. Office Word 2007可以添加自定义的水印到水印库中
  7. 的it生活_IT 圈生活图鉴首篇 | 背包里的神秘时尚
  8. unity生成的exe文件点了却没反应?(其中一类解决方案,希望大家可以一起来完善)
  9. 关于抖音文案的重要性以及如何分享好的抖音文案,详情已附上
  10. UTF8和UNICODE的关系及转换规则(字库篇一)