網(wǎng)上給的算法只能畫(huà)0-90°的線(xiàn)條(而且還不能水平和垂直線(xiàn)條)茄厘,我寫(xiě)的這個(gè)可以畫(huà)0-360°蚁阳。。。調(diào)bug調(diào)了好久户秤,現(xiàn)在分享給大家码秉,但是沒(méi)有做線(xiàn)條越界圖片邊緣的截?cái)啵ㄎ依哿耍圆灰尵€(xiàn)條超越圖片大小鸡号,或者你改一下
def BresenhamLine(img,x1, y1, x2, y2, color):
y_neg = False
dx = x2 - x1
if (dx < 0):#向左走转砖,就將起點(diǎn)終點(diǎn)調(diào)換
temp = x2
x2 = x1
x1 = temp
temp = y2
y2 = y1
y1 = temp
dx = x2 - x1 # 重新計(jì)算dx
dy = y2 - y1
if (dy < 0): # 向下走,就將計(jì)算出來(lái)的y加個(gè)負(fù)號(hào)
y_neg=True
dy=-dy
x = x1
y = y1#從起點(diǎn)開(kāi)始
if(dx==0):#打豎畫(huà)線(xiàn),向左走換了(x1,y1),(x2,y2),向下走沒(méi)有換鲸伴,注意
y=min(y1,y2)
y_end=max(y1,y2)
while(y<=y_end):
img[x, y, color] = 200
y+=1
return img
elif(dy==0):#打橫畫(huà)線(xiàn)
while (x <= x2):
img[x, y, color] = 200
x+= 1
return img
else:
k = dy /(1.0*dx)#斜率
if (abs(k) <= 1):#畫(huà)橫斜線(xiàn)府蔗,|斜率|<=1
sign_k = True # 斜率標(biāo)記
xend = x2
else: #| 斜率|>1
sign_k = False# 等會(huì)關(guān)于y=x對(duì)稱(chēng),計(jì)算|斜率|<=1的值,畫(huà)|斜率|>1的畫(huà)
#先打橫了來(lái)算,畫(huà)的時(shí)候才對(duì)稱(chēng)
xend = x1+dy
temp=dy
dy=dx
dx=temp
k = dy / (1.0*dx)# 斜率
p = 2 * dy - dx#P0 = 2*dy - dx
v = 2 * dy
u = p - dx#Pk+1 = Pk + 2*dy - 2*dx,u 表示 2*dy - 2*dx
############開(kāi)始畫(huà)線(xiàn)###################3
b=y1-x1
while ( x <= xend):
if (sign_k == True):#畫(huà)橫斜線(xiàn)汞窗,|斜率|<=1
if(y_neg==True):#向下走姓赤,畫(huà)橫線(xiàn),只需要關(guān)于y=y0上下翻轉(zhuǎn)就好了
#SetPixel(hDC, x, y, color);
img[x, 2*y1-y, color] = 200#(x,-y)
else:#向上走,畫(huà)橫線(xiàn),最正常了
img[x, y, color] = 200#(x,y)
else :#畫(huà)豎斜線(xiàn)仲吏,|斜率|>1
#SetPixel(hDC, y, x, color);
if (y_neg == True):#畫(huà)豎斜線(xiàn)不铆,又向下走,要先關(guān)于y=kx+b對(duì)稱(chēng)裹唆,之后再關(guān)于y=y0上下翻轉(zhuǎn)
# SetPixel(hDC, x, y, color);
img[y-b, 2*y1-(x+b), color] = 200#(y,-x)
else:#向上走誓斥,畫(huà)豎斜線(xiàn),關(guān)于y=kx+b對(duì)稱(chēng)
img[y-b, x+b, color] = 200#(y,x)
if (p>0):
y+=1
p = p + u
#cout << "1 ";
else:
p = p + v
#//cout << "0 ";
x+=1
return img