今晚心血来潮想起写直线的算法。第一次接直线算法的就是看《Windows游戏编程大师技巧》的时候,它解说了直线光栅化的其中一个快速算法,叫做Bresenham算法,刚开始看的时候以为是什么了不起,当我了解后,其实也没什么了不起,用不着高等数学的知识,只要高中的知识就够了。

解释上图:
    1.现在开始教程,先给出直线方程的斜截式 y = kx + b (k是斜率,b是在y轴上的截距)。再看上图:横线与竖线所有交点代表屏幕上的某区域内所有的整数连续点,也就是说在屏幕显示的点,直线,或其它几何图形只能用整数点体现,例如直线分别在x,y方向上的增量只能是1或0,所以不能常规的代值方法去求Y值。
    2.我先解释一下上图的构造:绿色字P1,P2,P3,P4代表在屏幕上求得的像素点(现在我先给出,等下再推理),P0和Pn分别是线段的起始点和结束点,黄色字M0,M1,M2,M3代表的是直线与竖线的交点,这些点是虚拟的点,在屏幕上是不存在的,现在标出只是为了好理解,等一会会借助它去求绿色字的点。黄色的线就是实际的线段图形
    3.好了,精彩的部分来了!!


P1,P2,P3,P4的求解过程(注意:屏幕的y轴正方向是向下的):
    1.由于画线函数的参数是起始点与结束点,因此P0(x0,y0)和Pn(xn,yn)是已知,所以现在要求下一个点,即要证明下一个点是上图的P1点(先给出再证明),现在我们看看上图,下一个点只能取(x0 + 1, y0) 或(x0 + 1, y0 - 1) (为什么以x方向为增量呢?后面再说明理由),为什么y方向上只能取y0 或 y0 - 1 呢,取y0 - 2行吗!你想想,要是取y0 - 2在屏幕上显示的直线与实际直线的走向偏差太大了!所以不能取啊!取y0 + 1是同样的道理(不行)!
    2.那么怎么决定y方向上是取 y0 还是 y0 - 1 呢?为此,要借助M0点,现在以x为增量求
出M0, 只要把x0 + 1 代入斜截式得
y = k(x0 + 1) + b                      (1)
现在还有k和b是没求出的,这很容求出由于P0在线段P0Pn上,且k = (yn - y0) / (xn - x0),为了简化表示设
dy = yn - y0,
dx = xn - x0,
于是求出b为
b = y0 - (dy / dx) * x0,
然后把b,k = dy / dx代入(1)式得
y = (dy / dx)(x0 + 1) + y0 - (dy / dx) * x0;
化简得:
y = k + y0;
于是求出M0(x0 + 1, k + y0),现在要比较线段|P1M0| 和 |M0Q1|(在写程序的时候可能不知道是哪个点先哪个点后,而只知道开始点与结束点,所以为了保证两线段为正,另外是因为我们只比较大小)的大小,显然,这两条线段都很容易求出,求出后比较大小,如果|P1M0| < |M0Q1| (至于实现的方法有多种)则取P1作为下一个像素点,否则取Q1为下一个像素点

同理求M1得M1(x0 + 2, 2 * k + y0),用同样的方法比较|Q1M1| 和 |M1P2|,取得第三个像素点,用同样的道理可依次求出后面的像素点的坐标值。

详解Bresenham算法原理(1)相关推荐

  1. fm算法详解_FM算法原理分析与实践

    一.简介 FM是Steffen Rendle在2010年提出的,FM算法的核心在于特征组合,以此来减少人工参与特征组合工作.对于FM,其优势可分以下三点: FM能处理数据高度稀疏场景,SVM则不能: ...

  2. YOLOv1论文详解【算法原理、置信度、IOU、损失函数等】

    YOLOv1 YOLO v1 优点 算法原理 专业词汇解释: 1.置信度(confidence) 2.IoU(Intersection over Union ratio) 训练步骤 从R-CNN到Fa ...

  3. 详解FCM算法原理及应用

     (一)原理部分 模糊C均值(Fuzzy C-means)算法简称FCM算法,是一种基于目标函数的模糊聚类算法,主要用于数据的聚类分析.理论成熟,应用广泛,是一种优秀的聚类算法.本文关于FCM算法 ...

  4. 详解KMP算法原理,以及完整java与C++实现

    点击此处学习更多算法与通信知识 作者 | labuladong 来源 | labuladong KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实 ...

  5. 堆排序 java_详解堆排序算法原理及Java版的代码实现

    概述堆排序是一种树形选择排序,是对直接选择排序的有效改进. 堆的定义如下:具有n个元素的序列(k1,k2,...,kn), 当且仅当满足: 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为 ...

  6. 什么是雪花算法,详解雪花算法原理

    雪花算法(SnowFlake) 雪花算法是Twitter开源的分布式ID生成算法. 主要是由64bit的long型生成的全局ID,引入了时间戳和ID保持自增的属性. 64bit分为四个部分: 第一个部 ...

  7. 一文详解PnP算法原理

    PnP(Perspective-n-Point)问题的几何结构如图1所示,给定3D点的坐标.对应2D点坐标以及内参矩阵,求解相机的位姿. 数学语言描述如下: 图1.PnP几何结构 1.直接线性变换法( ...

  8. 扩展Euclidean算法求乘法逆原理详解与算法实现

    [利用扩展Euclidean算法求乘法逆] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 6 ...

  9. Hector SLAM 原理详解、算法解析

    目录 1.原理详解 2.算法解析 1.原理详解 Hector整体算法很直接,就是将激光点与已有的地图"对齐",即扫描匹配.扫描匹配就是使用当前帧与已经有的地图数据构建误差函数,使用 ...

最新文章

  1. sublime Text3安装和verilog安装
  2. 惜缘-致家乡的一位女孩[原创]
  3. C语言 数组排序 – 快速法排序 - C语言零基础入门教程
  4. Bootstrap3.0学习第二十六轮(JavaScript插件——图片轮播)
  5. matlab 中sumg,MATLAB)课后实验答案[1]
  6. ios开发 访问mysql_iOS开发实战-时光记账Demo 网络版
  7. libmesh 实现 流程
  8. plantuml如何导出大图片
  9. 【今日头条测试开发笔试】部分题目总结
  10. css漂亮的侧导航栏,jQuery+css实现非常漂亮的水平导航菜单效果
  11. 多图赏析联想Windows 8平板ThinkPad Tablet 2
  12. mac 读写 ntfs
  13. 八类网线和七类网线的区别_7类网线和8类网线到底有何不同?
  14. hikvision服务器重装系统,一篇看懂黑群晖重装系统
  15. [转载] 网络硬件发展史
  16. 001-三阶魔方-概述及层先法
  17. 科普:指纹识别的工作原理
  18. 微信小程序图片自动播放功能
  19. Delphi访问网络共享文件夹
  20. 【金猿产品展】云简业财——满足中大型企业个性化需求的报销、费控、预算、业财一体化管理平台...

热门文章

  1. webots自学笔记(九)弹簧与阻尼添加
  2. 博彦科技[前端开发面试题]
  3. python小波去噪_python小波变换去噪
  4. 天翼网盘客户端数据目录研究
  5. 毕业一年的大专生程序员工作总结(java后台)
  6. Linux下安装配置Tomcat
  7. Chrom插件推荐实用小白初次使用
  8. 实用工具状态机transitions
  9. Flutter入门实战:从0到1仿写web版掘金App
  10. Word排版之利用交叉引用插入参考文献