前言

由于项目上遇到了棘手的问题,给定坐标需要实现C绘制直线的驱动函数,绘制直线一般都是显示屏的底层函数,本想着找个显示屏的驱动看下drawline源码,但仔细想一想会不会底层用的是汇编尼,于是便放弃了这种想法。通过百度学习到这是计算机图形学方面的,寻找到了解决办法就是自己用C实现,网上有三种方法:

  1. 数值微分DDA(Digital Differential Analyzer)算法
  2. 中点画线算法
  3. Bresenham算法

这三种方法的优缺点知乎——《不调用画图 API,用C 或 C++ 如何实现画一条线?》上面说的很清楚,还有腾讯的游戏开发、计算机图形学方面的高级工程师也有在知乎讲到《用 C 语言画直线》,我是采用了最后一种方法。

一. 代码

// 来自知乎
char pic[50][50] = {0};void show_pic(){for(int i=49;i>=0;--i){for(int j=0;j<50;j++){if(pic[i][j]==1) printf("x ");else printf("o ");}printf("\n");}
}
void drawline_old(int x0,int y0,int x1,int y1){int dx = abs(x0-x1);int dy = abs(y0-y1);printf("dx: %d,dy: %d \n",dx,dy);int y = y0,e = -2*dx;for(int x=x0; x<=x1;++x){pic[y][x] = 1;e += 2*dy;if(e > 0) ++y;if(e >= dx) e -= 2*dx;}
}
// 使用 Bresenham 算法画任意斜率的直线(包括起始点,不包括终止点)
void Line_Bresenham(int x1, int y1, int x2, int y2){int x = x1;int y = y1;int dx = abs(x2 - x1);int dy = abs(y2 - y1);int s1 = x2 > x1 ? 1 : -1;int s2 = y2 > y1 ? 1 : -1;char interchange = 0;    // 默认不互换 dx、dyif (dy > dx)               // 当斜率大于 1 时,dx、dy 互换{int temp = dx;dx = dy;dy = temp;interchange = 1;}int p = 2 * dy - dx;for(int i = 0; i < dx; i++){pic[y][x] = 1;if (p >= 0){if (!interchange)       // 当斜率 < 1 时,选取上下象素点y += s2;else                    // 当斜率 > 1 时,选取左右象素点x += s1;p -= 2 * dx;}if (!interchange)x += s1;               // 当斜率 < 1 时,选取 x 为步长elsey += s2;               // 当斜率 > 1 时,选取 y 为步长p += 2 * dy;}
}int main(void) {//drawline_old(2,2,50,10);Line_Bresenham(2,2,50,10);show_pic();return EXIT_SUCCESS;
}

二. 实测效果

实际测试了两个函数,easyx给出的方法可靠考虑的比较全面,可以拿过来移植。最近工作收获挺多的,也不知道未来会深入到哪一个方向,先记下来,图形学还是蛮好玩的。最后推荐一下EasyX ,看他文章虽然比较老了,但是都是精华。

EasyX Library for C++ 是针对 VC 的一套绘图库,接口简单易用,用起来很像 TC 的 graphics.h 绘图。

C语言画直线~Bresenham方法相关推荐

  1. python画直线的方法

    python画直线的方法,下面介绍三种: 1.使用列表解析法,只需要添加一个数据类型的变量,然后在上面添加一系列的直线,即可得到一条直线. 5.使用循环解析法和 for循环解析法两种方法相结合来画直线 ...

  2. Unity | 连线题_画直线的方法

    工程在:unity连线题画直线的工程-C#文档类资源-CSDN下载 一.弄一个自己喜欢的直线 我发现如果需要一些小元素,PPT是一个很好的素材库. 调好颜色,长度,透明度,宽度等,右键另存为就可以得到 ...

  3. R语言画森林图方法4

    获取更多R语言知识,请关注公众号:医学和生信笔记 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化.主要分享R语言做医学统计学.meta分析.网络药理学.临床预测模型.机器学习.生 ...

  4. 表格斜线 纯html实现画直线的方法

    很有意思的实现方式 通过添加很多个长宽都为1px的img对象来模拟直线:〉 简单的直线.小规模的还可以,还是觉得VML比较实用可以实现复杂的表头,还可以添加文字. 不过这种方法 很简单不需要应用VML ...

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

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

  6. Silverlight学习笔记三(鼠标点击动态画直线|动态设置Ellipse的Canvas.Top与Canvas.Left|动态设置Stroke属性的方法。)...

    我有可能需要把AutoCAD的部分功能搬到浏览器上,先练习一下画直线的方法.如图: MainPage.xaml代码: 大气象 <UserControl x:Class="DrawLin ...

  7. 在html5绘制直线的两个方法,html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点...

    如果你还不知道Canvas是什么,可以看看上一篇. 在学画画的时候,线条是最基本的了,而线条的连接可以组成任何图形.在Canvas中也是如此. 在开始之前我们先拿出画布和画笔: 复制代码代码如下: v ...

  8. html5点线的设置,html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点...

    如果你还不知道canvas是什么,可以看看. 在学画画的时候,线条是最基本的了,而线条的连接可以组成任何图形.在canvas中也是如此. 在开始之前我们先拿出画布和画笔: 复制代码代码如下: var ...

  9. 根据离散点画直线_excel表格怎么画散点图画直线

    Excel中散点图画直线具体该如何操作执行呢?其实表格中有插入选项,可以帮助我们完成一系列的画图方案,接下来是学习啦小编为大家带来的excel中的散点图画直线的教程,欢迎大家来到学习啦学习. exce ...

最新文章

  1. python中导入模块的方式_Python中几种导入模块的方式总结
  2. MyBatis下MySqL用户口令不能为空
  3. GridView滚动条
  4. 使用el-checkbox实现全选,点击失效没有反应
  5. leetcode题解77-组合
  6. VDI序曲八 网关与VDI发布
  7. Python操作MySQL(二) ORM篇
  8. 网站被跳转到联通域名无法访问页面
  9. 恒温箱温度计算机控制系统仿真,实验用恒温箱控制系统设计及其模型建立
  10. python函数库 阶跃 信号函数 调用_使用numpy增加阶跃函数中的分辨率
  11. 原生JS实现中文简繁切换,引入即可整站变繁体
  12. 【链世纪对话系列No.9】浪潮存储资深架构师叶毓睿:浪潮如何助力分布式云存储数据中心快速发展?
  13. docker attach退出容器,容器会停止运行的解决方法
  14. C++ async future deferred
  15. 如何在Apache-Maven官网下载到自己想要的版本
  16. sass安装步骤、概述、基本语法等
  17. 为什么选用one-hot?
  18. Oracle切换到scott用户
  19. Pytorch版deeplabv3+环境配置训练自己的数据集
  20. 【附源码】计算机毕业设计JAVA研究生推免系统

热门文章

  1. 腾讯云数据库TDSQL-C(原CynosDB)的外网访问配置
  2. 微信小程序—那些安全验证,滑块验证、输入验证码、拼图验证
  3. MATLAB贝茨极限,2014诺贝尔化学奖:突破光学显微极限
  4. 六度分离 HDO 1869 Floyd
  5. 后向重计算在OneFlow中的实现:以时间换空间,大幅降低显存占用
  6. AI-大型软件研发效能倍增的银弹
  7. Emacs footnote 自动排序
  8. 嵌入式使用Zbar解析二维码
  9. Win2012或Win2016安装网卡
  10. 宜收藏丨现阶段有哪些方式可以快速感知元宇宙?