专栏首页Python碎片公众号的专栏用Python标准库turtle画一头金牛,祝您新年牛气冲天!

用Python标准库turtle画一头金牛,祝您新年牛气冲天!

今年是牛年,祝大家新年牛气冲天!嗨皮牛Year!

前几天在百度图片里下载了一张金牛的图片,就是封面的这张。想着用Python标准库turtle肯定可以画出这张图,所以说干就干,花两天时间实现了。

我把绘图过程录成了视频,点击视频可以先看到效果。(提示:视频有背景音乐,如有不便请先调低手机音量)

画图虽然不是Python的主要功能,但绘制这头金牛还是展示了Python无所不能的强大属性。接下来介绍实现的过程。

图片分析

初看图片,深红色的背景下,一头金光闪闪的金牛。简单分析,图形主要分为两大部分,外面的圆环和内部的金牛。

圆环由同心圆和折线形的圆盘构成,同心圆直接画圆就可以,折线形的圆盘是旋转对称的,每一个部分由圆弧和半径方向的线组成,一共有26个相同的部分,计算出每个部分的弧形比例即可依次绘制。

金牛图形是不规则的,里面有很多不同弧度和不同长度的不规则曲线,控制画笔边前进边旋转,每次前进不同的距离和旋转不同的角度,可以绘制出这些曲线。里面的图案,如五瓣花就是用这种方式完成。

对图形有了基本的了解,就看turtle中有哪些方法可以用于实现这些操作了。

用到的Turtle方法介绍

turtle是Python的标准库,直接导入即可使用。

from turtle import *

1. 画布设置

setup(width, height, x, y): 设置窗口大小和窗口左上角在屏幕中的位置。

title(): 设置窗口的标题。

screensize(width, height, color): 设置画布大小,背景颜色。

done(): 绘图结束后,不自动关闭窗口。

2. 画笔设置

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))可以设置画笔指向原点。

3. 画笔操作

circle(radius[, extent=arc]): 画一个圆,传入圆的半径,根据画笔的方向控制圆心的位置,圆心与画笔的方向垂直。传入弧度值可以画出指定弧度的圆弧。

left(angle): 画笔左转,传入任意一个目标角度。

right(angle): 画笔右转。

forward(distance): 画笔前进一段距离。

backward(distance): 画笔后退一段距离。

goto(x, y): 移动画笔到指定坐标。

4. 颜色填充

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()画圆。

公众号中的动图不能超过300帧,整个过程分了很多张截图,为了避免篇幅过长,就不全部放了。再放一张最后画眼睛的动图,可以参照上面同心圆的方式拆分步骤。

其他的图案,如果会相互覆盖,要先画大的图形,再画小的图形。如果不会相互覆盖,顺序可以随意调整。

总结

对比原图和turtle绘制的图形,整体上还是很像的,但部分细节并没有完全还原。因为没有原图的任何参数,绘制过程中全靠目测(像素尺子),很难避免误差,再花一些时间调试应该可以更像。

代码很长,有1000多行,都是重复上面介绍的那些方法。代码重构优化的空间很大,如将重复的代码抽取重用,调整代码的顺序减少画笔的移动距离,将填充颜色的代码写成装饰器等。不过,因为实现功能已经花了两天时间,所以懒得改了,如果下次还会使用,再改吧,比如明年画一只金虎,到时候肯定是先重构代码然后调用会更快。

文中没有附代码,如果需要完整代码可以关注公众号“Python碎片”,然在后台回复“金牛”关键字获取。

本文分享自微信公众号 - Python 碎片(python-suipian),作者:binn wong

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • “金牛鹅"限量潮玩预售开启!

    ? A.概述 牛年到,福气到,在这牛势冲天的年份我们推出一款精致感十足的QQ潮玩—GoldenQ金牛鹅。祝大家在新的一年里牛运亨通,牛转新机,传达美好的牛年祝...

    腾讯ISUX
  • 【UPUP牛】QQ牛年生肖潮玩系列设定故事

    一、项目背景 腾讯生肖公仔是腾讯每逢新年皆会重推的礼品,也是QQ作为企业IP的重要形象拓展。2021牛年生肖公仔,ISUX的设计师研发了具有潮流味道的QQ牛系...

    腾讯ISUX
  • 牛年NEW气象,鹅厂牛年公仔系列重磅发布!

    在腾讯推出生肖公仔的第十二年之际 又萌又潮的QQ牛年公仔C位出道! 2021年,牛年NEW气象 鹅厂牛年生肖公仔UPUP牛系列 正式上线! ? ? 牛年,鹅厂...

    腾讯ISUX
  • 新春福卡 | QQ22周年招财牛气卡,开!

    昨天,QQ满22周年了 祝鹅生日快乐! 今天,QQ带着寿星的欧气 亲自来送牛年祝福啦! QQfamily新春牛气福卡 热!乎!上!新! 集齐6张福卡 全年牛...

    腾讯ISUX
  • QTX直播 | 超多限定品!首场QQ潮玩直播周五开播

    2021第一场QQ潮玩云端嘉年华即将开启! 2021/1/15  19:30-22:00 QTX AIR 第1期 即将开播! QQ潮玩直播将为你带来连环惊喜!...

    腾讯ISUX
  • 年轻化设计|重塑传统符号的春节活动

    ? Part 1 项目背景 爆竹声中一岁除,春风送暖入屠苏。千户万户曈曈日,总把新符换旧符。 春节是中华民族最隆重、最富民族特色的传统佳节,但QQ的用户又以Z...

    腾讯ISUX
  • 【红包封面福利】QQ, PUPU, KAKAO, ISUX齐贺岁!

    牛年新春快到啦 最近你抢了多少红包…封面? 上周我们在粉丝群率先发了一波后 文章留言区、后台留言区、粉丝群 随处可见求再来一波的身影 经过设计师的加班加点 新...

    腾讯ISUX
  • 来领限量版红包封面,一起搭乘“乐享”号高铁!

    请将手机横放浏览 ? 一起享受精彩旅程 ? ? ? ? ? ? ? ? 感谢你和乐乐一起抵达了新的一年 两项福利来袭! 福利一 腾讯乐享限量红包封面来啦! ...

    腾讯乐享
  • 【Rust 日报】2020-02-11 Rust stable 1.50 发布,牛年rust牛气冲天!

    源码在这:https://github.com/ZhangHanDong/2021soaring

    MikeLoveRust

扫码关注云+社区

领取腾讯云代金券