用Python 画樱花(动态画+飘落效果+暗色效)

发表于:2021-9-08 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:脑子进水养啥鱼    来源:掘金

  前言
  Turtle库是Python语言中一个很流行的绘制图像的函数库。
  想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
  接下来,我们就要使用Turtle函数绘制几种樱花树:
  说明下:代码里用了随机函数,所以每次执行过程不仅仅是动态的,而且结果也是不同的。
  1、动态生成樱花
  结果展示:(这个是动态的,不会做gif,只能展示下结果)
  代码如下:
  # coding=utf-8
  # 画一棵樱花
   
  import turtle
  import random
  from turtle import *
  from time import sleep
   
  # 画樱花的躯干(60,t)
  def tree(branchLen, t):
      sleep(0.0005)
      if branchLen > 3:
          if 8 <= branchLen <= 12:
              if random.randint(0, 2) == 0:
                  t.color('snow')  # 白
              else:
                  t.color('lightcoral')  # 淡珊瑚色
              t.pensize(branchLen / 3)
          elif branchLen < 8:
              if random.randint(0, 1) == 0:
                  t.color('snow')
              else:
                  t.color('lightcoral')  # 淡珊瑚色
              t.pensize(branchLen / 2)
          else:
              t.color('sienna')  # 赭(zhě)色
              t.pensize(branchLen / 10)  # 6
          t.forward(branchLen)
          a = 1.5 * random.random()
          t.right(20 * a)
          b = 1.5 * random.random()
          tree(branchLen - 10 * b, t)
          t.left(40 * a)
          tree(branchLen - 10 * b, t)
          t.right(20 * a)
          t.up()
          t.backward(branchLen)
          t.down()
   
  # 掉落的花瓣
  def petal(m, t):
      for i in range(m):
          a = 200 - 400 * random.random()
          b = 10 - 20 * random.random()
          t.up()
          t.forward(b)
          t.left(90)
          t.forward(a)
          t.down()
          t.color('lightcoral')  # 淡珊瑚色
          t.circle(1)
          t.up()
          t.backward(a)
          t.right(90)
          t.backward(b)
   
  def main():
      # 绘图区域
      t = turtle.Turtle()
      # 画布大小
      w = turtle.Screen()
      t.hideturtle()  # 隐藏画笔
      getscreen().tracer(5, 0)
      w.screensize(bg='wheat')  # wheat小麦
      t.left(90)
      t.up()
      t.backward(150)
      t.down()
      t.color('sienna')
   
      # 画樱花的躯干
      tree(60, t)
      # 掉落的花瓣
      petal(200, t)
      w.exitonclick()
   
  main()
  2、飘落效果樱花
  结果展示:
  代码如下:
  from turtle import *
  from random import *
  from math import *
   
  def tree(n,l):
      pd()#下笔
      #阴影效果
      t = cos(radians(heading()+45))/8+0.25
      pencolor(t,t,t)
      pensize(n/3)
      forward(l)#画树枝
   
      if n>0:
          b = random()*15+10 #右分支偏转角度
          c = random()*15+10 #左分支偏转角度
          d = l*(random()*0.25+0.7) #下一个分支的长度
          #右转一定角度,画右分支
          right(b)
          tree(n-1,d)
          #左转一定角度,画左分支
          left(b+c)
          tree(n-1,d)
          #转回来
          right(c)
      else:
          #画叶子
          right(90)
          n=cos(radians(heading()-45))/4+0.5
          pencolor(n,n*0.8,n*0.8)
          circle(3)
          left(90)
          #添加0.3倍的飘落叶子
          if(random()>0.7):
              pu()
              #飘落
              t = heading()
              an = -40 +random()*40
              setheading(an)
              dis = int(800*random()*0.5 + 400*random()*0.3 + 200*random()*0.2)
              forward(dis)
              setheading(t)
              #画叶子
              pd()
              right(90)
              n = cos(radians(heading()-45))/4+0.5
              pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)
              circle(2)
              left(90)
              pu()
              #返回
              t=heading()
              setheading(an)
              backward(dis)
              setheading(t)
      pu()
      backward(l)#退回
   
  bgcolor(0.5,0.5,0.5)#背景色
  ht()#隐藏turtle
  speed(0)#速度 1-10渐进,0 最快
  tracer(0,0)
  pu()#抬笔
  backward(100)
  left(90)#左转90度
  pu()#抬笔
  backward(300)#后退300
  tree(12,100)#递归7层
  done()
  3、暗色效果樱花
  结果展示:
  代码如下:
  from turtle import *
  from random import *
  from math import *
   
   
  def tree(n, l):
      pd()
      t = cos(radians(heading() + 45)) / 8 + 0.25
      pencolor(t, t, t)
      pensize(n / 4)
      forward(l)
      if n > 0:
          b = random() * 15 + 10
          c = random() * 15 + 10
          d = l * (random() * 0.35 + 0.6)
          right(b)
          tree(n - 1, d)
          left(b + c)
          tree(n - 1, d)
          right(c)
      else:
          right(90)
          n = cos(radians(heading() - 45)) / 4 + 0.5
          pencolor(n, n, n)
          circle(2)
          left(90)
      pu()
      backward(l)
   
   
  bgcolor(0.5, 0.5, 0.5)
  ht()
  speed(0)
  tracer(0, 0)
  left(90)
  pu()
  backward(300)
  tree(13, 100)
  done()

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号