美文网首页
残党福音:用Python画出机器人Dev~

残党福音:用Python画出机器人Dev~

作者: 71ace8f2cfbd | 来源:发表于2020-05-25 10:25 被阅读0次

今天带大家一起编写一个好玩的程序,你准备好了吗?

话不多说,让我们直接进去主题~

你知道下面这张图片中的角色是谁吗? 

猜猜我是谁

我相信,只要你参加了2020年第二届国际青少年编程大赛,就一定认识它!

没错,它就是比赛中的主角,人见人爱的超级机器人Dev!

这个造型讨喜的机器人陪伴我们度过了许许多多个欢乐的日子,它不仅带给我们知识,还带给了我们快乐。一定有很多选手对它优美的外形印象深刻,甚至还能将它画下来。

我的一位参赛学生也想将它画下来,但让他苦恼的是,他并不是那么擅长画画。作为他的编程老师,我也希望帮助到他。于是,我们不约而同地产生了一个念头:既然是编程大赛,为什么我们不用Python代码来绘制一个Dev呢?

经过不断的探索和实验,我们最终完成了下图中的作品。而这个作品,仅仅用到了椭圆、长方形和线段三种图形。很神奇吧?如果想知道这是如何完成的,就跟着我们的文章一步一步地探索吧!

用Python代码绘制的Dev形象

准备工作

工欲善其事,必先利其器。在开始制作前,我们首先要准备好制作的工具。Python的开源库非常丰富,在图形方面有许多好用的资源,它们各有特色,许多库都可以实现类似的效果。作为一名编程教师,这个作品我门自然而然的选择了我们公司自研的Python图形库:pyleap。

借助pyleap库,我们可以绘制常见图形、图片以及文字,可以检测到鼠标和键盘的时间,还能够实现动画效果和碰撞的检测,很方便地就能完成一些具有交互功能的图形化作品。

在这个作品中,我们要用到的知识点非常少:椭圆的绘制,长方形的绘制,线段的绘制以及图形的旋转。

pyleap中的图形对象

图形创作

选定了工具,就进入了创作阶段。在创作Dev时,最困难的地方就是它的身体,眼睛的反光以及身上的橙色装饰线。这些部分都是没有办法直接用简单的单个图形来绘制的。为了解决这些难点,我们探索出了3个秘籍:组合、遮盖和细分。

组合

有些图形,很难直接用一个图形绘制出来,比如Dev的手:

Dev的手上有两种颜色,但一个图形只能有一种颜色。不过这难不倒我们,我们只需要用两个不同颜色的椭圆组合起来就行了。下图演示了这个过程:

用两个椭圆组合成Dev的手

组合的方式在绘制过程中使用得非常多。例如,Dev头顶的绘制也使用了类似的方式:

我来组成头部

还有哪些地方可以用到这种方式呢?请你也自己探索一下吧!

遮盖

有些部分,不能用简单组合的方式来绘制,我们必须要善用遮盖关系来制作。例如,Dev的眼睛是由简单的椭圆形来组成的,但要做出立体的感觉,还必须得用到遮盖的技巧。

下图演示了如何制作出玻璃上不规则反光的效果:

反光效果是实现玻璃突出效果的关键  

还有一个不太明显的地方也用到了遮盖的办法:Dev的身体。在Dev身体的遮盖关系中,我们用了描边的方式来画椭圆,巧妙地绘制出了Dev身体的形状。

用椭圆形的描边来进行遮盖

将已经制作好的Dev的头顶添加上去,就组成了Dev的主体。

遮盖的位置非常考验技巧

只要用于遮盖的图形和背景颜色一致,就不会看到组合的痕迹。

让多余的图形融入黑暗中

细分

对于Dev身体上的曲线,我们可以用细分的方式来呈现,这和古代数学家刘徽求圆周率时使用的“割圆术”,就是将曲线化作直线来处理,这其中也蕴含了数学的微分思想。

刘徽的割圆术

如图所示,只需要四条线段,就能组成Dev腰上的曲线:

图中用不同颜色标出了不同的线段  

同样的,Dev头顶的曲线也可以这样完成,这里就不再赘述了。

总之,掌握了这三种方法,加以灵活运用,就能够组成一个可爱的Dev形象了。

代码实现

我们已经确定了用简单图形绘制Dev的可能性,现在就要用代码来实现了。我们要使用的图形在pyleap中分别属于三个类:Ellipse(椭圆),Rectangle(长方形),Line(线段)。

在使用这些图形时,我们还需要对它们进行一些旋转,因此还会用到rotation属性。同时,我们还需要用set_anchor方法来设置一些特殊的旋转中心。

在绘制时,可以用draw方法来填充绘制,也可以用stroke方法绘制描边。

具体的代码知识就不在这里展开了。我会在文章最后列出完整的代码,如果你感兴趣,可以自己去研究pyleap库和我的代码,相信这会为你打开新的世界。

说在最后

最后,我想说一些自己的感想:

都说兴趣是最好的老师,看到我的学生在这次比赛中的表现,我觉得我们的学生缺少的不是好奇心和探究精神,而是优秀的教学内容和愿意和他一起成长的伙伴和老师。

很高兴能看到有这样免费的优秀资源,可以让所有学生都对编程知识感兴趣,让他们体验到编程的魅力。希望有更多的老师和学生加入到比赛中来,也希望有更多的优秀内容被分享给所有学生,少年强则中国强,这是我辈不可推卸的责任。

附:完整代码

在运行前,需要安装Python3和pyleap库。

Python3的安装方法百度即可;

Python3安装完成后,可以在命令行里使用pip install pyleap命令快速安装pyleap库。

frompyleapimport*

window.set_size(400,600)

bg=Rectangle(0,0,400,600,"black")

e1=Ellipse(200,570,112,380,"#afc4f8")

e2=Ellipse(200,400,100,60,"#dce7f9")

e3=Ellipse(200,415,90,50,"#f8f8f9")

e4=Ellipse(245,320,35,45,"#f8f8f9")

e5 = Ellipse(250, 320, 28, 35, "#27e3fe")

e6 = Ellipse(247, 325, 25, 32, "#203be5")

e7 = Ellipse(244, 335, 12, 22, "#ecf1f9")

e8 = Ellipse(250, 322, 7, 20, "#203be5")

e9 = Ellipse(145, 285, 45, 55, "#f88033")

e10 = Ellipse(205, 590, 150, 410, "black")

e11 = Ellipse(125, 280, 25, 53, "#afc4f8")

e12 = Ellipse(120, 285, 22, 50, "#f8f8f9")

e13 = Ellipse(140, 284, 42, 55, "#f7ac49")

e16 = Ellipse(270, 295, 25, 53, "#dae6f9")

e17 = Ellipse(265, 291, 20, 75, "#afc4f8")

r1 = Rectangle(0, 400, 400, 200, "black")

n1 = Line(195, 270, 210, 265, 2, "#f88033")

n2 = Line(210, 265, 233, 264, 2, "#f88033")

n3 = Line(233, 264, 258, 273, 2, "#f88033")

n4 = Line(258, 273, 275, 290, 2, "#f88033")

n5 = Line(251, 362, 250, 385, 4, "#afc4f8")

n6 = Line(250, 385, 240, 410, 3, "#afc4f8")

n7 = Line(240, 410, 215, 436, 2, "#afc4f8")

n8 = Line(215, 436, 182, 453, 2, "#dce7f9")

n9 = Line(182, 453, 156, 456, 2, "#dce7f9")

e18 = Ellipse(166, 453, 20, 8, "#afc4f8")

n10 = Line(155, 455, 135, 480, 10, "#dce7f9")

c1 = Ellipse(126, 492, 18, 18, "#8c5179")

c2 = Ellipse(123, 495, 14, 14, "#a2617f")

c3 = Ellipse(118, 500, 5, 5, "#af9f7f")

e4.rotation =  -20

e5.rotation =  -20

e6.rotation =  -30

e7.rotation =  -50

e8.rotation =  -55

e9.rotation =  50

e10.line_width = 35

e11.set_anchor(120, 320)

e12.set_anchor(120, 320)

e11.rotation = -10

e12.rotation = -10

e13.rotation =  50

e16.set_anchor(255, 325)

e17.set_anchor(255, 320)

e16.rotation = 15

e17.rotation = -20

e18.rotation = 10

def draw(dt):

window.clear()

bg.draw()

e1.draw()

r1.draw()

e2.draw()

e3.draw()

e9.draw()

e13.draw()

e10.stroke()

n5.draw()

n6.draw()

n7.draw()

n8.draw()

n9.draw()

e16.draw()

e17.draw()

e4.draw()

e5.draw()

e6.draw()

e7.draw()

e8.draw()

e11.draw()

e12.draw()

n1.draw()

n2.draw()

n3.draw()

n4.draw()

n10.draw()

e18.draw()

c1.draw()

c2.draw()

c3.draw()

repeat(draw)

run()

继续探索:让Dev动起来

添加一些简单的代码,就可以让代码绘制的Dev动起来,大家好好研究一下!

把你的答案写在留言区,跟大家一起来讨论吧~

相关文章

网友评论

      本文标题:残党福音:用Python画出机器人Dev~

      本文链接:https://www.haomeiwen.com/subject/iabeahtx.html