此時y增加1,x增加小於1,所以以y為主。
假設直線上相鄰兩點s1,s2 ,s1.x < s2.x, s1在螢幕上逼近p1,s2應該逼近哪個點呢?
假設p2.x = p1.x + 1
因為s2.x = s1.x + ∆x
因為p1.x < s1.x < p1.x + 0.5
所以p1.x + ∆x < s1.x + ∆x所以p1.x + ∆x < s2.x因為 0<∆x<1,所以s2最小逼近p1,最大逼近p2.
假設直線上相鄰兩點s1,s2 ,s1.x < s2.x, s1在螢幕上逼近p1,s2應該逼近哪個點呢?
假設p2.x = p1.x + 1
因為s2.x = s1.x + ∆x
因為p1.x -0.5 < s1.x < p1.x
所以p1.x + 0.5 + ∆x < s1.x + ∆x < p1.x +∆x
所以p1.x + 0.5 + ∆x < s2.x因為 0<∆x<1,所以s2最小逼近p1,最大逼近p2.
假設直線上相鄰兩點s1,s2 ,s1.x < s2.x, s1在螢幕上逼近p1,s2應該逼近哪個點呢?
假設p2.x = p1.x + 1
因為s2.x = s1.x + ∆x
因為s1.x = p1.x,所以
s2.x = p1.x + ∆x
因為 0<∆x<1,所以s2最小逼近p1,最大逼近p2.
通過前面的論證,我們可以得知:
給定一條直線y=kx+b,k>1時,假設直線上前面逼近螢幕的點為p1,那麼下乙個逼近點p2,
滿足:p2.x = p1.x 或者 p2.x = p1.x + 1
p2.y = p1.y + 1
設dl = 1/k * (p1.y+1) -b/k - p1.x
dr = p1.x + 1 - (1/k * (p1.y+1) -b/k)
dl - dr = 1/k * (p1.y+1) -b/k - p1.x - p1.x - 1 + (1/k * (p1.y+1) -b/k) = 2/k*(p1.y+1) - 2b/k - 2p1.x - 1
∆y(dl-dr) = 2∆x*(p1.y+1) - 2b∆x - (2p1.x-1)*∆y
因為b = p1.y - k*p1.x,所以
2b∆x = 2∆xp1.y - 2p1.x∆y
所以:∆y(dl-dr) = 2∆x + ∆y,因此初始值d=2∆x + ∆y
下面推導d的遞推關係:
設dk = 2∆x*(pk.y+1) - 2b∆x - (2pk.x-1)*∆y
dk+1 - dk = 2∆x*(pk+1.y+1) - 2b∆x - (2pk+1.x-1)*∆y - 2∆x*(pk.y+1) + 2b∆x + (2pk.x-1)*∆y
=2∆x -∆y*(2pk+1.x - 2pk.x)
= 2∆x - 2∆y(pk+1.x - pk.x)
所以:dk+1 = dk + 2∆x - 2∆y(pk+1.x - pk.x)
所以當dk > 0 ,dk+1 = dk + 2∆x - 2∆y
當dk <= 0,dk+1 = dk + 2∆x
給定一條直線y=kx+b,k>1,直線上兩點s,e,公式如下:
設d初 = 2∆x + ∆y
dk+1 = dk + 2∆x - 2∆y (dk > 0)
dk+1 = dk + 2∆x (dk <= 0)
K 1 棋盤問題
在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。input 輸入含有多組測試資料。每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將...
筆記 Bresenham畫線演算法的推導
基本上bresenham畫線演算法的思路如下 假設該線段位於第一象限內且斜率大於0小於1,設起點為 x1,y1 終點為 x2,y2 根據對稱性,可推導至全象限內的線段.1.畫起點 x1,y1 2.準備畫下個點。x座標增1,判斷如果達到終點,則完成。否則,由圖中可知,下個要畫的點要麼為當前點的右鄰接點...
關於對Bresenham畫線演算法的理解
最近一段時間想理解一下bresenham演算法,總結出以下心得.假設線性方程 ax by c 0 x 1 x x 2,y 1 y y 2 dx x 2 x 1dy y 2 y 1當x x 1 1 ax1 by 1 c 0 1 1 a x1 1 by c 0 1 2 從1 1和1 2可以得出,y c ...