前段时间疯传的武大学生用Python代码画出樱花,暗藏“武汉加油”,好感人的。
不过他们的代码并不是“画”樱花,而是剪辑一段樱花的视频,把其中的像素替换为“武汉加油”的字样。
今天我教你实实在在地用Python画画。
先看一个最简单又好玩的:五行代码画一个方形的螺旋线。画出来的图是这样的:
下面是简单的五行代码,你只要懂这几个英文单词,保管看得懂:turtle —— 小海龟,在沙滩上画画的小能手
length —— 长度,划线的长度
right —— 向右转!
forward —— 前进!
done —— 完成!
import turtle
for length in range(5,5*31,5): # 画30个线段,每个线段比前一个长度加5
turtle.right(90) # 右转90度
turtle.forward(length) #
turtle.done( )
怎么样,超级简单易懂吧?
Python就是这样好玩又简单。你要是学C语言的话,也许整本书教完了还没教你画图呢。
你可能会说这个图太简单了。想画实用漂亮一些的图?那画朵玫瑰怎么样啊?这个可能要手绘了。
代码比较长,一点一点画的,所以放后面附录了,这里直接看效果:Python手绘玫瑰效果演示https://www.zhihu.com/video/1233988975486377984
附录中的代码,虽然很长,但你完全能看懂每一句话。你可能会注意到,源代码全文主要也就是这样一句话在反复念叨:
turtle.circle(a, b)
这句话的意思就是:请海龟画圆弧,画半径为a、夹角为b那么大(如下图所示)。很自然好懂吧?玫瑰花的大部分线条,都是这样,用一段一段的弧线拼接起来的而已。
我们的自然学习法,就是这样子精选好玩的程序,让你在有趣的代码阅读中就完成学习的。
动手练习:把本文的两个程序分别复制到你的编程平台上(例如IDLE或Pycharm),运行无误。
按第一个程序的思想,画一个正六边形(提示:每次转60度)。
对第二个程序进行调整,画一朵黄玫瑰,并且让枝条细一点。
到此为止我们只画了玫瑰,还没画樱花。
原则上,用类似的方法(弧线拼接),你可以画任何你喜欢的花。但是这个每一步弧线大小的设定和调整是很麻烦的,而且跟手画一样,你必须要有艺术天分才能画好呢。
如果你有艺术底子,你就可以继续朝这个方向走,也许你能同样画出很好看的别的花花草草来,比如樱花 或圣诞树 。但下一篇我们将用美丽的数学方法来画樱花,也可以很艳丽的喔。
这里是《简单又好玩的Python》,欢迎关注。
(注:为了简单易懂,本文的代码在语法上不是最完美的,下一篇我们继续做其它画图示例时,将使用更严谨的语法。)
附:手绘玫瑰源代码
#
# 原作:QiZhao,完善:HenryJ
import turtle
# 设置初始位置
turtle.penup() # 抬笔(移动过程不画线)
turtle.left(90) # 左转90度
turtle.fd(200) # 前进200点(fd=forward)
turtle.pendown() # 落笔,准备画画
turtle.right(90) # 右转90度
# 花蕊
turtle.fillcolor("red") # 准备填充色为“红色”
turtle.begin_fill() # 开始填充封闭空间
turtle.circle(10, 180) # 画弧,半径10,180度角
turtle.circle(25, 110) # 画弧,半径25,110度角
turtle.left(50) # 左转50度
turtle.circle(60, 45) # 以下注释略
turtle.circle(20, 170)
turtle.right(24)
turtle.fd(30)
turtle.left(10)
turtle.circle(30, 110)
turtle.fd(20)
turtle.left(40)
turtle.circle(90, 70)
turtle.circle(30, 150)
turtle.right(30)
turtle.fd(15)
turtle.circle(80, 90)
turtle.left(15)
turtle.fd(45)
turtle.right(165)
turtle.fd(20)
turtle.left(155)
turtle.circle(150, 80)
turtle.left(50)
turtle.circle(150, 90)
turtle.end_fill()
# 花瓣1
turtle.left(150)
turtle.circle(-90, 70)
turtle.left(20)
turtle.circle(75, 105)
turtle.setheading(60)
turtle.circle(80, 98)
turtle.circle(-90, 40)
# 花瓣2
turtle.left(180)
turtle.circle(90, 40)
turtle.circle(-80, 98)
turtle.setheading(-83)
# 叶子1
turtle.pensize(2)
turtle.fd(30)
turtle.left(90)
turtle.fd(25)
turtle.left(45)
turtle.fillcolor("green")
turtle.begin_fill()
turtle.circle(-80, 90)
turtle.right(90)
turtle.circle(-80, 90)
turtle.end_fill()
turtle.right(135)
turtle.fd(60)
turtle.left(180)
turtle.fd(85)
turtle.left(90)
turtle.fd(80)
# 叶子2
turtle.right(90)
turtle.right(45)
turtle.fillcolor("green")
turtle.begin_fill()
turtle.circle(80, 90)
turtle.left(90)
turtle.circle(80, 90)
turtle.end_fill()
turtle.left(135)
turtle.fd(60)
turtle.left(180)
turtle.fd(60)
turtle.right(90)
turtle.circle(200, 60)
turtle.hideturtle()
turtle.done()