使用Python的Turtle库绘制动态爱心树

引言

Python的Turtle图形库是一个简单但功能强大的工具,用于绘制各种形状和图案。它模仿了一只可以在屏幕上移动的“海龟”,通过一系列指令控制它的位置、方向和动作。今天,我们将使用Turtle库来创作一幅充满爱意的艺术作品——一棵长满爱心的树。

一、Turtle库简介

Turtle是Python的标准库之一,旨在通过图形化编程教授计算机科学的基本概念。它可以被看作是一支可以在屏幕上移动和绘制的画笔。Turtle提供了大量的函数,如前进、后退、左转、右转以及设置颜色和线条宽度等,使得创建图形变得直观而有趣。

二、基本使用

在开始之前,我们先了解几个基础的Turtle函数:

  • turtle.speed(speed): 设置绘图速度。
  • turtle.forward(distance): 向前移动指定的距离。
  • turtle.backward(distance): 向后移动指定的距离。
  • turtle.left(angle): 向左转指定的角度。
  • turtle.right(angle): 向右转指定的角度。
  • turtle.penup(): 抬起画笔(移动时不会绘制)。
  • turtle.pendown(): 放下画笔(移动时会绘制)。
  • turtle.goto(x, y): 移动到屏幕上的指定位置。
三、代码详细解释
import turtle
import random

首先,我们导入了turtle模块和random模块,后者将用于添加一些随机性,使我们的爱心树更加自然。

turtle.bgcolor("black")

设置背景色为黑色,为后续的绘制提供对比度。

def love(x, y):  
    ...

love函数负责在给定的坐标(x, y)处绘制一个爱心。它使用了圆弧绘制技巧来形成心形的曲线部分。

def tree(branchLen, t):
    ...

tree函数是一个递归函数,用于绘制树的分支。随着分支长度的缩短,颜色会从棕色变为绿色,以模拟叶子的效果。每次调用自身时,都会随机改变角度和分支长度,从而创造出自然的树木外观。

myWin = turtle.Screen()
...

这部分代码设置了画布和Turtle的初始位置与方向,然后调用tree函数开始绘制。

四、效果图

在这里插入图片描述

五、完整代码
import turtle
import random

turtle.bgcolor("black")


def love(x, y):  # 在(x,y)处画爱心lalala
    lv = turtle.Turtle()
    lv.hideturtle()
    lv.up()
    lv.goto(x, y)  # 定位到(x,y)

    def curvemove():  # 画圆弧
        for i in range(20):
            lv.right(10)
            lv.forward(2)

    lv.color('red', 'pink')
    lv.speed(10000000)
    lv.pensize(1)
    # 开始画爱心lalala
    lv.down()
    lv.begin_fill()
    lv.left(140)
    lv.forward(22)
    curvemove()
    lv.left(120)
    curvemove()
    lv.forward(22)
    lv.left(140)  # 画完复位
    lv.end_fill()


def tree(branchLen, t):
    if branchLen > 5:  # 剩余树枝太少要结束递归
        if branchLen < 20:  # 如果树枝剩余长度较短则变绿
            t.color("green")
            t.pensize(random.uniform((branchLen + 5) / 4 - 2, (branchLen + 6) / 4 + 5))
            t.down()
            t.forward(branchLen)
            love(t.xcor(), t.ycor())  # 传输现在turtle的坐标
            t.up()
            t.backward(branchLen)
            t.color("brown")
            return
        t.pensize(random.uniform((branchLen + 5) / 4 - 2, (branchLen + 6) / 4 + 5))
        t.down()
        t.forward(branchLen)
        #以下递归
        ang = random.uniform(15, 45)
        t.right(ang)
        tree(branchLen - random.uniform(12, 16), t)  # 随机决定减小长度
        t.left(2 * ang)
        tree(branchLen - random.uniform(12, 16), t)  # 随机决定减小长度
        t.right(ang)
        t.up()
        t.backward(branchLen)


myWin = turtle.Screen()
t = turtle.Turtle()
t.hideturtle()
t.speed(1000)
t.left(90)
t.up()
t.backward(200)
t.down()
t.color("brown")
t.pensize(32)
t.forward(60)
tree(100, t)

turtle.done()

posted @   燕鹏  阅读(287)  评论(0编辑  收藏  举报  
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示