• python之海龟绘图


    1. 基本功能介绍

    在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟,我们可以绘制出令人惊奇的图片。使用海龟作图,我们不仅能够只用几行代码就创建出令人印象深刻的视觉效果,而且还可以跟随海龟看看每行代码如何影响到它的移动。这能够帮助我们理解代码的逻辑。所以海龟作图也常被用作新手学习 Python 的一种方式。

    1.1 Turtle motion (运动控制)

    本节中包含了 运动控制 中常用的一些函数

    turtle.goto(x,y)

    画笔定位到坐标(x,y)

    turtle.forward(distance)

    向正方向运动 distance 长的距离

    turtle.backward(distance)

    向负方向运动 distance 长的距离

    turtle.right(angle)

    向右偏 angle 度

    turtle.left(angle)

    向左偏 angle 度

    turtle.home()

    回到原点

    turtle.circle(radius, extent=None, steps=None)

    画圆形 radius 为半径,extent 为圆的角度

    turtle.speed(speed)

    以 speed 速度运动

    看到这么多函数肯定已经头大了,我们以例题来讲解。
    首先画一个边长为100的正方形,然后再以半径为50画出其3/4圆。

    # 控制画笔的速度
    turtle.speed(5)
    # 将画笔定位到原点
    turtle.goto(0,0)
    # 从原点开始,画出一个边长为100的正方形
    for i in range(4):
        # 正向运动 100 的距离
        turtle.forward(100)
        # 向右偏 90 度
        turtle.right(90)
    
    # 将画笔定位到原点
    turtle.home()
    # 画出一个半径为100,占3/4的圆
    turtle.circle(50,270)

    结果:

    1.2 Pen control (画笔控制)

    本节包含了对画笔的控制函数,常用的如下:

    turtle.pendown()

    落笔,在此状态下会画出运动的轨迹

    turtle.pendown()

    起笔,在此状态下不会画出运动的轨迹

    turtle.pensize(width=None)

    画笔粗细

    turtle.pencolor(*args)

    画笔颜色

    turtle.fillcolor(*args)

    填充颜色

    turtle.begin_fill()

    开始填充

    turtle.end_fill()

    结束填充

    turtle.write(arg, move=False, align=”left”, font=(“Arial”, 8, “normal”))

    写文字

    同样,我们以一个例题来讲解。
    画一个正方形并填充,最后写一些文字

    # 控制画笔颜色
    turtle.pencolor('red')
    # 落笔
    turtle.pendown()
    # 设置填充颜色
    turtle.fillcolor('blue')
    # 开始填充
    turtle.begin_fill()
    # 从原点开始,画出一个边长为100的正方形
    for i in range(4):
        # 正向运动 100 的距离
        turtle.forward(200)
        # 向右偏 90 度
        turtle.right(90)
    # 结束填充
    turtle.end_fill()
    turtle.penup()
    turtle.goto(100,-100)
    turtle.write('Crossin编程教室')

    最后的结果是这样
    这里写图片描述

    同时,我们还可以设置画笔打粗细、画笔的速度等属性,

    1.3 Window control (视窗控制)

    这里有两个常用的函数

    turtle.bgcolor(*args)

    设置背景颜色

    turtle.bgpic(picname=None)

    背景图片填充
    设置代码如下

    turtle.bgcolor('red')
    turtle.bgpic(r'yourpic.png')

    2. 海龟绘图实例

    我们用几个简单的例子讲解海龟绘图的用法。

    2.1 用正方形画圆

    import turtle
    for i in range(360):
        turtle.setheading(i)
        for i in range(4):
            turtle.forward(100)
            turtle.left(90)

    360 个正方形每隔 1 度排列,短短几行代码可以生成一个漂亮规则的图形。

    这里写图片描述

    2.2 红色的五角星

    使用填充功能画出一个大红星

    import turtle
    turtle.color('red','red')
    turtle.begin_fill()
    for i in range(5):
        turtle.forward(100)
        turtle.right(144)
    turtle.end_fill()

    结果如图:

    这里写图片描述

    动态时钟

    # coding=utf-8
     
    import turtle
    from datetime import *
     
    # 抬起画笔,向前运动一段距离放下
    def Skip(step):
        turtle.penup()
        turtle.forward(step)
        turtle.pendown()
     
    def mkHand(name, length):
        # 注册Turtle形状,建立表针Turtle
        turtle.reset()
        Skip(-length * 0.1)
        # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
        turtle.begin_poly()
        turtle.forward(length * 1.1)
        # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
        turtle.end_poly()
        # 返回最后记录的多边形。
        handForm = turtle.get_poly()
        turtle.register_shape(name, handForm)
     
    def Init():
        global secHand, minHand, hurHand, printer
        # 重置Turtle指向北
        turtle.mode("logo")
        # 建立三个表针Turtle并初始化
        mkHand("secHand", 135)
        mkHand("minHand", 125)
        mkHand("hurHand", 90)
        secHand = turtle.Turtle()
        secHand.shape("secHand")
        minHand = turtle.Turtle()
        minHand.shape("minHand")
        hurHand = turtle.Turtle()
        hurHand.shape("hurHand")
       
        for hand in secHand, minHand, hurHand:
            hand.shapesize(1, 1, 3)
            hand.speed(0)
       
        # 建立输出文字Turtle
        printer = turtle.Turtle()
        # 隐藏画笔的turtle形状
        printer.hideturtle()
        printer.penup()
        
    def SetupClock(radius):
        # 建立表的外框
        turtle.reset()
        turtle.pensize(7)
        for i in range(60):
            Skip(radius)
            if i % 5 == 0:
                turtle.forward(20)
                Skip(-radius - 20)
               
                Skip(radius + 20)
                if i == 0:
                    turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
                elif i == 30:
                    Skip(25)
                    turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
                    Skip(-25)
                elif (i == 25 or i == 35):
                    Skip(20)
                    turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
                    Skip(-20)
                else:
                    turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
                Skip(-radius - 20)
            else:
                turtle.dot(5)
                Skip(-radius)
            turtle.right(6)
            
    def Week(t):   
        week = ["星期一", "星期二", "星期三",
                "星期四", "星期五", "星期六", "星期日"]
        return week[t.weekday()]
     
    def Date(t):
        y = t.year
        m = t.month
        d = t.day
        return "%s %d%d" % (y, m, d)
     
    def Tick():
        # 绘制表针的动态显示
        t = datetime.today()
        second = t.second + t.microsecond * 0.000001
        minute = t.minute + second / 60.0
        hour = t.hour + minute / 60.0
        secHand.setheading(6 * second)
        minHand.setheading(6 * minute)
        hurHand.setheading(30 * hour)
        
        turtle.tracer(False) 
        printer.forward(65)
        printer.write(Week(t), align="center",
                      font=("Courier", 14, "bold"))
        printer.back(130)
        printer.write(Date(t), align="center",
                      font=("Courier", 14, "bold"))
        printer.home()
        turtle.tracer(True)
     
        # 100ms后继续调用tick
        turtle.ontimer(Tick, 100)
     
    def main():
        # 打开/关闭龟动画,并为更新图纸设置延迟。
        turtle.tracer(False)
        Init()
        SetupClock(160)
        turtle.tracer(True)
        Tick()
        turtle.mainloop()
     
    if __name__ == "__main__":
        main()

     结果是一个动态的时钟,下图只是一个截图

  • 相关阅读:
    Dubbo使用
    JVM内存分配及GC简述
    深入理解ThreadLocal
    Java的Timer定时器
    https与http的区别
    SpringBoot微服务
    Java的BIO,NIO,AIO
    Java常量池
    Java中的值传递与引用传递
    面向对象三大特征及代码优化七大原则
  • 原文地址:https://www.cnblogs.com/sndd/p/11738050.html
Copyright © 2020-2023  润新知