当前位置: 首页 > news >正文

用 Python 画哆啦 A 梦

文 | 豆豆

来源:Python 技术「ID: pythonall」

相信大家童年的时候都看过哆啦 A 梦,他的口袋简直是无所不能,里面装满了各种神奇的道具。曾经的我也幻想过如果自己也有一个这样的口袋多好。今天我们就用 Python 来画一个哆啦 A 梦,怀念下我们的童年。

先来看看我们最终实现的效果图。

头部轮廓和围巾

老规矩,先引入今天要用到的库 turtle 并做一些基础设置。

import turtle as t


t.speed(5)
t.pensize(1)
t.screensize(500, 500)
t.bgcolor('white')

首先,我们先画下多啦 A 梦头部外轮廓,头部轮廓主要是一个多半圆,围巾就是一个小的长方形。

# 头部
def head():
    t.up()
    t.circle(150, 45)
    t.down()
    t.fillcolor(head_color)
    t.begin_fill()
    t.circle(150, 270)
    t.end_fill()




# 围巾
def scarf():
    t.fillcolor(scarf_color)
    t.begin_fill()
    t.seth(0)
    t.fd(216)
    t.circle(-5, 90)
    t.fd(10)
    t.circle(-5, 90)
    t.fd(220)
    t.circle(-5, 90)
    t.fd(10)
    t.circle(-5, 90)
    t.end_fill()

来看下效果如何,呃呃呃,怎么感觉有点像大马路上的石墩儿呢,除了颜色有点像之外。

不急不急,我们再画一下脸部细节。

脸部

眼睛

俗话说眼睛是心灵的窗户,我们先把眼睛画上。

def face():
    t.fd(186)
    t.lt(45)
    t.fillcolor(color_white)
    t.begin_fill()
    t.circle(120, 100)
    t.seth(180)
    t.fd(120)
    t.seth(215)
    t.circle(120, 100)
    t.end_fill()


def draw_eyes():
    t.fillcolor(color_white)
    t.begin_fill()
    a = 2.5
    for i in range(120):
        if 0 <= i < 30 or 60 <= i < 90:
            a -= 0.05
        else:
            a += 0.05
        t.lt(3)
        t.fd(a)
    t.end_fill()


def eyes():
    go_to(0, 227)
    t.seth(90)
    draw_eyes()
    go_to(0, 227)
    t.seth(270)
    draw_eyes()

画眼睛不能直接画一个正圆,那样看起来会比较奇怪,要画一个椭圆才行,来看下效果。

眼睛画上去之后明显感觉精神多了,也有点多啦 A 梦的模样了。可是看起来还是有点不太对,是的,眼睛还没有画瞳孔。

简单起见,直接补两个黑色的圆圈圈即可。

def fill_eyes():
    # 填充眼睛
    go_to(-15, 220)
    t.pensize(12)
    t.color('black')
    for i in range(30):
        t.forward(2)
        t.right(12)
    go_to(15, 220)
    for i in range(30):
        t.forward(2)
        t.left(12)
    t.pensize(1)

不错不错,越来越有样了。下面我们把鼻子和嘴巴加上。

鼻子 & 嘴巴

鼻子也不难,在眼睛下面画个小圈圈就行,嘴巴就类似一个倒 T 字。

# 鼻子
def nose():
    go_to(-13, 166)
    t.seth(315)
    t.fillcolor(nose_color)
    t.begin_fill()
    t.circle(20)
    t.end_fill()




# 嘴巴
def mouth():
    go_to(0, 156)
    t.seth(270)
    t.fd(100)
    pos = t.pos()
    t.seth(0)
    t.circle(110, 60)
    go_to(pos[0], pos[1])
    t.seth(180)
    t.circle(-110, 60)

离成功就剩下最后一步了,把胡须和铃铛画上就大功告成了。

胡须 & 铃铛

胡须就类似画猫的胡须就好,铃铛表复杂些,大圆套小圆,还有装饰。

# 胡须
def mustache():
    h = 70
    go_to(30, 140)
    t.seth(15)
    t.fd(h)


    go_to(30, 130)
    t.seth(0)
    t.fd(h)


    go_to(30, 120)
    t.seth(-15)
    t.fd(h)


    go_to(-30, 140)
    t.seth(150)
    t.fd(h)


    go_to(-30, 130)
    t.seth(180)
    t.fd(h)


    go_to(-30, 120)
    t.seth(195)
    t.fd(h)


# 铃铛
def bell():
    # 大圆
    go_to(0, 33)
    t.pensize(1)
    t.fillcolor("#FCE341")
    t.begin_fill()
    t.circle(25)
    t.end_fill()


    # 横条纹
    go_to(-15, 22)
    t.seth(0)
    t.forward(42)
    go_to(-18, 17)
    t.seth(0)
    t.forward(47)


    # 小圆
    go_to(5, 0)
    t.pensize(1)
    t.color("black", '#79675D')
    t.begin_fill()
    t.circle(5)
    t.end_fill()
    t.seth(270)
    t.pensize(1)
    t.forward(15)

最后我们写一个入口函数,将这些画身体不同部位的函数给封装起来。代码如下;

if __name__ == '__main__':
    head()
    scarf()
    face()
    eyes()
    fill_eyes()
    nose()
    mouth()
    mustache()
    bell()
    go_to()
    t.hideturtle()
    t.done()

最终效果如下:

是不是觉得很简单,快去后台获取源码 run 起来吧。有兴趣的读者还可以把身体给加上去。

总结

本文我们使用 Python 的 turtle 库画了一下哆啦 A 梦,不知道和大家记忆中的哆啦 A 梦是否一样呢。

其实 turtle 使用不难,主要是要理清乌龟的位置以及朝向,然后就是其运动模式,直线运动,还是曲线运动以及怎调换运动方向。其中乌龟的坐标计算比较麻烦,尤其是做曲线运动的时候,大家可以结合 pos() 函数来获取查看乌龟的坐标,有助于你理清画图思路。

大家多加练习,肯定都可以画出自己想画的,有趣且好玩的图像。

RECOMMEND

推荐阅读

01

《Python数据可视化:基于Bokeh的可视化绘图》

点击链接了解详情并购买

推荐语:从图形绘制、数据动态展示、Web交互等维度全面讲解Bokeh功能和使用,不含复杂数据处理和算法,深入浅出,适合零基础入门,包含大量案例。

02

《机器学习:使用OpenCV和Python进行智能图像处理》

点击链接了解详情并购买

推荐语:基于OpenCV和Python的机器学习实战手册,基础知识与具体实例相结合,并提供大量实例代码,帮你掌握机器学习实用技巧,解决各种不同的机器学习和图像处理问题。

更多精彩回顾

书讯 |9月书讯(下)| 开学季,读新书

书讯 |9月书讯(上)| 开学季,读新书

资讯 |TIOBE 9 月编程语言:C++ 突起、Java 流行度下降

上新 | 一本书带你吃透Nginx应用与运维
书单 | 开学季——计算机专业学生必读的10本畅销经典

干货 | 用户画像从0到100的构建思路

收藏 | 更新!更薄!更精华:《JavaScript编程精解》来了

视频 | 4min视频带你了解阿里B2B电商算法

赠书 |【第21期】以实际项目作驱动,换种方式学Java

相关文章:

  • 红帽资深解决方案架构师魏新宇:云原生应用构建之路
  • 为什么Spark能成为最火的大数据计算引擎?它是怎样工作的?
  • 主题沙龙 | 订阅模式和SaaS 行业的未来
  • 程序员过关斩将——应对高并发系统有没有通用的解决方案呢?
  • 8个流行的Python可视化工具包,总有一款适合你
  • 20张图片梳理工业软件全貌
  • 使用pandas进行数据快捷加载
  • 大数据必备的十大工具
  • SpringBoot基于jar包启动核心原理及流程详解
  • 【第22期】网络安全在身边|最强学习书单整理
  • 从“新基建”重新认识数据中心
  • 还在为面试被问JVM发愁?来看看阿里P7大佬的JVM笔记吧
  • 从“判断力”到“创造力”:GAN在图像生成上的应用
  • Istio进入1.7版本,Service Mesh 落地还有什么障碍?
  • 开源搜索引擎排名第一,Elasticearch是如何做到的?
  • ES6指北【2】—— 箭头函数
  • [译]CSS 居中(Center)方法大合集
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 4个实用的微服务测试策略
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ES6系列(二)变量的解构赋值
  • JS字符串转数字方法总结
  • Laravel核心解读--Facades
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 从tcpdump抓包看TCP/IP协议
  • 对象管理器(defineProperty)学习笔记
  • 坑!为什么View.startAnimation不起作用?
  • 详解移动APP与web APP的区别
  • 找一份好的前端工作,起点很重要
  • 仓管云——企业云erp功能有哪些?
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​​​​​​​​​​​​​​Γ函数
  • #{} 和 ${}区别
  • #QT(智能家居界面-界面切换)
  • #预处理和函数的对比以及条件编译
  • (8)STL算法之替换
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (九)信息融合方式简介
  • (论文阅读30/100)Convolutional Pose Machines
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • 、写入Shellcode到注册表上线
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net 获取url的方法
  • .NET开源快速、强大、免费的电子表格组件
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [ICCV2017]Neural Person Search Machines