那就来使用Python画一棵樱花树吧!

成品演示

那就来使用Python画一棵樱花树吧!_第1张图片

 共用到四个要素即四个class,分别是山头、雪、太阳、樱花,另外程序需要一个主类分别调用它们,并起到一个初始化画笔、画布的作用。

用到的Python类库

import turtle as t  //画图
import random as rd  //随机数
import math as m  //数学函数

用到的turtle库函数

setup() 用于启动一个图形窗口,四个参数分别是窗口的宽高、窗口左上角点的坐标(坐标(0,0)是屏幕左上角)
pensize() 定义画笔的宽度(像素)
bgcolor(),pencolor() 设置背景颜色、画笔颜色
pu(),pd() 或用down(),up(),启用或禁用画笔(若pd()则画笔落下,此时所有移动画笔的操作如forward()会在屏幕留下轨迹,而pu()则画笔抬起,此时所有动作只会移动画笔、调整落点,而不会留下轨迹)
goto() 将画笔'瞬移'到某一坐标,期间仍然会留下轨迹,需要配合pu(),pd()来使用
tracer() 参数为布尔值,若为真代表显示绘画踪迹,假代表隐藏绘画踪迹(时间不变)
color() 可有两个参数,画笔颜色与填充颜色
fillcolor() 设置画笔的填充颜色
begin_fill(),end_fill() 一对填充标记,将再此期间画的封闭图形填上颜色
speed() 设置画笔速度,一般和tracer(Ture)一起使用,即显示踪迹;speed参数范围为1-10,逐渐变快,若超过此范围则按光速0处理
forward(),backward() 或用fd(),bk(),即让画笔向前、向后移动(参数可以为负值,即为反方向移动)
left(),right() 将画笔左/右转相应的角度
circle(),seth(),heading() 当circle方法仅一个参数时是画圆,参数为其半径,两个参数时是画弧,第二个参数为弧度;seth将笔尖原地旋转一定的角度(无论笔尖朝向,以x轴正半轴方向为基准正左负右)(setheading的缩写),heading即为将当前画笔位置作为返回值返回
done() 代表画图结束后程序停留,需要手动退出

turtle方法演示

1.显示踪迹,并让画笔循环往复移动

turtle走直线111

t.shape("turtle")
while(True):
	t.fd(200)
	t.left(180)

1)使用shape()函数将画笔改为turtle库中的乌龟形状

2)在循环体中用fd和left函数配合使用来实现小乌龟反复不停的直线运动,left/right控制旋转角度(向左/向右)。

2.画笔画出“80”字样

画80 111

省流:两个圆圈一个椭圆

1)用四个circle()画出四个半圆

2)通过一个循环(每次前进一丢丢,重复多次,并将循环变量递增或递减)一点点画出椭圆来。

import turtle as t
import math

#自顶而下画椭圆
def ellipse(angles):
	loop_count = int(360/angles)
	step = 1.0
	for i in range(loop_count):
		if (0<=i

 主要是想用这个练习加深一下pu(),pd()的用法,做到随时动笔自如,下一个练习是用另一种更灵活的方法来移动画笔。

3.用goto()画出一簇气球并完成上色

画气球_1

 1)练习一下begin_fill和end_fill,以及与fillcolor,pu,pd等方法的组合使用

2)另外需注意若画笔右转90度后没有转回来,此时再次画圆时会出现移位现象(如下图),所以必须还原。

那就来使用Python画一棵樱花树吧!_第2张图片

 ↑是没有及时还原画笔朝向的作品(还有点奇奇怪怪的美感怎么回事),这再次说明circle方法所画的圆是受当前笔尖朝向影响的。

import turtle as t
import math

RAS = 35

#画并填充圆
def drawCircle(x,y,color):
	t.fillcolor(color)
	t.pu()
	t.goto(x,y)
	t.pd()
	t.begin_fill()
	t.circle(RAS)
	t.end_fill()
	#画气球的绳子
	t.right(90)
	t.fd(90)
	t.left(90)

if __name__ == "__main__":
	t.tracer(True)
	t.speed(8)
	t.setup(600,450,0,0)
	t.pensize(3)

	drawCircle(-160,100,"yellow")
	drawCircle(-125,100,"red")
	drawCircle(-95,100,"blue")
	drawCircle(-115,60,"pink")
	drawCircle(-145,60,"purple")


	t.done()#防止完成后闪退

 开始画啦

 1.画山头

1)画出由五个弧线段组成的基础山体

2)为了更方便地控制画笔,使用turtle.position()在命令行输出当前画笔坐标(下图中的两个标记点)

3)将山体填充上蓝色

那就来使用Python画一棵樱花树吧!_第3张图片

画好的山头效果如下:

那就来使用Python画一棵樱花树吧!_第4张图片

def drawFMT():
	#改变初始位置
	t.pu()
	t.goto(-370,-295)#x,y
	t.tracer(1)
	t.pd()
	t.speed(5)
	#富士山

	#山左侧的弧
	t.fillcolor('RoyalBlue3')#深蓝色
	t.begin_fill()
	t.seth(23)#左边逆时针转动的弧度
	t.circle(1150,10)
	print('雪山左标记点:',t.position())
	t.circle(800,10)
	#山顶的弧
	t.seth(-15)
	t.circle(250,30)
	#山右侧的弧
	t.seth(-50)
	t.circle(800,10)
	#print('雪山右标记点:', t.position())
	t.circle(800, 10)
	t.end_fill()

 2.画上方的雪

1)画出雪的扇形部分区域

2)将鼠标移动到之前打印出的标记点位。 

覆盖雪后效果如下:

那就来使用Python画一棵樱花树吧!_第5张图片

def drawSnow():
	t.tracer(1)
	t.fillcolor('Snow2')
	t.pu()
	t.goto(-193.01,-200.89)#左标记点
	t.pd()
	t.begin_fill()
	t.seth(33)
	t.circle(750, 11)#左半弧
	t.seth(-15)
	t.circle(250, 29)#上弧
	t.seth(-50) 
	t.circle(750, 11) #右弧
	t.seth(-151)
	t.circle(-330,62) #下弧
	t.end_fill()

 3.画出太阳

1)先对画笔设置好颜色(外红内黄)

2)进行若干次循环,每次循环都只向前画一条直线,并将朝向左转170度

3)最后代码以end_fill方法结尾,可以将画画中产生的闭环填充为黄色

完成效果如下:

那就来使用Python画一棵樱花树吧!_第6张图片

那就来使用Python画一棵樱花树吧!_第7张图片

def drawSun():
	#移动画笔
	t.pu()
	t.goto(190,250)
	t.tracer(1)
	t.pd()
	t.color('red', 'yellow')#(画笔颜色,填充颜色)
	t.begin_fill()
	count = 0
	while (count<50):
	    t.speed(10)
	    #每次循环转170度并向前画
	    t.forward(80)
	    t.left(170)
	    count += 1
	t.end_fill()

 4.画樱花树

1)将画笔移动到指定位置

2)设计阴影效果函数(tan)、叶子效果函数以及树分支(n,angle_right,angle_left,next_br)、叶子方位(an,dis)随机值

3)根据思路设计递归函数,并增加装饰的粉红泡泡(else:ran)

4)增加飘落叶子,设置每次函数执行后返回起始点

那就来使用Python画一棵樱花树吧!_第8张图片

 树中每一支主干(从根到叶)即为一次递归操作。

那就来使用Python画一棵樱花树吧!_第9张图片

def drawTree():
	t.speed(10)#速度 1-10渐进,10 最快
	t.tracer(120)
	t.pu()#抬笔
	t.goto(-200,-280)
	t.left(90)#左转90度
	tree(11,80)#(递归n层,树枝长度)
def tree(n,l):
	t.pd()#下笔
	#阴影效果
	tan = m.cos(m.radians(t.heading()+45))/8+0.25
	t.pencolor(tan,tan,tan)
	t.pensize(n/3)
	t.forward(l)
	if n>0:#画树枝
		angle_right = rd.random()*15+10 #右分支偏转角度
		angle_left = rd.random()*15+10 #左分支偏转角度
		next_br = l*(rd.random()*0.25+0.7) #下一个分支的长度
		#右转一定角度,画右分支
		t.right(angle_right)
		tree(n-1,next_br)
		#左转一定角度,画左分支
		t.left(angle_right+angle_left)
		tree(n-1,next_br)
		#转回来
		t.right(angle_left)
	else:
		#画叶子
		t.right(90)
		n=m.cos(m.radians(t.heading()-45))/4+0.5
		ran=rd.random()
		#添加了随机生成的粉红泡泡
		if(ran>0.7):
			t.begin_fill()
			t.circle(3)
			t.fillcolor('pink')
		#把随机生成的叶子统一换成了粉色
		t.pencolor("pink")
		t.circle(3)
		if(ran>0.7):
			t.end_fill()
		t.left(90)
		#添加0.3倍的飘落叶子
		if(rd.random()>0.7):
			t.pu()
			#飘落
			tan = t.heading()
			an = -40 +rd.random()*40
			t.setheading(an)
			dis = int(800*rd.random()*0.5 + 400*rd.random()*0.3 + 200*rd.random()*0.2)
			t.forward(dis)
			t.setheading(tan)
			#画叶子
			t.pd()
			t.right(90)
			n = m.cos(m.radians(t.heading()-45))/4+0.5
			t.pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)
			t.circle(2)
			t.left(90)
			t.pu()
			#返回
			tan=t.heading()
			t.setheading(an)
			t.backward(dis)
			t.setheading(tan)
	t.pu()
	t.backward(l)#退回

 完整源代码:

import turtle as t #导入绘图库
import random as rd
import math as m

def drawSun():
	#移动画笔
	t.pu()
	t.goto(190,250)
	t.tracer(1)
	t.pd()
	t.color('red', 'yellow')#(画笔颜色,填充颜色)
	t.begin_fill()
	count = 0
	while (count<50):
	    t.speed(10)
	    #每次循环转170度并向前画
	    t.forward(80)
	    t.left(170)
	    count += 1
	t.end_fill()
def drawSnow():
	t.tracer(1)
	t.fillcolor('Snow2')
	t.pu()
	t.goto(-193.01,-200.89)#左标记点
	t.pd()
	t.begin_fill()
	t.seth(33)
	t.circle(750, 11)#左半弧
	t.seth(-15)
	t.circle(250, 29)#上弧
	t.seth(-50) 
	t.circle(750, 11) #右弧
	t.seth(-151)
	t.circle(-330,62) #下弧
	t.end_fill()
def drawFMT():
	#改变初始位置
	t.pu()
	t.goto(-370,-295)#x,y
	t.tracer(1)
	t.pd()
	t.speed(9)
	#富士山

	#山左侧的弧
	t.fillcolor('RoyalBlue3')#深蓝色
	t.begin_fill()
	t.seth(23)#左边逆时针转动的弧度
	t.circle(1150,10)
	print('雪山左标记点:',t.position())
	t.circle(800,10)
	#山顶的弧
	t.seth(-15)
	t.circle(250,30)
	#山右侧的弧
	t.seth(-50)
	t.circle(800,10)
	print('雪山右标记点:', t.position())
	t.circle(800, 10)
	t.end_fill()
def drawTree():
	t.speed(10)#速度 1-10渐进,10 最快
	t.tracer(120)
	t.pu()#抬笔
	t.goto(-200,-280)
	t.left(90)#左转90度
	tree(11,80)#(递归n层,树枝长度)
def tree(n,l):
	t.pd()#下笔
	#阴影效果
	tan = m.cos(m.radians(t.heading()+45))/8+0.25
	t.pencolor(tan,tan,tan)
	t.pensize(n/3)
	t.forward(l)
	if n>0:#画树枝
		angle_right = rd.random()*15+10 #右分支偏转角度
		angle_left = rd.random()*15+10 #左分支偏转角度
		next_br = l*(rd.random()*0.25+0.7) #下一个分支的长度
		#右转一定角度,画右分支
		t.right(angle_right)
		tree(n-1,next_br)
		#左转一定角度,画左分支
		t.left(angle_right+angle_left)
		tree(n-1,next_br)
		#转回来
		t.right(angle_left)
	else:
		#画叶子
		t.right(90)
		n=m.cos(m.radians(t.heading()-45))/4+0.5
		ran=rd.random()
		#添加了随机生成的粉红泡泡
		if(ran>0.7):
			t.begin_fill()
			t.circle(3)
			t.fillcolor('pink')
		#把随机生成的叶子统一换成了粉色
		t.pencolor("pink")
		t.circle(3)
		if(ran>0.7):
			t.end_fill()
		t.left(90)
		#添加0.3倍的飘落叶子
		if(rd.random()>0.7):
			t.pu()
			#飘落
			tan = t.heading()
			an = -40 +rd.random()*40
			t.setheading(an)
			dis = int(800*rd.random()*0.5 + 400*rd.random()*0.3 + 200*rd.random()*0.2)
			t.forward(dis)
			t.setheading(tan)
			#画叶子
			t.pd()
			t.right(90)
			n = m.cos(m.radians(t.heading()-45))/4+0.5
			t.pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)
			t.circle(2)
			t.left(90)
			t.pu()
			#返回
			tan=t.heading()
			t.setheading(an)
			t.backward(dis)
			t.setheading(tan)
	t.pu()
	t.backward(l)#退回

if(__name__ == '__main__'):
	t.setup(800,600,250,-200)#建立画布,找准坐标
	#t.bgcolor('Thistle')  # 背景色
	t.bgcolor(0.956,0.9255,0.9882)#设置背景色(把灰色换成淡紫色)
	t.ht() #隐藏小乌龟,hideturtle()的缩写
	drawFMT()
	drawSnow()
	drawSun()
	drawTree()
	
	t.done()#暂停程序

你可能感兴趣的:(搞搞代码,python,后端)