Bresenham直线光栅算法实现。
【题目描述】用自己熟悉的绘图程序实现Bresenham光栅直线算法,绘制如下的图形。
【Bresenham直线光栅算法基本原理】
假定直线的斜率k在0~1之间。此时,只需考虑x方向每次递增1个单位,决定y方向每次递增0或1。设直线的当前点为(xi,y),对应的当前光栅点为(xi,yi),对于直线为k的直线,易知线上下一个点应该为(xi+1,yi+k),则直线的光栅点为(xi+1,yi)或者(xi+1,yi+1)其中yi是否加一取决于直线与它垂直方向最近的下光栅点的误差d,d的计算方法为其中y+k为直线上xi+1位置对应的纵坐标,yi为xi处对应的纵坐标。
【环境说明】
操作系统:window10
编程语言:python
所用环境:python 3.7.8
所用平台:pycharm
其他支持:turtle绘图库
【代码实现】
import turtle
turtle.screensize(1200, 1200)
turtle.bgcolor('white')
color_list = ['yellow', 'red', 'black', 'cyan', 'magenta', 'green', 'pink', 'tomato']
xe = 0
ye = -300
color_i = 0
def line(x, y, color):
turtle.goto(0, 0)
turtle.tracer(0)
turtle.pencolor(color)
x = int(x)
y = int(y)
xs = 0
ys = 0
if x == 0:
ex = 0
ey = abs(y)/y
elif y == 0:
ey = 0
ex = abs(x)/x
else:
ex = abs(x)/x
ey = abs(y)/y
if abs(y)>abs(x):
ne = 2*abs(x)-abs(y)
f = 1
for i in range(0, abs(y)):
turtle.pd()
if ne >= 0:
ys += ey
xs += ex
ne -= 2*abs(y)
else:
ys += ey
turtle.goto(x,y)
ne += 2 * abs(x)
else:
f = 0
ne = 2*abs(y)-abs(x)
for i in range(0, abs(x)):
turtle.pd()
if ne >= 0:
ys += ey
xs += ex
ne -= 2*abs(x)
else:
xs += ex
turtle.goto(xs, ys)
ne += 2 * abs(y)
turtle.pu()
for j in range(0, 360, 5):
color_i = color_i % 72
color = color_list[color_i//9]
turtle.pu()
turtle.goto(xe, ye)
turtle.circle(300, 5)
line(turtle.xcor(), turtle.ycor(), color)
xe = turtle.xcor()
ye = turtle.ycor()
color_i += 1
turtle.done()
【代吗运行结果】