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;yi??d0.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=d?0.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;yi??e0e<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=e?1

在這里插入圖片描述

消除浮點數的影響,斜率和 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(d?0.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(e?1)=xe?xe?=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.pswp.cn/news/284881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284881.shtml
英文地址,請注明出處:http://en.pswp.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: