不要给糖果制造麻烦,用Python绘制有趣的万圣节南瓜怪物

2023-05-21



















关于万圣节






万圣节又称诸圣节,是每年11月1日的西方传统节日。万圣节前夕的10月31日是这个节日最热闹的时刻。在汉语中,万圣节前夕经常被用来(Halloween)被解读为万圣节(All Saints' Day)。


为了庆祝万圣节的到来,孩子们会打扮成各种可爱的鬼魂,一个接一个地敲门,要求得到糖果,否则他们会制造麻烦。与此同时,据说在这个晚上,各种各样的鬼魂也会打扮成孩子们一起庆祝万圣节的到来,人类会打扮成各种各样的鬼魂,以使鬼魂更加和谐。



不知道什么时候,西方的节日一个个进入了中国,比如情人节、圣诞节、感恩节、万圣节...对于那些整天只知道上网的大学生来说,万圣节的熟悉自然来自于游戏!比如wow






魔兽世界




再或者MapleStory







冒险岛




无论是魔兽世界帖子的发布时间,还是这个老式的2D冒险岛游戏,都代表着我们80后的时代已经过去…








万圣节和Python






最近因为工作忙,会转载一些大佬的优秀文章。今天,我有一些时间想写点什么。快到万圣节了。既然我们坚持python的学习态度,不如用Python画一个万圣节标志。------南瓜怪吧!


提到python制图,难免会提到turtle模块,小海龟就是python中最热门的制图模块,虽然它的作用无法与专业的制图工具相比,但还是可以画出一些简笔画。之所以说turtle只能画一些简笔画,主要是因为学习技巧太浅薄,无法用它来做出高大的作品。另外一个原因当然是我在制图方面没有天赋,从小艺术就不及格啊!但是为了回应情况,还是咬紧牙关去编码吧!








模块turtle






首先,python的turtle库还是小甲鱼的。【Python零基础入门学习】我已经很久没用了,有点生疏。让我们带你回顾一下模块的使用。如果你想努力学习这个数据库,建议去官网仔细看看相关内容:https://docs.python.org/3.7/library/turtle.html但是如果你只是像我一样从娱乐开始,你只需要几分钟就可以开始绘画。在这里,我为大家整理了一些常用的方法:


参数


表明


turtle.setup(width,height,startx,starty)


起点坐标:与屏幕的坐标相比,左上角默认位于屏幕中央。


turtle.bgpic('xxx.png')


将背景图片添加到画板上(记得使用png,jpg不支持)


turtle.begin_fill()


准备开始添加图形


turtle.end_fill()


添充完成


turtle.goto(x,y)


把乌龟带到坐标位置 绝对坐标


turtle.bk(d)


海龟倒退 海龟坐标


turtle.fd(d)


海龟前行


turtle.circle(r,extent,steps)


extent范围(360为一圈),setps感觉空虚,表示正圆,数字表示边数。


turtle.seth(angle)


乌龟变成了绝对的坐标


turtle.left(angle)


左转


turtle.right(angle)


右转


penup()


抬起画笔


pendown()


落下画笔


pencolor()


笔的颜色


pensize()


笔的大小


turtle.colormode(mode)


改变RGB模式,mode=1.0小数值,mode=255整数值 RGB颜色,例如white的RGB总值为:255.255.255,修改数值可改变颜色。


turtle.done()


画完后不要关窗


以上这些内容,已经完全够大家强装13了…








百鸟朝凤图






中国每天晚上的新闻联播节目结束时,总会播放主持人收到稿件的场景。为了告诉观众朋友,主持人说新(段)闻(子)已经写好了!既然要画南瓜怪,就得先打草稿!


每个人都记得星爷唐伯虎点秋香中国,祝枝山一对百鸟向凤图(小鸡吃米图)至今给人留下深刻印象。所以今天,让IT界的王伯虎给你带来以下画轴,名字:这南瓜有点冷


不知这幅画会吸引多少粉丝来取关,没办法他们一定是嫉妒我的才华!







祝枝山在IT界








实现turtle代码代码






第一,为了达到遮盖画功拙劣的效果,我们应该在制图之前,先选择一幅略显美观的背景图,比如:






背景图南瓜怪




因为南瓜不是正圆,所以我们应该画椭圆来达到效果。在我刚刚学习的内容中,有一个turtle.circle(r,extent,steps)方法,其中steps参数值得我们重点分析,首先要看一段代码:


1# -*- coding: utf-8 -*-
 2# @Author   : 王翔
 3# @微信号   : King_Uranus
 4# @公众号   : Python清风
 5# @GitHub   : https://github.com/BreezePython
 6# @Date     : 2019/10/30 22:31
 7# @Software : PyCharm
 8# @version  :Python 3.7.3
 9# @File     : circle.py
10
11import turtle as t
12
13for i in range(3, 10, 2):
14    t.circle(100, steps=i)
15    t.left(90)
16
17t.circle(100, steps=30)
18
19for i in range(30):     # 重复执行i次
20    t.forward(20.93)    # 移动x个单位
21    t.left(12)          # 左转y度
22
23t.done()

效果如下:






steps参数在circle中




事实上,steps参数可以理解为多边形的边数和边数,所以边数越多(30边形),在我们眼里,图形是否趋近和圆润?然后拆分思考,具体的实现能不能理解为画笔画一条直线,然后转动视角,再画一条直线,这样往复,最后转360度,形成一个图形。同样如下:


有些朋友会问1.74是从哪里来的?C = 2πr = 628628/360 = 1.7444… 所以每个度的边长是1.74。



1import turtle as t
2
3for i in range(360):    # 重复执行i次
4    t.forward(1.74)     # 移动x个单位
5    t.left(1)           # 偏移弧度
6
7t.circle(100)





圆绘图分析




知道了这一点,下来就要考虑怎么画椭圆了。之所以是圆,是因为每边都一样,所以如果每边都不一样,会不会造成椭圆效果?现在我们用这种方式画南瓜形状:


1import turtle as t
 2
 3t.speed(10)
 4t.pensize(6)
 5t.hideturtle()
 6t.screensize()
 7t.bgcolor('black')
 8t.bgpic('dark_night.png')
 9t.color('#CF5E1A', '#CF5E1A')
10
11#  绘制南瓜
12t.penup()
13t.goto(250, 30)
14t.pendown()
15t.seth(90)
16t.begin_fill()
17for j in range(25):
18    t.fd(j)
19    t.left(3.6)
20for j in range(25, 0, -1):
21    t.fd(j)
22    t.left(3.6)
23t.seth(-90)
24t.circle(254, 180)
25t.end_fill()
26
27t.done()






南瓜外形




南瓜把儿比较简单,只需将画笔调粗,然后画一段弧度即可。双眼处理方法与南瓜顶盖相似,不再赘述。








最后效果








最后效果图




总体代码:


1# -*- coding: utf-8 -*-
  2# @Author   : 王翔
  3# @WeChat   : King_Uranus
  4# @公众号    : Python清风
  5# @GitHub   : https://github.com/BreezePython
  6# @Date     : 2019/10/29 22:30
  7# @Software : PyCharm
  8# @version  :Python 3.7.3
  9# @File     : PumpkinMonster.py
 10
 11
 12import turtle as t
 13
 14
 15def init():
 16    # 初始化
 17    t.bgpic('dark_night.png')
 18    t.screensize(500, 500, bg='white')
 19    t.speed(10)
 20    t.hideturtle()
 21    t.bgcolor('black')
 22    t.bgpic('dark_night.png')
 23
 24
 25def outline():
 26    #  画出南瓜的轮廓
 27    t.color('#CF5E1A', '#CF5E1A')
 28    t.penup()
 29    t.goto(250, 30)
 30    t.pendown()
 31    t.seth(90)
 32    t.begin_fill()
 33    for j in range(25):
 34        t.fd(j)
 35        t.left(3.6)
 36    for j in range(25, 0, -1):
 37        t.fd(j)
 38        t.left(3.6)
 39    t.seth(-90)
 40    t.circle(254, 180)
 41    t.end_fill()
 42
 43
 44def tail():
 45    # 绘制南瓜枝
 46    t.penup()
 47    t.goto(0, 180)
 48    t.pendown()
 49    t.color(#2E3C01')
 50    t.seth(100)
 51    t.pensize(25)
 52    t.circle(60, 100)
 53
 54
 55def eyes(args):
 56    # 双眼
 57    for items in args:
 58        position, angle, direction = items
 59        t.pensize(6)
 60        t.penup()
 61        t.goto(position, 0)
 62        t.pendown()
 63        t.color(#4C180D', #4C180D'
 64        t.begin_fill()
 65        t.seth(angle)
 66        for j in range(55):
 67            t.fd(3)
 68            if direction:
 69                t.left(3)  # 左转3度
 70            else:
 71                t.right(3)  # 左转3度
 72        t.goto(position, 0)
 73        t.end_fill()
 74
 75
 76def nose():
 77    # 鼻子
 78    t.penup()
 79    t.goto(0, 0)
 80    t.seth(180)
 81    t.pendown()
 82    t.begin_fill()
 83    t.circle(50, steps=3)
 84    t.end_fill()
 85
 86
 87def mouth():
 88    # 嘴巴
 89    t.color('#F9D503', #F9D503'
 90    t.pensize(6)
 91    t.penup()
 92    t.penup()
 93    t.goto(-150, -100)
 94    t.pendown()
 95    t.begin_fill()
 96    t.seth(-30)
 97    t.fd(100)
 98    t.left(90)
 99    t.fd(30)
100    t.right(90)
101    t.fd(60)
102    t.left(60)
103    t.fd(60)
104    t.right(90)
105    t.fd(30)
106    t.left(90)
107    t.fd(100)
108    t.end_fill()
109    t.done()
110
111
112if __name__ == '__main__':
113    init()
114    outline()
115    tail()
116    eyes_items = [(-60, 230, 0), (60, -50, 1)]
117    eyes(eyes_items)
118    nose()
119    mouth()
120    t.done()





END





本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com