Bresenham直线光栅算法

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()

【代吗运行结果】
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBoy@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值