bresenham画线算法的最简洁实现

具体的bresenham算法可以参考https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html,这里介绍的是一种基于该算法的实现方式。为什么说是最简洁的实现的看下面的代码实现就知道了,短短不到三十行代码便可以实现全坐标系任意斜率直线的绘制。

这里采用了虚拟轴的概念,因而使得可以屏蔽斜率的概念可以使得所有的直线绘制都转化为第一象限斜率小于1情况下的直线绘制。因此所有的判定条件只有一个e+dy-0.5dx

std::vector<Point> bresenham(Point start_point, Point end_point) {std::vector <Point> res;Point pos = start_point;int direction_x = end_point.x - start_point.x;int direction_y = end_point.y - start_point.y;int delta_x = fabs(direction_x);int delta_y = fabs(direction_y);int max_xy = ((delta_x > delta_y) ? delta_x : delta_y);int decision_param_x = - (max_xy / 2);int decision_param_y = decision_param_x;res.push_back(start_point);for(int i = 0; i < max_xy; ++i) {//处理xdecision_param_x += delta_x;if(decision_param_x > 0) {direction_x > 0 ? pos.x++ : pos.x--;decision_param_x -= max_xy;}//处理ydecision_param_y += delta_y;if(decision_param_y > 0) {direction_y > 0 ? pos.y++ : pos.y--;decision_param_y -= max_xy;}res.push_back(pos);}return res;
}

以上便是该算法实现的全部内容,可以很容易移植到不同的测试环境中测试。下图是在windows平台终端下的测试结果。

以下为完整的测试代码:

#include <iostream>
#include <windows.h>
#include <vector>
#include <cmath>typedef struct
{int x;int y;
}Point;Point start_point = {15, 15};
Point end_point = {8, 0};std::vector<Point> bresenham(Point start_point, Point end_point) {std::vector <Point> res;Point pos = start_point;int direction_x = end_point.x - start_point.x;int direction_y = end_point.y - start_point.y;int delta_x = fabs(direction_x);int delta_y = fabs(direction_y);int max_xy = ((delta_x > delta_y) ? delta_x : delta_y);int decision_param_x = - (max_xy / 2);int decision_param_y = decision_param_x;res.push_back(start_point);for(int i = 0; i < max_xy; ++i) {//处理xdecision_param_x += delta_x;if(decision_param_x > 0) {direction_x > 0 ? pos.x++ : pos.x--;decision_param_x -= max_xy;}//处理ydecision_param_y += delta_y;if(decision_param_y > 0) {direction_y > 0 ? pos.y++ : pos.y--;decision_param_y -= max_xy;}res.push_back(pos);}return res;
}void gotoXY(int x, int y)
{COORD cd;    cd.X   =   x; cd.Y   =   y;     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}int main(void)
{std::vector<Point> point_set = bresenham(start_point, end_point);system("cls");for(int i = 0; i < point_set.size(); ++i){gotoXY(point_set[i].x, point_set[i].y);std::cout << "*" ; }gotoXY(0,30);
}

bresenham画线算法的最简洁实现相关推荐

  1. 图形学--(中点画线法+Bresenham画线算法)

    编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...

  2. Bresenham画线算法笔记

    目录 一.DDA算法和中点画线算法的回顾 二.Bresenham画线算法 一.DDA算法和中点画线算法的回顾 1.DDA算法(Digtal Differential Analyzer) 假设两个端点坐 ...

  3. Bresenham画线算法的推导

    转自:https://www.cnblogs.com/soroman/archive/2006/07/27/509602.html 以前看到Bresenham画线算法,直接拿来用,没有去推导它,近日, ...

  4. 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...

  5. openGL实现中点画线算法、DDA画线算法,Bresenham画线算法,并进行鼠标键盘的交互

    首先设置变量用于进行鼠标交互和键盘交互: int m = 0; GLdouble m1 =0, m2 = 0; 1.实验入口主函数: //主函数 int main(int argc, char** a ...

  6. java bresenham画直线_图形学笔记: Bresenham画线算法

    图形学课本, 按规矩介绍完矩阵行列式, 第一个算法肯定就是Bresenham画线算法了. 來我们來看看算法 Bresenham是用来画一些不反走样的线段的. 都说了线段肯定有起点和终点, 假设我们: ...

  7. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  8. 【OpenGL】画线算法

    文章目录 DDA数值微分线段算法 中点画线法(简) Bresenham画线算法 DDA数值微分线段算法 数值微分法即DDA法(Digital Differential Analyzer),是一种基于微 ...

  9. 图形学画直线c语言,002计算机图形学之直线画线算法

    002计算机图形学之直线画线算法 我们知道直线方程的斜截式是如下的样子: y = kx +b 在显示器上显示直线的话,如果使用如上的方程,每描一个点 需要进行一次浮点乘法,一次浮点加法,和取整操作. ...

最新文章

  1. 97.16% 的加班率,给你 3 倍工资:你愿意去大厂吗?
  2. openssl在64位的机器上编译32位的库
  3. 给CenOS7虚拟机扩容
  4. 编程之美读书笔记2.1—求二进制数中1的个数
  5. junit testng_TestNG或JUnit
  6. UnhandledPromiseRejectionWarning报错send()的处理
  7. 下载的JAVA9怎么没有jshell_java9系列(一)安装及jshell使用
  8. Android安全:Hook技术
  9. Android调用默认浏览器打开指定url
  10. 安装成功后python报错_python安装mysql的依赖包mysql-python操作
  11. 两台文件服务器共享文件同步,如何实现两台或多台电脑远程修改文件同步更新?...
  12. MUD是永远不会结束的,因为它就是人生(转)
  13. 红宝书新日本语能力考试N1~N5全套资料PDF分享 ​​
  14. iOS Gif分解与展示
  15. 还在为带货出行发愁吗?你想要的答案或许可以在电梯间找到
  16. VueDemo-12.加入购物车
  17. 使用wx原生方法扫描获取SN码
  18. virtualxposed使用教程_Xposed 插件开发入门教程(一)
  19. HC-05蓝牙AT指令无反应问题
  20. windows下安装Python的IPy模块

热门文章

  1. 《Vim实用技巧(第2版)》学习笔记:技巧12-双剑合璧,天下无敌
  2. LeetCode翻转字符
  3. python代写学生作业_代做python程序作业、代写 tree Tpython留学生作业
  4. 把电脑设置为免费的WIFI热点
  5. git连接远程仓库步骤完善版
  6. 如何建立一个强大的公关策略
  7. 冬天拍婚纱照注意事项 拍出养眼婚纱照
  8. db2在页面删除一条数据_db2删除数据表
  9. 时代全芯卡位新型存储 聚焦PCM相变存储器
  10. 几个Redis的监控指令以及保护Redis安全