python之turtle使用:画一颗美美哒的树
关于工具介绍这里小生就不赘述了,这里附上个人觉得最详细的文档地址:https://docs.python.org/zh-cn/3/library/turtle.html?highlight=turtle#turtle.TurtleScreen
先看效果图:
以上就是小生牺牲午休时间捣鼓出来的~虽然不是辣么好看,但是还是想跟大伙分享一下,进入正题。
代码主要分为两部分:树代码部分,地上花瓣部分
树代码部分
其实代码很简单,主要是我们得知道如何去实现那些关键点(我知道这是废话,但是我总得说点什么凑字数...):
1,树干应该是越往上越细 - 即画笔越往上 size 尺寸越小
2,枝干越往上越短 - 枝干延伸的长度
3,枝干会分叉 - 即递归事件继续执行的入口
4,枝干分叉的角度 - 画笔偏移度
4,要长点什么 - 递归事件的出口
满足了以上几点,这棵树看起来才会正常一点(或者说符合大众观念)。总的来说,我们需要一个点来决定递归事件
的入口和出口,这里我用分叉次数来决定,当然还可以用延伸长度等或一个变量,只要我们能找到出入条件,看代码:
# 画树方法: n为枝干延伸次数,l为枝干延伸长度
def drawTree(n, l):
pendown()
# 设置画笔颜色 - 枝干颜色
pencolor('#5d3c3c')
# 画笔尺寸
pensize( n / 1.5)
# 延伸长度
forward(l)
# 根据 n 判断是否继续递归延伸枝干 或 结束本分支延伸
if n > 0:
# dr 为画笔顺时针偏移度,dl 为画笔逆时针偏移度
dr = randint(30, 40)
dl = randint(30, 40) # 本次延伸长度:每一次随机减少延伸长度(所以也可以根据 l 来设置 pensize等)
move = l * (random() * 0.4 + 0.5) # 顺时针偏移 dr
right(dr)
# 递归调用自身,剩余延伸次数 -1
drawTree(n - 1, move)
# 因为上面顺时针偏移了 dr,所以顺时针的偏移度加上逆时针偏移度:dr + dl 才是分叉实际偏移度
left(dr + dl)
drawTree(n - 1, move)
# 顺时针偏移dl,回到画笔原指向
right(dl)
else:
# 本分支延伸结束,调用画花朵方法
drawPetal(3)
# 提起画笔
penup()
# 回到开始延伸的位置
backward(l)
花朵代码:
枝干完成指定分叉次数后,为了好看一点,即需要长点什么,如代码:
# 花朵绘画方法: n 为花朵半径(其实就是圆半径...)
def drawPetal(n):
# 指定颜色模式为 rgb 模式
colormode(255)
# 随机生成 rgb 色值
r = randint(200, 255)
g = randint(8, 158)
b = randint(8, 158) # 画圆并填充颜色
begin_fill()
fillcolor(r, g, b)
pencolor(r, g, b)
circle(n)
end_fill()
到这里如果只是为了画一棵树,那我们的工作已经基本完成了,当然我们需要一个启动方法:
def run():
# 设置画布比例: 相对显示屏
setup(1.0, 1.0) penup()
# 移动到坐标 (-50, -150)
goto(-50, -150)
# 逆时针旋转90度,使画笔指向正上方
left(90)
pendown() # 隐藏画笔
hideturtle() # 是否追踪绘画过程:即是否一步一步显示绘画过程
tracer(False) # 调用树方法
drawTree(13, 150)
将上诉代码复制到编辑器里,在调用 run()方法,一棵树神奇的树就会出现了(假设你已经安装了python运行环境)。
让我们再给它洒上一些花瓣,这里花瓣的位置小生将它放在树起始点下方,其实你完全可以随意指定位置和范围以及大小
来展示一张飘落的效果(我已经看过了,很好看):
# 花瓣位置生成: m 为花瓣数量,x y 决定绘画花瓣初始位置
# 这里我将花瓣初始位置设置为树起点位置附近
def petalPlace(m, x, y):
penup()
goto(x, y)
pendown()
setheading(0)
tracer(False)
for i in range(m):
# 起始点画一朵
if i == 0:
drawPetal(5)
else:
penup()
goto(x, y)
# a 为下一朵花瓣水平方向相对起始点距离
a = randint(20, 400)
# b 为下一朵花瓣垂直方向相对起始点距离
b = randint(-50, 50) # 将画笔移动相应距离
forward(a)
left(90)
forward(b)
right(90)
pendown() # 调用花瓣绘画方法
drawPetal(5)
到这里我们的所有代码已经完成,下面是所有代码(已去掉注释):
from turtle import *
from random import * # 画树方法
def drawTree(n, l):
pendown()
pencolor('#5d3c3c')
pensize( n / 1.5)
forward(l)
if n > 0:
dr = randint(30, 40)
dl = randint(30, 40)
move = l * (random() * 0.4 + 0.5)
right(dr)
drawTree(n - 1, move)
left(dr + dl)
drawTree(n - 1, move)
right(dl)
else:
drawPetal(3)
penup()
backward(l) # 花瓣位置生成
def petalPlace(m, x, y):
penup()
goto(x, y)
pendown()
setheading(0)
tracer(False)
for i in range(m):
if i == 0:
drawPetal(5)
else:
penup()
goto(x, y)
a = randint(20, 400)
b = randint(-50, 50)
forward(a)
left(90)
forward(b)
right(90)
pendown()
drawPetal(5) # 花朵绘画方法
def drawPetal(n):
colormode(255)
r = randint(200, 255)
g = randint(8, 158)
b = randint(8, 158)
begin_fill()
fillcolor(r, g, b)
pencolor(r, g, b)
circle(n)
end_fill() # 启动方法
def run():
setup(1.0, 1.0)
penup()
goto(-50, -150)
left(90)
pendown()
hideturtle()
tracer(False)
drawTree(13, 150)
petalPlace(160, -100, -150) run()
done()
值得注意的是,因为我们使用了很多随机生成的值,所以每一次生成的树都一样,也就是你说,我们可以造一片森林,
有了上面的代码,我们需要补充的已经很少了:
大致思路就是随机生成树的起始点,再调用我们上面的方法就可以了,当然为了美观,部分数值是需要细调的,
最起码每棵树下面的花瓣这个方法不需要了,我们可以换成给整个区域的树加上花瓣飘落效果,这里给个森林例子
(没有改花瓣):
# m 对应生成树的数量
def run(m):
setup(1.0, 1.0)
for i in range(m):
penup()
x = randint(-500, 500)
y = randint(-300, 300)
goto(x ,y)
left(90)
tracer(False)
drawTree(10, 150)
petalPlace(100, x, y)
python之turtle使用:画一颗美美哒的树的更多相关文章
- Python——用turtle模块画海龟的第一步
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- python的turtle模块画折线图
代码如下: import turtle yValues = [10.0,7.4,6.4,5.3,4.4,3.7,2.6] def main(): t = turtle.Turtle() t.hidet ...
- python中turtle模块画正多边形
画正多边形主要是计算多边形每个角度对应的外角的度数,计算出来这个度数即可画图,相对来说非常简单 以正六边形为例 import turtle import time t = turtle.Pen() f ...
- 使用Python的turtle库画圣诞树
代码如下: from turtle import * import random import time n = 80.0 speed("fastest") screensize( ...
- 使用Python的turtle模块画出简单的柱状图
代码如下: import turtle heights = [856, 420,360,260,205] def main(): t = turtle.Turtle() t.hideturtle() ...
- 使用Python的turtle模块画出最简单的五角星
代码如下: import turtle def main(): t = turtle.Turtle() t.hideturtle() lengthOfSize = 200 drawFivePointS ...
- python运用turtle 画出汉诺塔搬运过程
python运用turtle 画出汉诺塔搬运过程 1.打开 IDLE 点击File-New File 新建立一个py文件 2.向py文件中输入如下代码 import turtle class Stac ...
- 课程作业——Python基础之使用turtle库画出红旗
代码如下: import turtle # 设置画笔和背景颜色 turtle.color('yellow') turtle.bgcolor('red') # 通过偏移量和尺寸大小画星星 def dra ...
- Python之turtle画同心圆和棋盘
画饼图 import turtle t = turtle.Pen() for i in range(5): t.penup() t.goto(0, -i*30) t.pendown() t.circl ...
随机推荐
- Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法
Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...
- react,react-router,redux+react-redux 构建一个React Demo
创建初始化应用 加速我们的npm. npm install -g cnpm --registry=https://registry.npm.taobao.org 利用create-react-app ...
- Python 的 12 个学习方式
Python 是世界上最受欢迎的编程语言之一,它受到了全世界各地的开发者和创客的欢迎.大多数 Linux 和 MacOS 计算机都预装了某个版本的 Python,现在甚至一些 Windows 计算机供 ...
- angular创建一个独立弹窗服务
1.说明: 这个服务用于创建一个modal(弹窗),通常下,这个弹窗会插入到body的底部,并且拥有自己的作用域($scope),也可以和外界通讯. 2.逻辑: (1).创建模版 (2).拿到模版里要 ...
- 服务网格Istio初探
1. 服务网格Istio初探 1.1. 什么是Istio 它是一个完全开源的服务网格.什么是服务网格? 这个术语通常用于描述构成这些应用程序的微服务网络以及应用之间的交互.随着规模和复杂性的增长,服务 ...
- Crontab常用命令总结
一.启动服务 /sbin/service crond start 二.关闭服务 /sbin/service crond stop 三.重启服务 /sbin/service crond restart ...
- FreePascal - Typhon如何添加不能识别单元?
Typhon 32位 6.9 问题:想使用LSUtils单元,这个单元在Lazarus里面,直接引入就可以使用,而且单元头注释明显写明是CodeTyphon工程的一部分,那么正常在Typhon只要引入 ...
- Java梗概
Java平台:J2SE(桌面).J2ME(逐渐被android取代).J2EE(企业级针对web程序) Java是在JVM虚拟机上运行,跨平台本质是在不同平台上运行JVM虚拟机 JRE = JVM+核 ...
- Request和Response。
复习点:1.重定向问题 2.输出字符串到浏览器.3.文件下载需求:1. 页面显示超链接2. 点击超链接后弹出下载提示框3. 完成图片文件下载 Request和Response Request: 1. ...
- Kubernetes学习之路(28)之镜像仓库Harbor部署
Harbor的部署 官方文档 Harbor有两种安装的方式: 在线安装:直接从Docker Hub下载Harbor的镜像,并启动. 离线安装:在官网上下载离线安装包其地址为:https://githu ...