Bresenham 算法

1965 年,Bresenham 为数字绘图仪开发了一种绘制直线的算法,该算法同样使用于光栅扫描显示器,被称为 Bresenham 算法。

原理

算法的目标是选择表示直线的最佳光栅位置。Bresenhan 算法在主位移方向上每次递增一个单位。另一个方向的增量为 0 或 1,取决于理想直线于最近网格点的距离,这一距离称为误差项,误差项用 d 表示。

在这里插入图片描述

x x x 方向递增一个单位,有 d = d + k d = d+ k d=d+k; 则

y i + 1 = { y i + 1 ; d ≥ 0.5 y i d < 0.5 y_{i+1} = \begin{cases} y_i + 1; &\quad d \geq 0.5\\ y_i &\quad d < 0.5 \end{cases} yi+1={yi+1;yid0.5d<0.5
误差项初始值 d 0 = 0 d_0 = 0 d0=0, 如果 d ≥ 0.5 d \geq 0.5 d0.5 y y y 方向递增一个单位并且将 d d d 减 1.

在这里插入图片描述
消除 0.5 的影响

e = d − 0.5 e = d -0.5 e=d0.5. 当 x x x 方向走一步,有 e = e + k e = e + k e=e+k, 则

y i + 1 = { y i + 1 ; e ≥ 0 y i e < 0.5 y_{i+1} = \begin{cases} y_i + 1; &\quad e \geq 0\\ y_i &\quad e < 0.5 \end{cases} yi+1={yi+1;yie0e<0.5

e 0 = − 0.5 e_0 = -0.5 e0=0.5 , 如果 e ≥ 0 e \geq 0 e0, 则 e = e − 1 e = e -1 e=e1

在这里插入图片描述

消除浮点数的影响,斜率和 e e e, 进行整数化

0 ≤ k ≤ 1 0 \leq k \leq 1 0k1 Δ x \Delta x Δx 为正
e = 2 Δ x e = 2 Δ x ( d − 0.5 ) = − Δ x + 2 Δ x d e = 2 \Delta x e = 2 \Delta x (d-0.5) = -\Delta x + 2 \Delta x d e=xe=x(d0.5)=Δx+xd
初始值 e 0 = − Δ x e_0 = -\Delta x e0=Δx
当 x 方向走一步,有 e + = 2 Δ y e += 2 \Delta y e+=y

如果 e ≥ 0 e \geq 0 e0

e = 2 Δ x ( e − 1 ) = 2 Δ x e − 2 Δ x e − = 2 Δ x e = 2 \Delta x (e-1) = 2 \Delta x e - 2 \Delta x \\ e -= 2 \Delta x e=x(e1)=xexe=x

算法

  • 设置像素点的颜色
  • 读入直线的两个端点坐标
  • e e e 的初始值为 e 0 = − 0.5 e_0 = -0.5 e0=0.5
  • 从起点开始,沿着 x x x 轴方向每递增一个单位,有 e + = 2 Δ y e += 2 \Delta y e+=y
  • ≥ 0 \geq 0 0 时,下一个像素更新为 ( x i + 1 , y i + 1 ) (x_i + 1, y_i + 1) (xi+1,yi+1), 同时将 e e e 更新为 e − = 2 Δ x e -= 2 \Delta x e=x, 否则,下一个像素更为 ( x i + 1 , y i + 1 ) (x_i + 1, y_i +1) (xi+1,yi+1)
  • 绘制像素点,执行 x + + x++ x++ 操作到终点
void BresenhamLine(CDC* pDC, CPoint P0, CPoint P1)
{COLORREF crColor = RGB(0, 0, 0);int dx = P1.x - P0.x;int dy = P1.y - P0.y;int e = - dx;for (int x=P0.x, y=P0.y; x < P1.x; x++) {pDC->SetPixelV(x, y, crColor);e += 2 * dy;if (e >= 0) {y++;e -= 2 * dx;}}
}

整数 Bresenham 算法是一种经典的直线光栅化算法, 使用了最小的计算量,使得单点生成算法已经没有改进的余地。

参考 《计算几何算法与实现》孔令德

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ML.NET 更新

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;5分钟)ML.NET是一款面向.NET开发人员的开源&#xff0c;跨平台机器学习框架&#xff0c;可以将自定义机器学习集成到.NET应用中。我们很开心地向您介绍我们在过去几个月中所做的工作。ML.NET:https://dotnet.microsof…

Andriod之提示java.lang.SecurityException: getDataNetworkTypeForSubscriber导致程序奔溃

1、问题 修改targetSdkVersion 33 适配Android13后4G网络环境被其它app拉起来提示这个异常 2、原因 我们定位到代码在这行函数 telephonyManager.getNetworkType()Android11 的权限有关,由于缺少该权限导致无法访问接口而提示安全异常 3、解决办法 方法1:我们直接申请RE…

[译]基于GPU的体渲染高级技术之raycasting算法

[译]基于GPU的体渲染高级技术之raycasting算法 PS&#xff1a;我决定翻译一下《Advanced Illumination Techniques for GPU-Based Volume Raycasting》。像我翻译其他资料一样&#xff0c;只按我的需要和观点来翻译。有的部分详细翻译&#xff0c;附加注解&#xff0c;有的部分…

【GIS风暴】什么是地理空间智能(Geospatial AI)?

人工智能(Artificial Intelligence,AI)已经成为新技术革命下一阶段的热词,也成为未来产业的驱动力量。使用智能算法,数据分类和智能预测、分析,AI在很多领域将有一系列的工具来帮助解决问题。 将AI用于GIS这一具体的领域的分析、方法和解决方案,就叫地理空间智能(Geos…

JavaScript 清除图片背景颜色 使之透明

主要JS /**清除图片背景颜色 **/ function removeImgBg(img) {//背景颜色 白色const rgba [255, 255, 255, 255];// 容差大小const tolerance 60;var imgData null;const [r0, g0, b0, a0] rgba;var r, g, b, a;const canvas document.createElement(canvas);const cont…

day01基础部分

一、python是什么样的语言 1、编译型语言和解释型语言&#xff0c;python是解释型语言 1.1、编译型语言就是把源程序代码一次性翻译成机器码&#xff08;计算机可识别的代码&#xff09;&#xff0c;然后交给计算机去运行&#xff0c;一般需经过编译&#xff08;compile&#x…

WPF 制作 Windows 屏保

分享如何使用WPF 制作 Windows 屏保WPF 制作 Windows 屏保作者&#xff1a;驚鏵原文链接&#xff1a;https://github.com/yanjinhuagood/ScreenSaver框架使用.NET452&#xff1b;Visual Studio 2019;项目使用 MIT 开源许可协议&#xff1b;更多效果可以通过GitHub[1]|码云[2]下…

Windows 7 下右键发送到菜单项没了

为什么80%的码农都做不了架构师&#xff1f;>>> 问题描述: 突然有一天,Windows 7 下右键发送到菜单项没了,如图所示: 问题原因 黑人问号脸? 转载于:https://my.oschina.net/taadis/blog/1591398

【ArcGIS微课1000例】0016:ArcGIS书签操作(添加书签、管理书签)知多少?

书签可以将地图数据的某一视图状态保存起来,以便在使用时打开书签,直接回到这一视图状态。可创建多个书签以便快速回到不同的视图状态,也可以对书签进行管理。 文章目录 1 创建书签2 管理书签注意:书签只针对空间数据,在【布局视图】中是不能创建书签的。 1 创建书签 可…

分享一个WPF 实现 Windows 软件快捷小工具

分享一个WPF 实现 Windows 软件快捷小工具Windows 软件快捷小工具作者&#xff1a;WPFDevelopersOrg原文链接&#xff1a;https://github.com/WPFDevelopersOrg/SoftwareHelper框架使用.NET40&#xff1b;Visual Studio 2019;项目使用 MIT 开源许可协议&#xff1b;项目使用 MV…

学习环境配置:Manjaro、MSYS2以及常见软件

0.前言 在说Manjaro之前&#xff0c;要先说一下Linux发行版。对于各大发行版而言&#xff0c;内核只有版本的差异&#xff0c;最重要的区别就是包管理系统。常见的包管理系统包括&#xff1a;Pacman&#xff0c;Apt , Yum和Portage。在学习Linux的过程中&#xff0c;和大数人一…

【ArcGIS微课1000例】0017:ArcGIS测量距离和面积工具的巧妙使用

文章目录 1 交互式测量2 测量要素ArcGIS提供了快速测量距离和面积的工具,通过测量工具可对地图中的线和面进行测量。 工具条: 测量工具位于【工具】工具条上,如下图所示: 测量界面: 功能按钮简介: 可使用此工具在地图上绘制一条线或者一个面,然后获取线的长度与面的面…

[转]HTTP/3 未来可期?

2015 年 HTTP/2 标准发表后&#xff0c;大多数主流浏览器也于当年年底支持该标准。此后&#xff0c;凭借着多路复用、头部压缩、服务器推送等优势&#xff0c;HTTP/2 得到了越来越多开发者的青睐&#xff0c;不知不觉的 HTTP 已经发展到了第三代。本文基于兴趣部落接入 HTTP/3 …

【ArcGIS微课1000例】0018:ArcGIS设置相对路径和数据源

文章目录 ArcGIS设置相对路径ArcGIS设置数据源ArcGIS设置相对路径 菜鸟们在使用ArcGIS时经常会碰到将地图文档(.mxd)拷贝到别的电脑上或改变一个路径时,出现数据丢失的现象,具体表现为图层前面出现一个红色的感叹号,如下图所示。 出现以上问题的根本原因是数据GSS.tif的原…

AI 之 OpenCvSharp 安卓手机摄像头识别人脸

OpenCvSharp是OpenCv的包装器&#xff0c;相当于底层是OpenCv只是用.Net的方式调用底层的接口的实现&#xff0c;所以&#xff0c;从OpenCv的知识架构来讲&#xff0c;源码是一样一样的。就是换个语言写而已。1. OpenCvSharp 尽可能地以原生 OpenCV C/C API 风格为蓝本。2. Ope…

iVX低代码平台系列制作APP简单的个人界面

一、前言 我们知道&#xff0c;目前市场上开发app或者小程序这些应用&#xff0c;都离不开一个个人界面&#xff0c;就是类似下面的这种界面&#xff0c;我们可以利用iVX低代码平台来开发&#xff0c;简单快速&#xff0c;如果还有不知道iVX低代码平台是啥的&#xff0c;猛戳这…

[转]【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

前言 很多小伙伴反馈说&#xff0c;高并发专题学了那么久&#xff0c;但是&#xff0c;在真正做项目时&#xff0c;仍然不知道如何下手处理高并发业务场景&#xff01;甚至很多小伙伴仍然停留在只是简单的提供接口&#xff08;CRUD&#xff09;阶段&#xff0c;不知道学习的并发…

【ArcGIS微课1000例】0019:什么是Shapefile文件?Shapefile文件之全解

文章目录 Shapefile文件组成Shapefile文件创建Shapefile文件大小限制Shapefile文件注意事项ESRI Shapefile(shp),或简称shapefile,是美国环境系统研究所公司(ESRI)开发的一种空间数据开放格式。该文件格式已经成为了地理信息软件界的一个开放标准,这表明ESRI公司在全球的…

扼杀 304,Cache-Control: immutable

随着近些年社交网站的流行&#xff0c;越来越多的人学会了“刷”网页 ── 刷微博&#xff0c;刷朋友圈&#xff0c;刷新闻&#xff0c;刷秒杀页。这里的“刷”&#xff0c;就是刷新的意思&#xff0c;在浏览器里&#xff0c;你可以通过点击刷新按钮&#xff0c;或者用快捷键&a…

Eolink是国产API接口管理的无冕之王

一、传统API接口管理的缺陷 1、前言 项目开发我们都知道在一个项目团队中是由很多角色组成&#xff0c;最常见团队的就是前端开发工程师、客户端开发工程师、服务端开发工程师组成一个团队&#xff0c;团队之间进行合作&#xff0c;一般我们都离不开API接口管理和测试&#x…