使用python分别实现Bresenham算法以及wu反锯齿算法的直线光栅化。
import cv2
import numpy as np
import math
def BresenhamDrawLine(img,start,end):
# 1、输入线段的两个端点坐标和画线颜色:x1,y1,x2,y2,color;
# 2、设置象素坐标初值:x = x1,y = y1;
# 3、设置初始误差判别值:p = 2·Δy - Δx;
# 4、分别计算:Δx = x2 - x1、Δy = y2 - y1;
# 5、循环实现直线的生成:
# for (x=x1;x <= x2;x++)
# {putpixel(x, y, color) ;
# if (p >= 0)
# {y=y+1;
# p=p+2·(Δy-Δx);
# }
# else
# {p=p+2·Δy;
# }
# }
k = float(end[1] - start[1]) / (end[0] - start[0])
dy = end[1] - start[1]
dx = end[0] - start[0]
x = start[0]
y = start[1]
if k < 1:
p = 2*dy - dx
for x in range(start[0],end[0]):
img[x][y] = 255
if p >= 0:
y += 1
p += 2*(dy-dx)
else:
p += 2*dy
else:
p = 2*dx - dy
for y in range(start[1],end[1]):
img[x][y] = 255
if p >= 0:
x += 1
p += 2*(dx-dy)
else:
p += 2*dx
def WUAADrawLine(img,start,end):
k = float(end[1] - start[1]) / (end[0] - start[0])
if k < 1:
y = start[1]
for x in range(start[0],end[0]):
off = y - int(y)
img[x][int(y)] = (1-off)*255
img[x][int(y)+1] = off * 255
y += k
else:
k = float(end[0] - start[0])/(end[1] - start[1])
x = start[0]
for y in range(start[1],end[1]):
off = x - int(x)
img[int(x)][y] = (1-off)*255
img[int(x)+1][y] = off * 255
x += k
if __name__ == '__main__':
O = 0
S = 80
img = np.zeros((S+10,S+10), np.uint8)
ptStart = (O,O)
for i in range(1,9):
ptEnd = (int(O + S * math.cos(i*math.pi/18)),int(O + S * math.sin(i*math.pi/18)))
BresenhamDrawLine(img, ptStart, ptEnd)
# WUAADrawLine(img, ptStart, ptEnd)
cv2.namedWindow('result', cv2.WINDOW_NORMAL) # 窗口大小可以改变
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Bresenham算法
wuaa算法