Bresenham畫線算法完整代碼(python)

網(wǎng)上給的算法只能畫0-90°的線條(而且還不能水平和垂直線條),我寫的這個(gè)可以畫0-360°。。。調(diào)bug調(diào)了好久,現(xiàn)在分享給大家,但是沒有做線條越界圖片邊緣的截?cái)啵ㄎ依哿耍?,所以不要讓線條超越圖片大小,或者你改一下

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ì)算出來的y加個(gè)負(fù)號(hào)
        y_neg=True
        dy=-dy


    x = x1
    y = y1#從起點(diǎn)開始
    if(dx==0):#打豎畫線,向左走換了(x1,y1),(x2,y2),向下走沒有換,注意
        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):#打橫畫線
        while (x <= x2):
            img[x, y, color] = 200
            x+= 1
        return img
    else:
        k = dy /(1.0*dx)#斜率

    if (abs(k) <= 1):#畫橫斜線,|斜率|<=1
        sign_k = True  # 斜率標(biāo)記
        xend = x2
    else: #| 斜率|>1
        sign_k = False# 等會(huì)關(guān)于y=x對稱,計(jì)算|斜率|<=1的值,畫|斜率|>1的畫
        #先打橫了來算,畫的時(shí)候才對稱
        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
############開始畫線###################3

    b=y1-x1
    while ( x <= xend):
        if (sign_k == True):#畫橫斜線,|斜率|<=1
            if(y_neg==True):#向下走,畫橫線,只需要關(guān)于y=y0上下翻轉(zhuǎn)就好了
                #SetPixel(hDC, x, y, color);
                img[x, 2*y1-y, color] = 200#(x,-y)
            else:#向上走,畫橫線,最正常了
                img[x, y, color] = 200#(x,y)
        else :#畫豎斜線,|斜率|>1
            #SetPixel(hDC, y, x, color);
            if (y_neg == True):#畫豎斜線,又向下走,要先關(guān)于y=kx+b對稱,之后再關(guān)于y=y0上下翻轉(zhuǎn)
                # SetPixel(hDC, x, y, color);
                img[y-b,  2*y1-(x+b), color] = 200#(y,-x)
            else:#向上走,畫豎斜線,關(guān)于y=kx+b對稱
                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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容