1. 程式人生 > >生成直線的Bresenham演算法

生成直線的Bresenham演算法

  由於顯示直線的象素點只能取整數值座標,可以假設直線上第i個象素點座標為(xiyi),它是直線上點(xi,yi)的最佳近似,並且xi=xi(假設m<1),如下圖所示。那麼,直線上下一個象素點的可能位置是(xi+1,yi)或(xi+1,yi+1)。

  由圖中可以知道,在x=xi+1處,直線上點的y值是y=m(xi+1)+b,該點離象素點(xi+1,yi)和象素點(xi+1,yi+1)的距離分別是d1和d2

d1=y-yi=m(xi+1)+b-yi (2-8)
d2=(yi+1)-y=(yi+1)-m(xi+1)-b (2-9)

  這兩個距離差是

d1-d2=2m(xi+1)-2y
i+2b-1
(2-10)

  我們來分析公式(2-10):
  (1)當此值為正時,d1>d2,說明直線上理論點離(xi+1,yi+1)象素較近,下一個象素點應取(xi+1,yi+1)。
  (2)當此值為負時,d1<d2,說明直線上理論點離(xi+1,yi)象素較近,則下一個象素點應取(xi+1,yi)。
  (3)當此值為零時,說明直線上理論點離上、下兩個象素點的距離相等,取哪個點都行,假設演算法規定這種情況下取(xi+1,yi+1)作為下一個象素點。

  因此只要利用(d1-d2)的符號就可以決定下一個象素點的選擇。為此,我們進一步定義一個新的判別式:

pi=x×(d1-d2
)=2y·xi-2x·yi+c
(2-11)


  式(2-11)中的x=(x2-x1)>0,因此pi與(d1-d2)有相同的符號;

  這裡y=y2-y1m=y/x;c=2y+x(2b-1)。

  下面對式(2-11)作進一步處理,以便得出誤差判別遞推公式並消除常數c。

  將式(2-11)中的下標i改寫成i+1,得到:

pi+1=2y·xi+1-2x·yi+1+c (2-12)

  將式(2-12)減去(2-11),並利用xi+1=xi+1,可得:

pi+1= pi+2y-2x·(yi+1-yi) (2-13)

  再假設直線的初始端點恰好是其象素點的座標,即滿足:

y1=mx1+b (2-14)

  由式(2-11)和式(2-14)得到p1的初始值:

p1=2y-x (2-15)

  這樣,我們可利用誤差判別變數,得到如下演算法表示:

初始     p1=2y-x (2-16)
當pi≥0時: yi+1=yi+1,
      xi+1=xi+1,
      pi+1=pi+2(y-x)

否則:   yi+1=yi,
      xi+1=xi+1,
      pi+1=pi+2y

  從式(2-16)可以看出,第i+1步的判別變數pi+1僅與第i步的判別變數pi、直線的兩個端點座標分量差x和y有關,運算中只含有整數相加和乘2運算,而乘2可利用算術左移一位來完成,因此這個演算法速度快並易於硬體實現。

相關推薦

計算機圖形學實驗(二)—— 直線Bresenham演算法原始碼

 1. Bresenham演算法核心:(詳細原理見末尾) 理解光柵化:畫素點只能是整數點。 藉助決策變數 的正負號判斷下一個點座標,從而避免了計算直線斜率所用乘除法,只需要用加減法。 預設斜率絕對值在區間(0,1)時,即abs(dx)>abs(dy),步進方

直線生成演算法的實現:分別利用DDA演算法、中點Bresenham演算法和改進的Bresenham演算法掃描轉換直線段P1P2

直線生成演算法的實現:分別利用DDA演算法、中點Bresenham演算法和改進的Bresenham演算法掃描轉換直線段P1P2,其中P1為(0, 0), P2為(8, 6)。   // fhk.cpp : 定義控制檯應用程式的入口點。 // #include <iost

生成直線Bresenham演算法

  由於顯示直線的象素點只能取整數值座標,可以假設直線上第i個象素點座標為(xi,yi),它是直線上點(xi,yi)的最佳近似,並且xi=xi(假設m<1),如下圖所示。那麼,直線上下一個象素點的可能位置是(xi+1,yi)或(xi+1,yi+1)。   由圖中可以知道,在x=xi+1處,直線上點

Bresenham演算法直線

void Bresenham_line(CDC *pDC, int x0, int y0, int x1, int y1, long color) { int dx = abs(x1

計算機圖形學 學習筆記(一):概述,直線掃描轉換演算法:DDA,中點畫線演算法Bresenham演算法

前言 感謝中國農大 趙明老師的分享~ 現在我要為我自己走向遊戲程式設計打下基石~ 1 計算機圖形學概論 1.1 計算機圖形學課程簡介 《計算機圖形學》是計算機、地理資訊系統、應用數學、機械、建築等專業本科教學中的一門重要的專業基礎課 如影

openGL一之直線DDA,正負法,Bresenham演算法,圓弧正負法,Bresenham演算法

實驗目的: 1.  掌握OpenGL環境的配置方法。 2.  熟悉OpenGL應用程式基礎架構。 3.  熟練掌握簡單OpenGL應用程式的建立、除錯與執行。 4.  培養良好的程式設計習慣和風格,並且學習撰寫實驗報告。 實驗步驟與內容: 1. 實現直線的DDA演算法、

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)+

Cohen-Sutherland直線裁剪演算法

在二維觀察中,需要在觀察座標系下根據視窗大小對二維圖形進行裁剪(clipping),只將位於視窗內的圖形變換到視區輸出。直線段裁剪是二維圖形裁剪的基礎,裁剪的實質是判斷直線段是否與視窗相交,如相交則進一步確定直線段上位於視窗內的部分。 編碼原理 Cohen-Sutherland直

微信技術分享:微信的海量IM聊天訊息序列號生成實踐(演算法原理篇)

1、點評 對於IM系統來說,如何做到IM聊天訊息離線差異拉取(差異拉取是為了節省流量)、訊息多端同步、訊息順序保證等,是典型的IM技術難點。 就像即時通訊網整理的以下IM開發乾貨系列一樣: 《IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞》 《IM訊息送達保證機制實現(二

計算機圖形學實驗(一)--直線DDA演算法的實現

1. DDA演算法(數值微分法)原理:     1)網上或者計算機圖形學書本上有詳細介紹。     2)最核心的是選定(x2-x1)和(y2-y1)中較大者為步進方向。 2. 實現工具:     1) VS2017(C++)

計算機圖形常用演算法實現1 DDA,中點畫線法,bresenham演算法

打算手動實現圖形學中的絕大部分演算法。 執行環境winform+c# (程式碼是通用的,如果在其他地方畫圖,只需要替換掉畫點的函式即可) 我們的函式預設是按x座標順序遞增傳入的,因此在呼叫下面函式之前,需要保證p1.x<p2.x(可以減少討論數量) Point pp =

兩點間生成直線

using System.Collections; using System.Collections.Generic; using UnityEngine; public class LiangDianJianDeLianXian : MonoBehaviour {

中點Bresenham演算法掃描轉換圓心在原點, 半徑為8的圓;

#include <iostream> #include "stdio.h" #include <stdlib.h> #include <cmath> #include <gl/glut.h> using namespace std; void C

實驗3 直線裁剪演算法

1.實驗目的: 理解直線裁剪的基本原理; 驗證直線的編碼裁剪演算法,參考網路資料實現樑友棟-Barsky裁剪演算法; 瞭解與掌握OpenGL滑鼠操作。 2.實驗內容: 本次實驗主要結合滑鼠畫執行緒序來驗證編碼裁剪演算法和實現樑友棟-Barsky裁剪演算法,具

(飛歌工作筆記)分散式生成id--雪花演算法(snow)

雪花演算法簡單描述:  + 最高位是符號位,始終為0,不可用。  + 41位的時間序列,精確到毫秒級,41位的長度可以使用69年。時間位還有一個很重要的作用是可以根據時間進行排序。  + 10位的機器標識,10位的長度最多支援部署1024個節點。  + 12位的計數序列號,序

Bresenham 演算法詳解

這篇文章講的非常詳細,這裡列出幾點注意事項 1、bresenham的起始點是整數點,所有初始的 error值 由 y1 來計算, 即 m - 0.5 2、當error值大於0時,取了上面的點,A點變成了 y+1 上的A點,所以必須減去1 才能做正確判斷。具體參照下面內容的

字典序法生成全排列演算法的證明

/** * get the next permutation based on dictionary order method * * @param cur * @return next permutation string, or null if cur is the last */

opencv直線檢測直線提取演算法與總結

有些情況,  我們會需要提取直線的詳細引數, 下面介紹如何提取直線 霍夫變換(Hough Transformation) 其中很大一部分都在應用霍夫變換 及其 各種版本來提取直線      這裡個人總結下:  霍夫變換的基本思想,   將原本的平面曲線引數方程轉化成 ,

opengl實現cs、liang-barsky直線裁剪演算法

#include<glut.h> #include<iostream> #define L 00001 #define R 00002 #define B 00004 #define T 00010 #define M 00000 #define

常見分散式全域性唯一ID生成策略及演算法的對比

全域性唯一的 ID 幾乎是所有系統都會遇到的剛需。這個 id 在搜尋, 儲存資料, 加快檢索速度 等等很多方面都有著重要的意義。工業上有多種策略來獲取這個全域性唯一的id,針對常見的幾種場景,我在這裡進行簡單的總結和對比。 簡單分析一下需求 [1] 所謂全域性唯一的