今年是牛年,祝你们新年牛气冲天!嗨皮牛Year!javascript
前几天在百度图片里下载了一张金牛的图片,就是封面的这张。想着用Python标准库turtle确定能够画出这张图,因此说干就干,花两天时间实现了。java
画图虽然不是Python的主要功能,但绘制这头金牛仍是展现了Python无所不能的强大属性。接下来介绍实现的过程。python
初看图片,深红色的背景下,一头金光闪闪的金牛。简单分析,图形主要分为两大部分,外面的圆环和内部的金牛。git
圆环由同心圆和折线形的圆盘构成,同心圆直接画圆就能够,折线形的圆盘是旋转对称的,每个部分由圆弧和半径方向的线组成,一共有26个相同的部分,计算出每一个部分的弧形比例便可依次绘制。github
金牛图形是不规则的,里面有不少不一样弧度和不一样长度的不规则曲线,控制画笔边前进边旋转,每次前进不一样的距离和旋转不一样的角度,能够绘制出这些曲线。里面的图案,如五瓣花就是用这种方式完成。动画
对图形有了基本的了解,就看turtle中有哪些方法能够用于实现这些操做了。spa
turtle是Python的标准库,直接导入便可使用。3d
from turtle import *
setup(width, height, x, y): 设置窗口大小和窗口左上角在屏幕中的位置。调试
title(): 设置窗口的标题。code
screensize(width, height, color): 设置画布大小,背景颜色。
done(): 绘图结束后,不自动关闭窗口。
pencolor(color): 设置画笔颜色。
penup(): 提起画笔,提起后移动画笔不会留下痕迹。
pendown(): 落下画笔,开始绘图前先将画笔落下。
speed(int): 设置画笔的速度,传入1~10的数字,1最慢,10最快。传入其余值会更快,可是没有鼠标移动的动画效果。
setx(value): 设置画笔的x轴坐标。
sety(value): 设置画笔的y轴坐标。
towards(x, y): 设置画笔指向的点。
setheading(): 设置画笔的方向。与towards()配合能够设置画笔指向某个点,如setheading(towards(0, 0))能够设置画笔指向原点。
circle(radius[, extent=arc]): 画一个圆,传入圆的半径,根据画笔的方向控制圆心的位置,圆心与画笔的方向垂直。传入弧度值能够画出指定弧度的圆弧。
left(angle): 画笔左转,传入任意一个目标角度。
right(angle): 画笔右转。
forward(distance): 画笔前进一段距离。
backward(distance): 画笔后退一段距离。
goto(x, y): 移动画笔到指定坐标。
begin_fill(): 开始填充。
fillcolor(color): 设置图形中填充的颜色。
end_fill(): 结束填充。
有了这些方法,就能够实现金牛图中的各类图案了。如画五瓣花轮廓的代码以下:
def draw_flower(a, color): pencolor('red') begin_fill() for j in range(5): for i in range(40): if 0 <= i < 20: a = a - 0.08 else: a = a + 0.08 forward(a) left(6) right(168) fillcolor(color) end_fill()
个人绘图顺序是从外到内,这样较小的图形会置于较大的图形之上,填充的颜色不会被遮挡。
最开始绘制的是外围的同心圆。先penup()提起画笔,sety()将画笔从圆心向下移动半径的距离,而后调整画笔方向,pendown()落下画笔,circle()画圆。
整个过程分了不少张截图,为了不篇幅过长,就不所有放了。再放一张最后画眼睛的动图,能够参照上面同心圆的方式拆分步骤。
其余的图案,若是会相互覆盖,要先画大的图形,再画小的图形。若是不会相互覆盖,顺序能够随意调整。
对比原图和turtle绘制的图形,总体上仍是很像的,但部分细节并无彻底还原。由于没有原图的任何参数,绘制过程当中全靠目测(像素尺子),很难避免偏差,再花一些时间调试应该能够更像。
附代码:
https://github.com/bigtigeryo/gold-cow