笔记:Bresenham画线算法的推导

Bresenham直线算法 阅读详情

笔记:Bresenham画线算法的推导

以前看到Bresenham画线算法,直接拿来用,没有去推导它,近日,参考一些资料,特整理其算法推导过程如下。各位大虾如果知道其细节,赶紧闪过,不用浪费时间了。

基本上Bresenham画线算法的思路如下:

// 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).
// 根据对称性,可推导至全象限内的线段.
1.画起点(x1,y1).
2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.
2.1.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1)
2.2.否则,下个点为B(x1+1,y1+1)
3.画点(U或者B).
4.跳回第2步.
5.结束.


这里需要细化的是怎么判断下个要画的点为当前点的右邻接点还是当前点的右上邻接点.

设线段方程:ax+by+c=0(x1<x<x2,y1<y<y2)
令dx=x2-x1,dy=y2-y1
则:斜率-a/b = dy/dx.

从第一个点开始,我们有F(x,1,y1) = a*x1+b*y1+c=0
下面求线段ax+by+c=0与x=x1+1的交点:
由a*(x1+1)+b*y+c = 0, 求出交点坐标y=(-c-a(x1+1))/b
所以交点与M的y坐标差值Sub1 = (-c-a(x1+1))/b - (y1+0.5) = -a/b-0.5,即Sub1的处始值为-a/b-0.5。

则可得条件当 Sub1 = -a/b-0.5>0时候,即下个点为U.
反之,下个点为B.
代入a/b,则Sub1 = dy/dx-0.5.

因为是个循环中都要判断Sub,所以得求出循环下的Sub表达式,我们可以求出Sub的差值的表达式.下面求x=x1+2时的Sub,即Sub2
1.如果下下个点是下个点的右上邻接点,则
Sub2 = (-c-a(x1+2))/b - (y1+1.5) = -2a/b - 1.5
故Sub差值Dsub = Sub2 - Sub1 = -2a/b - 1.5 - (-a/b-0.5) = -a/b - 1.代入a/b得Dsub = dy/dx -1;
2.如果下下个点是下个点的右邻接点,
Sub2 = (-c-a(x1+2))/b - (y1+0.5) = -2a/b - 0.5
故Sub差值Dsub = Sub2 - Sub1 = -2a/b - 0.5 - (-a/b-0.5) = -a/b. 代入a/b得Dsub = dy/dx;

于是,我们有了Sub的处始值Sub1 = -a/b-0.5 = dy/dx-0.5,又有了Sub的差值的表达式Dsub = dy/dx -1 (当Sub1 > 0)或 dy/dx(当Sub1 < 0).细化工作完成。

于是pcode可以细化如下:

// Pcode for Bresenham Line
// By SoRoMan
x=x1;
y=y1;
dx = x2-x1;
dy = y2-y1;
Sub = dy/dx-0.5; // 赋初值,下个要画的点与中点的差值

DrawPixel(x, y); // 画起点
while(x<x2)
{
 x++;
 if(Sub > 0) // 下个要画的点为当前点的右上邻接点
 {
  Sub += dy/dx - 1; //下下个要画的点与中点的差值
  y++; // 右上邻接点y需增1
 }
 else// 下个要画的点为当前点的右邻接点
 {
  Sub += dy/dx; 
 }
// 画下个点
DrawPixel(x,y);
}

PS:一般优化:
为避免小数转整数以及除法运算,由于Sub只是用来进行正负判断,所以可以令Sub = 2*dx*Sub = 2dy-dx,则
相应的DSub = 2dy - 2dx或2dy.

思考1:如果Sub = 0时,会产生取两个点都可以的问题。这个问题还没深入。

 转载自:http://www.cnblogs.com/soroman/archive/2006/07/27/509602.html

 

 

Bresenham算法实现任意斜率直线绘制 参考《计算机图形学》 Donald.Hearn书中给出了斜率k在0-1之间的推导过程在k>=1时以y方向为单位步长递增,此时有x=(y-b)/b;d(low)=x-x(k)=( y(k+1)-b )/m-x(k);d(upper)=x(k+1)-x=x(k)+1-( y(k+1)-b )/m;p(k)=dx*(d(low)-d(upper))=2*dx*(y(k)+1-b)-2*dy*x(k)-dx;可以推出p(k+1)=p(k)+2*dx-2*dy(x(k+1)-x(k));其中x(k+1)-x(k)的值 阅读详情

相关推荐

Bresenham 画线算法推导过程

今天复习这个算法的时候,有一点没有立马反应过来,故特此记此篇博客作为备忘。 文章目录描点原理用 $p_i$ 代替 $d_1 - d_2$$p_i$ 递推如何确定 $p_1$ 呢?程序代码 描点原理 原理就是描实距离D点最近的那个点,距离的判断通过判断d1和d2的大小来确定。d1大,说明距离(xi+1,yi)(x_i + 1, y_i)(xi​+1,yi​)更远,要描实(xi+1,yi+1)(x_i...

在到处之间找我 1万+

Bresenham直线绘制算法详解

问题:已知起点p1(x1,y1)和终点p2(x2,y2),绘制直线段p1p2. Bresenham算法 (参考文章:https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html) 算法:对于斜率m∈[0,1],已知当前点,下一个点亦即增加1时,值取还是。 如图所示,红色直线表示理论直线,实际要绘制的直线过第一个点,ε为实际点和理论点的误差,这里需要根据该误差确定下一点的纵坐标取y还是y+1. 很明显,下一点的纵坐标的理.

Mei20140912的专栏 5658

Bresenham画线算法详解及其OpenGL编程实现

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://blog

mmqqyyqqyyq的博客 947

Bresenham算法斜率各种情况

Bresenham算法总结 注: 1、y(i+1)指的是y右下角标为i+1,yi指的是y右下角标为i 2、y=mx+b 3、△x,△y均为后减前 4、d1为(xi+1,yi)到直线的距离,d2为(xi+1,yi+/-1)到直线的距离 0<m<1 初始: p0=2△y-△x 当pk≥0时:x(i+1)=xi+1 y(i+1)=yi+1 p(i+1)=pi+2△y-2△x 否则:x(i+1)=xi+1 y(i+1)=yi

qq_51996925的博客 1558

Bresenham算法详解

Bresenham算法 一、思想 通过各行、各列像素中心构造一组虚拟网格线,按照直线起点到终点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。 二、推导 假设每次xxx增加111,yyy的递增(减)量为000或111,它取决于实际直线与最近光栅网格点的距离,这个距离的最大误差为0.50.50.5。 误差项ddd的初值d0=0d_0=0d0​=0,且 d=d+k      (0<k<1)

好学者的博客 7741

【计算机图形学|直线生成算法】中点画线法

中点画线法(Midpoint Line Algorithm)是一种画线(Line Drawing)算法,用来在计算机屏幕上绘制线条。它的基本思想是从线段的起点和终点出发,按照一定的规则向终点逐步逼近,并在途中以控制变量的方式得出每个像素点的坐标,从而绘制出所需的线条。具体实现中,中点画线法通过计算线段斜率的变化情况,来分为斜率小于1和大于等于1两种情况,并采用Bresenham的对称性原理,以中点的颜色来控制每个像素点的生长方向,从而获得较高的绘制效率和图像质量表现。

爱喝冰红茶的方舟的博客 1万+

Bresenham算法学习

Bresenham算法是DDA算法画线算法的一种改进算法。本质上它也是采取了步进的思想。不过它比DDA算法作了优化,避免了步进时浮点数运算,同时为选取符合直线方程的点提供了一个好思路。首先通过直线的斜率确定了在x方向进行单位步进还是y方向进行单位步进:当斜率k的绝对值|m|<1时,在x方向进行单位步进;当斜率k的绝对值|m|>1 时,在y方向进行单位步进。 下面以|m|<1 时推导Bresenham算法的数学依据: Bresenham-draw-line-a 请看上图,已知有一直线y=m

qq_52132912的博客 1570

WordPress主题开发实战:从零开始手把手教你创建自定义主题(含常用函数大全)

本文是一份WordPress主题开发实战指南,从零开始手把手教你创建自定义主题。内容涵盖主题核心文件结构、模板层级与循环机制、函数与钩子的运用,并附有详细的常用函数大全,帮助开发者彻底掌握主题开发的核心技能,实现从使用者到创造者的转变。

weixin_27943395的博客 255

DDA画线算法与Bresenham画线算法

文章目录DDA画线算法定义公式推导代码实现效果缺点Bresenham画线算法定义 DDA画线算法 定义 通过单位间隔来确定线段的点,默认间隔为1,如图: 此时,已知的点为(x0,y0),(xend,yend)(x_0,y_0), (x_{end},y_{end})(x0​,y0​),(xend​,yend​),假设yk与yk+1y_k与y_{k+1}yk​与yk+1​是两点连线上的点的纵坐标 公式...

秀玉轩晨的博客 2847

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 354

风光储互补微电网在偏远地区的应用实践:从建模到仿真全解析

本文深入解析了风光储互补微电网在偏远地区的应用实践,从系统设计到仿真建模全流程。通过Simulink等工具进行动态仿真,验证了系统在多种工况下的可靠性,并结合实际案例展示了其显著的经济和环保效益。文章为从业者提供了从技术路径到实施优化的全面指导。

weixin_29047545的博客 268

【计算机图形学】画线算法——Bresenham算法(任意斜率)(1)

Bresenham算法是一种高效的光栅化线段生成算法,通过整数增量运算精确绘制直线。其核心是决策参数计算,根据斜率分为x主导(|m|≤1)和y主导(|m|>1)两种情况。算法利用八重对称性处理全斜率,通过坐标变换统一到标准情形。C语言实现中,通过dx/dy比较确定主导轴,使用决策参数p的递推关系选择像素点。代码展示了通用实现和优化版本,后者通过误差项err实现更简洁的分支预测。测试结果验证了算法能正确绘制各方向直线。该算法避免了浮点运算,计算效率高,是计算机图形学中经典的线段生成方法。

地泽万物的博客 3万+

无痛安装及初始配置 PHP 8.0.3 + Apache 2.4 + MySQL 8.0

PHP 8.0.3 + Apache 2.4 + MySQL 8.0MySQL 8.0.23 安装下载安装配置环境变量初始化MySQLPHP8.0.3 安装下载安装配置环境变量Apache 2.4 安装下载安装启动 MySQL 8.0.23 安装 下载 到官方网站下载:https://dev.mysql.com/downloads/mysql/ 目前的最新版本是MySQL 8.0.23 在Windows上有两种安装方式,一个是zip压缩文件解压然后配置,另一个是图像化界面安装。 这里选择第一种方法安装:

Kuang Da's Blog 6208

直线绘制算法-Bresenham算法

该算法相较于其他直线绘制算法摆脱了直线方程式的使用,通过换元的思想实现整数加法的迭代。 一.Bresenham算法

SX2101111的博客 2万+

Arduino ESP8266通过 RF433数据收发实验

Arduino ESP8266通过 RF433射频模块实现数据收发实验 写这篇文章,折腾了2天,在没有成功之前,一直在摸索和采坑当中,不要问我黑暗和黎明之间有多长。开发很多时候只问结果,不问过程的,在这里分享来之不易的结果,希望后面的人不要采坑,有成功的案例先河,后面与之相关的应用开发只需要套用模板修改即可实现。 实物搭建 RF433模块 我使用的是这个:nodemcu 本案例开发所使用到的库:RadioHead:http://www.airspayce.com/mikem/

perseverance51博客 3804

基于Python的Steam游戏评论与销量数据爬取及预测分析

随着数字游戏市场的蓬勃发展,Steam作为全球最大的数字游戏分发平台,积累了海量的游戏数据与玩家行为数据。本文旨在通过Python网络爬虫技术,采集Steam平台的游戏基本信息、玩家评论数据及销量相关信息,为后续的游戏评论情感分析与销量预测模型构建提供数据支持。本文将详细介绍使用requestsselenium等库实现Steam数据爬取的全过程,并提供完整的代码实现与数据处理方法。关键词:Steam;Python爬虫;数据采集;评论分析;销量预测。

2201_76125261的博客 854

Bresenham画线算法的推导

转自:https://www.cnblogs.com/soroman/archive/2006/07/27/509602.html 以前看到Bresenham画线算法,直接拿来用,没有去推导它,近日,参考一些资料,特整理其算法推导过程如下。各位大虾如果知道其细节,赶紧闪过,不用浪费时间了。 基本上Bresenham画线算法的思路如下: // 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x...

kevin_org 1596

从0到1打造工业级上位机:通信协议到架构设计的实战全流程

作为一名在工控领域摸爬滚打十余年的开发者,前阵子刚帮一家新能源工厂完成了一套工业上位机系统的从0到1搭建。从最初和PLC通信联调时的“连不上、传错数”,到最终系统7×24小时稳定运行,踩过的坑、攒下的实战经验,今天就毫无保留地拆解给各位同行。这篇文章会从通信层、数据层、UI层到架构层逐层深入,全是工业现场验证过的干货,新手也能跟着落地。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 658

Bresenham算法原理及c代码实现各方向画线

写在前面 应用场景:Bresenham算法是图象图形学中的经典算法,在图形渲染、图像画线都会用到它,非常非常著名。 特点:原理简单(思想很伟大),计算高效,没有浮点型运算,很适合在硬件实现。 这样一个经典、强大的算法还是十分值得学习和记录的! 算法原理 从数学的角度,建立一个坐标系,当我们在坐标系中画一条线时,这条线上的值(坐标的连续的);但是计算机中的图像是以一个一个像素组成的,是一个又一个的小格子,那么在图像上已知起点和终点画一条线,这条线就是由一个一个格子组成的,Bresenham算法.

小武的博客 5356

基于STM32L4XX、HAL库的MAX13487EESA RS485总线收发器驱动程序设计

MAX13487EESA是一款3.3V供电的RS-485/RS-422收发器,由Maxim Integrated生产。PA4 (控制引脚) ---> /RE, DE (连接在一起)具有±15kV ESD保护的驱动器输出和接收器输入。半双工RS-485/RS-422通信。工业温度范围:-40°C至+85°C。工作电压范围:3.0V至3.6V。数据速率高达250kbps。

zhusl6688的博客 685

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Bresenham画线算法笔记

计算机图形学的三种直线扫描转换算法(摆烂版)

jluzhanghm1720的博客 1081

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【计算机图形学】画线算法——中点画线算法

相比于Breanham算法,中点画线算法更加直接。 中点算法的重要假设是,我们能绘出没有间隔的最细的直线。两对角像素之间的连接是没有间隔的。 一、中点画线算法原理 设线段端点为:(x1, y1),(x2, y2),∆x和∆y为水平和垂直偏移量 {∆y=y2−y1∆x=x2−x1 \left\{ \begin{array}{c} ∆y=y_2-y_1 \\ ∆x=x_2-x_1 \...

地泽万物的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机图形学之扫描转换直线-DDA,Bresenham,中点画线算法

1.DDA算法 DDA(Digital Differential Analyer):数字微分法 DDA算法思想:增量思想 公式推导: 效率:采用了浮点加法和浮点显示是需要取整 代码: void lineDDA(int x0, int y0, int x1, int y1, int color){ int x; float dy, dx, y, m; ...

3258

Bresenham画线K>1时的递归公式

算法1 k&gt;1 此时y增加1,x增加小于1,所以以y为主。 P1在直线的左方 假设直线上相邻两点S1,S2 ,S1.x &lt; S2.x, S1在屏幕上逼近P1,S2应该逼近哪个点呢? 假设P2.x = p1.x + 1 因为S2.x = S1.x + ∆x 因为P1.x &lt; S1.x &lt; p1.x + 0.5 所以p1.x + ∆x &lt; S1.x + ∆x...

gaoyi的专栏 4327

bresenham 算法

Bresenham画法是一种用于计算计算机图形中线条的算法,其原理是沿着所需绘制的线段中的像素点进行递增或递减,来进行准确的点阵绘制。实现该算法的关键在于确定像素在基准线上的位置,以及在每次迭代时进行相应的调整。该算法比传统的直线算法更快且更准确,在低速处理器和低效内存设备上尤其适用。Bresenham画法的思想可以拓展到曲线绘制、圆形绘制等其他图像绘制领域。本文主要是解析这里面描述的直线光栅化算法。个人见解,如有错误,请多交流。

weixin_44260382的博客 3119
上一篇: Bresenham 画线算法
下一篇: 常见内存泄露及解决方案
WaveDHW
博客等级 码龄20年 455粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值