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,一经查实,立即删除!

相关文章

Python高级特性——迭代(Iteration)

Python高级特性——迭代&#xff08;Iteration&#xff09; 1、给定一个集合list或者tuple&#xff0c;可以通过for …… in ……的语法来实现循环遍历&#xff0c;这个循环我们就叫做迭代 迭代list&#xff1a; >>> m [haha,hehe,heihei,gaga] >>> for li …

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…

js-权威指南学习笔记7

第七章 数组 1、数组直接量的语法允许有可选的结尾的逗号&#xff0c;所以[ , , ]只有两个元素而非三个。 2、调用构造函数Array&#xff08;&#xff09;创建数组时&#xff0c;传入一个参数时表示指定数组的长度。 3、所有的索引都是属性名&#xff0c;但只有在0~2^32-2之间的…

[译]基于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]下…

Java 定时线程

功能需求&#xff1a;项目启动时&#xff0c;后天起一个定时线程&#xff0c;每个小时跑一次&#xff0c;查出数据发邮件出来。 主要使用 public void schedule(TimerTask task, long delay)task被安排在delay&#xff08;毫秒&#xff09;指定的时间后执行。 public void sche…

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

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

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

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

Android之webView打开http链接页面无法加载显示net:ERR_CLEARTEXT_NOT_PERMITTED

1、问题 适配Android13后&#xff0c;webView打开http链接提示错误如下 net:ERR_CLEARTEXT_NOT_PERMITTED2、原因 Android 9.0 默认使用加密连接&#xff0c;这意味着老旧项目在android 9.0 设备上运行&#xff0c;会遇到异常的情况。 3、解决办法 android:usesCleartextTr…

分享一个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 …

只让输入数字、字母、中文的输入框

1.输入框只能输入字母和下横线的正则表达式 <input type"text" onkeyup"this.valuethis.value.replace(/[^_a-zA-Z]/g,)" onpaste"this.valuethis.value.replace(/[^_a-zA-Z]/g,)"> 2.只能输入数字和英文 <input type"text" …

华为手机logcat不出日志解决方案

进入拨号界面输入&#xff1a;*#*#2846579#*#* 依次选择ProjectMenu---后台设置----LOG设置---LOG开关 点击打开转载于:https://www.cnblogs.com/liugangBlog/p/8058259.html

Android之启动奔溃提示异常java.lang.SecurityException: Permission Denial: startForeground

1 问题 适配Android高版本,启动奔溃,提示异常 java.lang.SecurityException: Permission Denial: startForeground from pid=1824, uid=10479 requires android.permission.FOREGROUND_SERVICEat android.os.Parcel.createException(Parcel.java: