您好,登錄后才能下訂單哦!
Bresenham算法是一開始用于圖形學(xué)中繪制直線。無論屏幕的分辨率多么的大,它始終都是由一個個的方形像素點組成的。在屏幕上繪制一條有角度的直線時,像素點并不會都落在直線上。對于直線上的點,需要一種算法算出最接近直線上的點或者說最適合的點。BresenHam算法就是其中一種算法。這個算法只會用到較為快速的整數(shù)加法、減法和位元移位,所以非常高效。
Bresenham算法一般也用于rpg手游或者其他需要尋路的手游。這類手游的地圖會被分成很小的格子(例如:32像素*32像素),利用工具,可以將地圖的阻擋區(qū)域標(biāo)出,然后導(dǎo)出地圖的配置文件(例如,json或者xml等)。
當(dāng)rpg手游的實體需要尋路的時候,第一步需要根據(jù)地圖的阻擋信息,計算出實體到目標(biāo)點是否可以直線通過,這個時候就需要用到bresenham算法。
本文只考慮直線斜率大于0并且小于1的情況。
先來看一種dda算法:
function dda(x0: number, y0: number, x1: number, y1: number) {
let output = [];
let k = (y1 - y0) / (x1 - x0);
let x = x0 + 1; //x初始值
while (x <= x1) {
let y = Math.floor(k * (x + 1) + 0.5);
output.push({ x: x, y: y });
x = x + 1;
}
return output;
}
代碼很少,但是運算中用到了浮點數(shù)的乘法和加法,不是一種高效的做法。
接著來看下bresenham算法的推導(dǎo)過程。
Bresenham算法有2種推導(dǎo)方法,如下圖所示:
為了簡單起見,設(shè),直線方程為y = kx,也就是以起始點為坐標(biāo)原點。
下面我們換另外一種推導(dǎo)方法。
1.設(shè)置變量d1,d2,Xi,Xi+1,Yi,Yi+1,Y,X,Hi,Hi+1
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。