Bresenham畫線算法

首先你的初中數(shù)學(xué)要過關(guān)#####

基本上Bresenham畫線算法的思路如下:
// 假設(shè)該線段位于第一象限內(nèi)且斜率大于0小于1闻葵,斜率在這個(gè)范圍內(nèi)屬于y坐標(biāo)點(diǎn)小于x坐標(biāo)點(diǎn)的情況湿滓,如果斜率大于1小于則屬于y坐標(biāo)點(diǎn)大于x坐標(biāo)點(diǎn)情況睛琳,根據(jù)對(duì)稱性,可推導(dǎo)至全象限內(nèi)的線段员舵。
// 設(shè)起點(diǎn)為(x1, y1),終點(diǎn)為(x2, y2)黄伊。

1.畫起點(diǎn)(x1, y1)号俐。
2.準(zhǔn)備畫下個(gè)點(diǎn)。x坐標(biāo)增1救欧,判斷如果達(dá)到終點(diǎn)衰粹,則完成。否則笆怠,由圖中可知铝耻,下個(gè)要畫的點(diǎn)要么為當(dāng)前點(diǎn)的右鄰接點(diǎn),要么是當(dāng)前點(diǎn)的右上鄰接點(diǎn)。
2.1.如果線段ax+by+c=0與x=x1+1的交點(diǎn)的y坐標(biāo)大于M點(diǎn)的y坐標(biāo)的話,下個(gè)點(diǎn)為U(x1+1,y1+1)
2.2.否則,下個(gè)點(diǎn)為B(x1+1,y1)
3.畫點(diǎn)(U或者B).
4.跳回第2步.
5.結(jié)束.

Bresenham算法主要思路說白了就是:下一個(gè)要畫的點(diǎn)該畫在哪里瓢捉,要么在斜邊频丘,要么在側(cè)邊。斜邊就是x坐標(biāo)加1的同時(shí)y坐標(biāo)也加1 泡态。側(cè)邊就是只加x或者只加y坐標(biāo)搂漠。要如何確定畫在哪個(gè)邊呢?因?yàn)橐阎瘘c(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)分別(x1, y1)某弦,(x2, y2)桐汤,所以可以確定這條線段的位置。最后根據(jù)要畫的這個(gè)點(diǎn)距離這個(gè)線段的位置的大小靶壮,來確定該畫在斜邊還是側(cè)邊怔毛。斜邊近就畫斜邊,側(cè)邊近就畫側(cè)邊腾降。

image

下面是求解思路
設(shè)線段方程:ax+by+c=0(x1<x<x2,y1<y<y2)
令dx=x2-x1,dy=y2-y1
則:斜率-a/b = dy/dx.

從第一個(gè)點(diǎn)開始拣度,我們有F(x,1,y1) = ax1+by1+c=0
下面求線段ax+by+c=0與x=x1+1的交點(diǎn):
由a(x1+1)+by+c = 0, 求出交點(diǎn)坐標(biāo)y=(-c-a(x1+1))/b
所以交點(diǎn)與M的y坐標(biāo)差值Sub1 = (-c-a(x1+1))/b - (y1+0.5) = -a/b-0.5,即Sub1的處始值為-a/b-0.5螃壤。

則可得條件當(dāng) Sub1 = -a/b-0.5>0時(shí)候,即下個(gè)點(diǎn)為U.
反之,下個(gè)點(diǎn)為B.
代入a/b,則Sub1 = dy/dx-0.5.

因?yàn)槭莻€(gè)循環(huán)中都要判斷Sub,所以得求出循環(huán)下的Sub表達(dá)式,我們可以求出Sub的差值的表達(dá)式.下面求x=x1+2時(shí)的Sub抗果,即Sub2
1.如果下下個(gè)點(diǎn)是下個(gè)點(diǎn)的右上鄰接點(diǎn),則
Sub2 = (-c-a(x1+2))/b - (y1+1.5) = -2a/b - 1.5
故Sub差值Dsub = Sub2 - Sub1 = -2a/b - 1.5 - (-a/b-0.5) = -a/b - 1.代入a/b得Dsub = dy/dx -1;
2.如果下下個(gè)點(diǎn)是下個(gè)點(diǎn)的右鄰接點(diǎn)奸晴,
Sub2 = (-c-a(x1+2))/b - (y1+0.5) = -2a/b - 0.5
故Sub差值Dsub = Sub2 - Sub1 = -2a/b - 0.5 - (-a/b-0.5) = -a/b. 代入a/b得Dsub = dy/dx;

于是冤馏,我們有了Sub的處始值Sub1 = -a/b-0.5 = dy/dx-0.5,又有了Sub的差值的表達(dá)式Dsub = dy/dx -1 (當(dāng)Sub1 > 0)或 dy/dx(當(dāng)Sub1 < 0).細(xì)化工作完成。

偽裝代碼如下:

x=x1;
y=y1;
dx = x2-x1;
dy = y2-y1;
Sub = dy/dx-0.5; // 賦初值蚁滋,下個(gè)要畫的點(diǎn)與中點(diǎn)的差值
DrawPixel(x, y); // 畫起點(diǎn)

while(x<x2)
{
  x++; 
  if(Sub > 0) // 下個(gè)要畫的點(diǎn)為當(dāng)前點(diǎn)的右上鄰接點(diǎn)
  {
    Sub += dy/dx - 1; //下下個(gè)要畫的點(diǎn)與中點(diǎn)的差值
    y++; // 右上鄰接點(diǎn)y需增1
  }
  else// 下個(gè)要畫的點(diǎn)為當(dāng)前點(diǎn)的右鄰接點(diǎn)
  {
    Sub += dy/dx;  
  }
  // 畫下個(gè)點(diǎn)
  DrawPixel(x,y);
}

PS:一般優(yōu)化: 為避免小數(shù)轉(zhuǎn)整數(shù)以及除法運(yùn)算宿接,由于Sub只是用來進(jìn)行正負(fù)判斷,所以可以令Sub = 2dxSub = 2dy-dx,則
相應(yīng)的DSub = 2dy - 2dx或2dy.

思考:如果Sub = 0時(shí)辕录,會(huì)產(chǎn)生取兩個(gè)點(diǎn)都可以的問題睦霎。這種情況可以任意隨機(jī)選一個(gè)點(diǎn),或者條件判斷上Sub >= 0 作為默認(rèn)條件取其一走诞。

Bresenham算法用途:
1圖像畫線的時(shí)候副女,可以讓線條更細(xì)膩,不會(huì)出現(xiàn)鋸齒蚣旱。
2游戲里碑幅,網(wǎng)格地圖中,當(dāng)人物走斜線的時(shí)候塞绿,用這個(gè)算法生成的行走路徑更合理些沟涨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市异吻,隨后出現(xiàn)的幾起案子裹赴,更是在濱河造成了極大的恐慌喜庞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棋返,死亡現(xiàn)場離奇詭異延都,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睛竣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門晰房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人射沟,你說我怎么就攤上這事殊者。” “怎么了躏惋?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵幽污,是天一觀的道長嚷辅。 經(jīng)常有香客問我簿姨,道長,這世上最難降的妖魔是什么簸搞? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任扁位,我火速辦了婚禮,結(jié)果婚禮上趁俊,老公的妹妹穿的比我還像新娘域仇。我一直安慰自己,他們只是感情好寺擂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布暇务。 她就那樣靜靜地躺著,像睡著了一般怔软。 火紅的嫁衣襯著肌膚如雪垦细。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天挡逼,我揣著相機(jī)與錄音括改,去河邊找鬼。 笑死家坎,一個(gè)胖子當(dāng)著我的面吹牛嘱能,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虱疏,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惹骂,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了做瞪?” 一聲冷哼從身側(cè)響起对粪,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后衩侥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體国旷,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年茫死,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跪但。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峦萎,死狀恐怖屡久,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爱榔,我是刑警寧澤被环,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站详幽,受9級(jí)特大地震影響筛欢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唇聘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一版姑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迟郎,春花似錦剥险、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至控乾,卻和暖如春么介,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阱持。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工夭拌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衷咽。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓鸽扁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镶骗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桶现,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 基于學(xué)生學(xué)習(xí)共同體培育語文生態(tài)課堂文化的研究 近年來,隨著現(xiàn)代教育理念的不斷深入與...
    火車頭123閱讀 1,988評(píng)論 0 8
  • 原文地址 我們一開始知道的有: 箭頭可以在線段開頭 也可以在結(jié)尾鼎姊,也可以兩端都有骡和。 我們希望指定一個(gè)角度θ相赁,見圖,...
  • 函數(shù)是高考數(shù)學(xué)的基礎(chǔ)休里,又是重難點(diǎn)蛆挫,今天老師把函數(shù)的八大問題都列出來了∶钍颍快點(diǎn)收藏和分享吧~ 一次函數(shù) 一悴侵、定義與定義...
    愛上陜西eee閱讀 869評(píng)論 0 2
  • 寶貝11個(gè)月啦,前段時(shí)間每天都媽媽媽媽的拭嫁,最近又開始爸爸爸爸可免,今天有點(diǎn)吃醋的跟寶貝說爸爸爸爸,居然對(duì)著我喊了聲媽媽...
    阿潔兒jawel閱讀 104評(píng)論 0 0
  • 積極的心態(tài)是每個(gè)成功人的希望支柱噩凹,消極心態(tài)卻是許多失敗者最強(qiáng)有力的殺手巴元。 1.積極的人像太陽毡咏,走到哪里哪里亮驮宴,消極...
    Fineyoga文雅閱讀 590評(píng)論 0 0