书名:Python趣味创意编程
ISBN:978-7-115-55175-7
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 童 晶
责任编辑 陈冀康
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书基于Python编程,实现了15个有趣的互动场景,循序渐进地向读者展示了这些场景的实现过程,帮助读者学习和掌握Python编程。全书共16章,讲解了Python基本语句、算术运算符、字符串、循环、全局变量、选择判断、随机函数、列表、函数、复合运算符、递归、面向对象编程等入门知识,同时涉及Processing软件的配置、绘制、帧率、鼠标键盘互动、字符串处理、文字处理、音视频处理等使用方法。此外还简要介绍了RGB颜色模型、HSB颜色模型、图像、人脸检测的基本概念,方便读者利用自己的创意来进行进一步的发挥和创造。附录A给出了书中练习题的参考答案,附录B给出了书中基本概念的索引。
本书适合对Python编程、互动艺术、创意编程、Processing开发感兴趣的读者阅读,也可以作为中学生、大学生互动艺术课程的教材和程序设计课程的参考教材。
随着人工智能时代的来临,计算机软件在日常生活中起到越来越重要的作用,编写计算机程序极有可能成为未来社会的一项重要生存技能。在众多的文本式编程语言中,Python语法简单、上手容易、功能强大、应用广泛,越来越得到初学者的青睐。
然而,目前大部分Python图书都会先系统讲解语法知识,知识量大,读者学习困难;所举实例一般偏数学算法,过于抽象,趣味性不强,读者不愿写程序,进而觉得入门困难。也有部分图书基于海龟绘图,利用代码绘制几何图形吸引读者兴趣;然而海龟绘图功能简单、不支持互动、趣味性一般。
针对以上问题,本书把互动艺术、创意编程应用于Python教学,通过15个由易到难的有趣案例,带领读者从零基础开始学习。书中不安排专门章节讲解语法知识,而是穿插在互动创意程序开发的过程中,通过具体案例逐步学习新的语法知识,便于读者理解,并在实际应用中体会。书中案例经过精心的设计,所有代码均不超过100行,适合上手。学习编程时,读者看到用Python可以编出好看、好玩的程序,感到有趣、有成就感,就会自己钻研,与他人积极互动,学习效果也会得到显著提升。
本书通过创意编程案例逐步引入语法知识,用Python从无到有地开发,提升读者对编程的兴趣和能力。全书共16章和两个附录。
第1章介绍了计算机程序和Python编程语言的基本概念,介绍了互动艺术开发工具Processing的下载安装。
第2章介绍了整数、变量、算术运算符等语法知识,实现了一个转动眼珠的圆脸(20行代码)。
第3章介绍了for循环语句、整除、取余等语法知识,实现了催眠的同心圆(12行代码)。
第4章介绍了if选择判断、比较大小运算符、逻辑运算符等语法知识,实现了旋转的圆弧(23行代码)。
第5章介绍了类型转换,实现了鼠标交互的简易毛笔字(52行代码)。
第6章介绍了循环嵌套、中文字符串处理,实现了旋转的方块(19行代码)。
第7章介绍了随机函数、RGB颜色模型,实现了随机扭动的曲线(33行代码)。
第8章介绍了列表,实现了随风飘动的多个粒子(38行代码)。
第9章介绍了无参数函数的定义、复合运算符,实现了互相作用的圆球(52行代码)。
第10章介绍了带参数的函数、HSB颜色模型,实现了随机山水画(52行代码)。
第11章介绍了函数的递归调用、if-elif-else语句,绘制了递归分形树(62行代码)。
第12章介绍了面向对象编程,包括类和对象、成员变量、成员函数、构造函数等语法知识,实现了粒子同心圆(43行代码)。
第13章介绍了while循环语句、图像的基本概念,实现了图像像素采样效果(28行代码)。
第14章介绍了字符串元素的处理,实现了定制字符画的效果(34行代码)。
第15章利用Minim库进行音频信号的处理,实现了一种音乐可视化的效果(60行代码)。
第16章利用Video库进行摄像头视频的获取与处理、OpenCV库进行人脸的实时检测跟踪,实现了坚持一百秒的体感游戏(98行代码)。
附录A给出了书中所有练习题的参考答案。
附录B列出了Python语法知识在书中出现的对应位置。
和市面上同类图书相比,本书有以下几个鲜明的特色。
为初学者量身打造。一般的Python图书会系统讲解所有的语法知识,初学者记忆负担大、学习难度高;本书先讲解较少的语法知识,然后利用这些语法知识编写互动创意程序,通过案例逐步引入新的语法知识,便于读者学习理解。案例从易到难,所有程序的代码均不超过100行,且提供了实现过程的分步骤代码,适合上手学习。
趣味性强。大部分Python图书案例偏抽象、枯燥乏味,读者不感兴趣;本书精选了15个案例,涵盖了多种互动艺术、创意编程的类型,读者在做出这些趣味程序的过程中,会有很强的成就感。分解了案例的实现过程,每个步骤的学习成本较低,读者很容易就能体验到编程的乐趣,即时反馈提升学习兴趣。
提升可拓展性强。本书所有章节均提供了练习题,加深读者对Python语法知识、开发方法的理解,锻炼逻辑思维,提升认识问题、解决问题的能力。附录中提供了所有练习题的参考答案,每章小结列出了进一步实践的方向。
本书适合任何对计算机编程感兴趣的人,不论是孩子还是家长、学生还是职场人士。
本书适合学习过其他编程语言,想快速学习Python的人。
本书可以作为中学生和大学生学习程序设计的教材、培训机构的参考教材,也可以作为编程爱好者的自学用书。
本书适合对互动艺术、创意编程、Processing开发感兴趣的人,也可以作为中学生、大学生互动艺术课程的学习教材。
每章的开头会介绍该章案例效果、实现的主要思路。读者可以先观看对应的效果视频、运行最终版本的代码,对本章的学习目标有个直观的了解。
创意编程案例会分成多个步骤,从零开始一步一步实现,书中列出了每个步骤的实现目标、实现思路、相应的参考代码。读者可以先在前一个步骤代码的基础上,尝试写出下一个步骤的代码,碰到困难可以参考电子资源中的示例代码、讲解视频。
在语法知识、案例的讲解后会列出一些练习题,读者也可以先自己实践,再参考附录A中给出的答案。每章小结给出的进一步实践方向,读者也可以根据自己的兴趣尝试。
读者可以利用附录B查阅相应的Python语法知识,对于本书没有涉及的内容,读者也可以在线搜索,或者咨询周围的老师、同学。
本书提供了所有案例的分步骤代码、练习题参考答案、图片音效素材、演示视频,读者可以从异步社区下载。
童晶,浙江大学计算机专业博士,河海大学计算机系副教授、硕士生导师,中科院兼职副研究员。主要从事计算机图形学、数字化艺术、虚拟现实、三维打印等方向的研究,发表学术论文30余篇,曾获中国发明创业成果奖一等奖、浙江省自然科学奖二等奖、常州市自然科学优秀科技论文一等奖。
具有15年的一线编程教学经验,被评为河海大学优秀主讲教师。开设课程在校内广受好评,在知乎、网易云课堂、中国大学MOOC等线上平台已有上百万次的阅读量与学习量。
积极投身教学与学生创新,指导学生获得英特尔嵌入式比赛全国一等奖、“挑战杯”全国三等奖、“中国软件杯”全国一等奖、中国大学生服务外包大赛全国一等奖等众多奖项。
首先感谢我的学生们,当老师最有成就感的就是看到学生成长并得到学生的认可。也是你们的支持和鼓励,让我在漫长的写作过程中坚持下来。
感谢人民邮电出版社的陈冀康编辑,本书是在他的一再推动下完成的。
最后感谢我的家人,在这个不平凡的夏天支持我埋头写作。
作者
2020年6月
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供以下资源:
配套资源代码和素材;
书中程序演示视频;
书中习题答案。
要获得以上配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入错误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
如今,我们的生活已经离不开程序,用计算机写文章、做PPT、看新闻、用手机聊天、听音乐、玩游戏,甚至电冰箱、空调、汽车、飞机上,都运行着各种各样的程序。
所谓计算机程序,就是指让计算机可以执行的指令。我们和外国人交流,可能会需要使用外语;而要让计算机执行相应的任务,则必须用计算机能够理解的语言。
和人类的语言一样,计算机能懂的语言(也称为编程语言)有很多种。在众多编程语言中,Python语法简单、上手容易。图1-1为用C、Python两种编程语言让计算机输出“你好”的代码,可以看出Python的实现要简单很多。
另外,Python的功能强大,且被广泛应用于人工智能、网络爬虫、数据分析、网站开发、系统运维、游戏开发、互动艺术等多个领域,成为近年来最为热门的编程语言之一。
图1-1
要编写Python代码,让计算机读懂Python程序,我们还需要安装Python开发环境,本书利用Processing进行Python的编程学习。
Processing诞生于美国麻省理工学院媒体实验室,其以数字化艺术为背景,可以利用编程实现多种形式的互动艺术。读者可以打开Processing官方网站,找到合适的版本下载,如图1-2所示。
图1-2
如果读者电脑为Windows 64位版本,则可以点击下载对应的processing-3.5.4-windows64.zip文件。解压后,双击processing.exe打开Processing程序,界面如图1-3所示。
Processing默认编程语言为Java,为了能用Python语言进行编程,点击右上角的Java,在弹出菜单中选择“添加模式”,如图1-4所示。
图1-3
图1-4
在弹出的窗口中,选择“Python Mode for Processing 3”,点击“Install”,Processing会自动下载配置,直到安装成功,如图1-5所示。
图1-5
点击右上角选择“Python”模式,然后点击左上角运行按钮,Processing会弹出一个小窗口,说明配置成功,如图1-6所示。
图1-6
点击运行按钮右侧的停止按钮,小窗口自动关闭。
提示
如果Python Mode下载速度过慢,读者也可以在GitHub搜索“processing. py”并直接下载文件,将其复制到“文件”—“偏好设定”—“速写本位置”的对应目录下,重启Processing,即可以直接使用Python编程模式。
这一章主要阐明了计算机程序和Python编程语言的基本概念,介绍了Processing的下载、配置方法,第2章起我们将开始趣味创意编程的学习开发。
本章我们将实现一个转动眼珠的圆脸,利用圆圈绘制一个圆脸,眼珠随着鼠标移动而转动,效果如图2-1所示。
图2-1
我们首先实现圆的绘制,同时学习整数和算术运算符;然后学习变量的定义和使用,并设定背景和圆的亮度;接着实现跟随鼠标移动的圆圈,从而实现转动的眼珠;最后综合利用所学知识,实现转动眼珠的圆脸。
本章案例最终代码一共20行,代码参看“配套资源\第2章\sketch_2_8_3\ sketch_2_8_3.pyde”,视频效果参看“配套资源\第2章\转动眼珠的圆脸 .mp4”。
读者可以在Processing中键入以下代码,并点击运行按钮,如图2-2所示。
sketch_2_1_1.pyde
1 circle(50, 50, 80)
图2-2
运行效果如图2-3所示,在窗口中画了一个圆。
circle(50, 50, 80)语句绘制了一个圆圈。circle为圆的英文单词,圆括号中的三个参数,(50, 50)表示圆的中心位置坐标,80表示圆的直径[1]。
图2-3
提示
Python语句中的标点符号,比如sketch_2_1_1.pyde中的括号“()”、逗号“,”都是英文标点符号(即半角标点符号),如果输入的是中文标点符号(即全角标点符号),则会提示程序错误。
提示
如果读者编写代码出错,可以参考本书配套电子资源中的代码。注意Processing的代码文件需要保存在其同名的文件夹下,如sketch_2_1_1.pyde保存在“第2章\ sketch_2_1_1\”目录下。
图2-3中程序绘制区域的大小默认为宽100px、高100px。键入以下代码,可以设置程序窗口的大小(size):
sketch_2_1_2.pyde
1 size(640,480)
2 circle(50, 50, 80)
size(640,480)设定窗口的宽度640px、高度480px,运行效果如图2-4所示。
图2-4
程序窗口的绘制区域采用直角坐标系,左上角的坐标为(0,0)。横轴方向由X坐标表示,取值范围为0~640;纵轴坐标由Y坐标表示,取值范围为0~480。窗口中任一点的位置可由其(X,Y)坐标来表示。
修改圆心坐标,我们可以在窗口正中心绘制一个圆(如图2-5所示):
sketch_2_1_3.pyde
1 size(640,480)
2 circle(320, 240, 80)
图2-5
也可以修改圆的直径,绘制更大一些的圆圈(如图2-6所示):
sketch_2_1_4.pyde
1 size(640,480)
2 circle(320, 240, 200)
图2-6
练习2-1:修改sketch_2_1_4.pyde,绘制出图2-7中的绘制效果。
图2-7
输入以下代码:
sketch_2_2_1.pyde
1 print(100)
运行后Processing下方的控制台内输出“100”,如图2-8所示。
图2-8
100为整数,print()函数可以将括号内的数值在控制台输出出来。另外,整数之间也可以进行加、减、乘、除四则运算,在Python中分别用+、-、*、/ 四个符号表示:
sketch_2_2_2.pyde
1 print(1+1)
2 print(7-4)
3 print(3*2)
4 print(18/2)
运行后输出:
要让圆圈正好在画面中间(如图2-9所示),我们可以利用除法:
sketch_2_2_3.pyde
1 size(640,480)
2 circle(640/2, 480/2, 480)
图2-9
利用多个circle()语句,可以绘制多个圆圈。运行以下代码,即可在对应坐标位置绘制出图2-10中所示的三个圆圈。
sketch_2_3_1.pyde
1 size(600,400)
2 circle(150, 200, 50)
3 circle(300, 200, 50)
4 circle(450, 200, 50)
图2-10
我们可以修改代码,将这三个圆圈变大(如图2-11所示):
sketch_2_3_2.pyde
1 size(600,400)
2 circle(150, 200, 100)
3 circle(300, 200, 100)
4 circle(450, 200, 100)
图2-11
练习2-2:编写代码,绘制出图2-12所示的同心圆。
图2-12
提示
后画的图形会覆盖在先前画的图形上面,所以要先画大圆,再画小圆。
sketch_2_3_2.pyde中修改三个圆的直径,要修改三个数字,能否有更简单的方法?本节学习变量的概念,利用变量来存储、修改多个圆圈的参数。
变量可以记录程序中的一些内容,比如:
sketch_2_4_1.pyde
1 diameter = 100
2 print(diameter)
diameter就是一个变量,这里记录了数字100的信息。print(diameter)函数可以输出变量所存储的内容。点击运行,Processing的控制台输出:
变量的值也可以进行修改,不同变量之间也可以相互赋值。
sketch_2_4_2.pyde
1 r = 1
2 print(r)
3 r = 2
4 print(r)
5 t = r
6 print(t)
运行后输出:
其中t = r表示将变量r的值赋给变量t,运行第5行代码后,变量t的值也等于2。
变量和数字之间,也支持加、减、乘、除运算,在Python中分别用+、-、*、/四个符号来表示:
sketch_2_4_3.pyde
1 r = 1
2 print(r)
3 r = r+2
4 print(r)
5 t = r-1
6 print(t)
7 t = t*3
8 print(t)
9 s = t/(r-1)
10 print(s)
运行后输出:
提示
变量的名字可以是字母、下划线、数字组成,开头不能是数字。变量名不能使用Processing及Python中已经使用的关键词,比如circle、size、print。另外,变量中大写字母、小写字母是区分的,不同的大小写表示不同的变量。
应用变量diameter记录圆圈的直径,将sketch_2_3_1.pyde修改为:
sketch_2_4_4.pyde
1 size(600,400)
2 diameter = 50
3 circle(150, 200, diameter)
4 circle(300, 200, diameter)
5 circle(450, 200, diameter)
运行效果同sketch_2_3_1.pyde一样,如图2-13所示。
图2-13
只需将sketch_2_4_4.pyde第2行代码修改为:diameter = 150,即可同时修改三个圆圈的直径大小,如图2-14所示。
图2-14
Processing还提供了两个系统变量width、height,表示画面的宽度、高度,读者可以输入并运行以下代码:
sketch_2_4_5.pyde
1 size(600,400)
2 print(width)
3 print(height)
输出画面的宽度和高度:
利用width、height,可以修改sketch_2_4_4.pyde,让三个小圆圈均匀分布在画面中间:
sketch_2_4_6.pyde
1 size(600,400)
2 diameter = 50
3 circle(1*width/4, height/2, diameter)
4 circle(2*width/4, height/2, diameter)
5 circle(3*width/4, height/2, diameter)
读者可以设置size()中画面的宽度、高度,修改圆圈直径大小,三个圆圈仍然均匀分布在画面中(如图2-15所示):
sketch_2_4_7.pyde
1 size(800,400)
2 diameter = 150
3 circle(1*width/4, height/2, diameter)
4 circle(2*width/4, height/2, diameter)
5 circle(3*width/4, height/2, diameter)
图2-15
分别输入并运行以下代码,可以得到图2-16的对应效果:
sketch_2_5_1.pyde
1 size(200,200)
2 background(0)
sketch_2_5_2.pyde
1 size(200,200)
2 background(100)
sketch_2_5_3.pyde
1 size(200,200)
2 background(255)
background(0) background(100) background(255)
图2-16
其中background()函数可以设定背景的亮度:数字0为最暗,显示纯黑色;255为最亮,显示纯白色;(0,255)之间的数字显示灰色,数值越大亮度越高。
另外,也可以利用fill()函数,设置绘制圆圈的颜色:
sketch_2_5_4.pyde
1 size(800,400)
2 background(255)
3 diameter = 150
4 fill(200)
5 circle(1*width/4, height/2, diameter)
6 fill(100)
7 circle(2*width/4, height/2, diameter)
8 fill(0)
9 circle(3*width/4, height/2, diameter)
运行效果如图2-17所示:
图2-17
代码第2行background(255)设置背景为白色。
第4行fill(200)设定亮度为200,第5行以此亮度绘制最左边的圆圈。
第6行fill(100)设定亮度为100,第7行以此亮度绘制中间的圆圈。
第8行fill(0)设定亮度为0,第9行以此亮度绘制最右边的圆圈。
提示
不利用background()、fill()函数设置时,Processing默认背景为灰色、圆圈等图形填充为白色。
练习2-3:编写代码,绘制出图2-18所示的同心圆。
图2-18
输入并运行以下代码,运行效果如图2-19所示。
sketch_2_6_1.pyde
1 def setup():
2 size(600, 600)
3
4 def draw():
5 circle(300,300,100)
图2-19
def setup(): 表示定义初始化函数,冒号后面的语句进行具体初始化的工作。size(600, 600)表示设定窗口宽600px、高600px。
def draw(): 表示定义绘制函数,冒号后面的语句进行具体绘制的工作。circle(300,300,100)表示在(300,300)处绘制了一个直径为100的圆圈。
程序运行时仅运行一次setup()函数,进行相关的初始化设定。初始化后每帧重复执行draw()函数,进行相关的绘制工作。
提示
函数内的语句需要缩进,比如setup()函数内的size(600, 600)语句前面要空出一些,draw()函数内的circle(300,300,100)语句前面也要空出一些。Python中可以用空格,或者Tab键来实现代码向右缩进。同一函数内部的多行语句,需要缩进一致,即最左边需要对齐。
Processing还提供了两个系统变量mouseX、mouseY,表示鼠标位置的X、Y坐标。读者可以输入并运行以下代码,需要注意变量名的大小写:
sketch_2_6_2.pyde
1 def setup():
2 size(600, 600)
3
4 def draw():
5 circle(mouseX,mouseY,100)
circle(mouseX,mouseY,100)在鼠标位置处绘制直径为100的圆。由于draw()函数每帧重复执行,当鼠标在窗口中移动时,会在不同位置绘制相应的圆圈,如图2-20所示。
图2-20
如果想画面中只显示一个圆圈跟随鼠标移动,可以在draw()函数中添加background()函数:
sketch_2_6_3.pyde
1 def setup():
2 size(600, 600)
3
4 def draw():
5 background(200)
6 circle(mouseX,mouseY,100)
draw()函数每次绘制时,首先用灰色填充整个画面,然后在鼠标位置处绘制一个圆圈,效果如图2-21所示。
图2-21
首先绘制如图2-22所示的两个圆圈,并让较小的黑色圆圈跟随鼠标位置移动:
sketch_2_7_1.pyde
1 def setup():
2 size(600, 600)
3
4 def draw():
5 background(255)
6 fill(235)
7 circle(300,300,200)
8 fill(0)
9 circle(mouseX,mouseY,100)
图2-22
为了让黑色圆圈的移动范围不超出灰色圆圈的范围,可以使用Processing提供的map()函数:
sketch_2_7_2.pyde
1 def setup():
2 size(600, 600)
3
4 def draw():
5 background(255)
6 fill(235)
7 circle(300,300,200)
8 fill(0)
9 x = map(mouseX,0,width,260,340)
10 y = map(mouseY,0,height,260,340)
11 circle(x,y,100)
鼠标水平方向坐标mouseX的取值范围为[0,width];为了防止黑色小圆圈超出范围,设定其圆心的x坐标范围为[260,340]。map(mouseX,0,width, 260,340)函数即把范围[0,width]内的mouseX等比例的映射到范围[260,340]内,如图2-23所示。
对于纵坐标,map(mouseY,0,height,260,340)函数即把范围[0,height]内的mouseY等比例的映射到范围[260,340]内。
图2-23
提示
当读者不熟悉Processing的某些函数时,可以点击“Help”—“References”获取帮助,如图2-24所示。
图2-24
Processing会在浏览器中打开帮助网页,如图2-25所示。
图2-25
读者可以找到“map()”,点击查看详细的帮助文档,如图2-26所示。
也可以点击网页左侧的“Tutorials”或“Examples”,查看更多的帮助、示例代码信息。
图2-26
在sketch_2_7_2.pyde基础上添加一个圆圈,可以实现眼珠随鼠标转动的效果(如图2-27所示):
sketch_2_7_3.pyde
1 def setup():
2 size(600, 600)
3
4 def draw():
5 background(255)
6 fill(180)
7 circle(300,300,300)
8 fill(235)
9 x1 = map(mouseX,0,width,260,340)
10 y1 = map(mouseY,0,height,260,340)
11 circle(x1,y1,200)
12 fill(0)
13 x2 = map(mouseX,0,width,220,380)
14 y2 = map(mouseY,0,height,220,380)
15 circle(x2,y2,100)
图2-27
以下代码用圆圈绘制一个如图2-28所示的圆脸,读者可以尝试理解:
sketch_2_8_1.pyde
1 def setup():
2 size(800, 600)
3
4 def draw():
5 background(255)
6 fill(255)
7 circle(400, 300, 500)
8 circle(305, 180, 180)
9 circle(495, 180, 180)
10 circle(400, 300, 40)
11 circle(400, 420, 140)
12 fill(0)
13 circle(275, 180, 110)
14 circle(465, 180, 110)
图2-28
添加代码,让眼珠随着鼠标而转动:
sketch_2_8_2.pyde
1 def setup():
2 size(800, 600)
3
4 def draw():
5 background(255)
6 fill(255)
7 circle(400, 300, 500)
8 circle(305, 180, 180)
9 circle(495, 180, 180)
10 circle(400, 300, 40)
11 circle(400, 420, 140)
12 fill(0)
13 x1 = map(mouseX,0,width,280,330)
14 y1 = map(mouseY,0,height,155,195)
15 circle(x1, y1, 110)
16 x2 = map(mouseX,0,width,470,520)
17 y2 = map(mouseY,0,height,155,195)
18 circle(x2, y2, 110)
当我们的代码比较多时,可以适当加一些注释。所谓注释,就是一些说明的文字,不参与程序运行。注释的格式是“# 注释内容”。以下为加上注释的完整代码,这样就可以比较清楚地了解各种代码的功能、变量的含义等信息:
sketch_2_8_3.pyde
1 def setup(): # 初始化函数,仅运行一次
2 size(800, 600) # 设定画面宽度、高度
3
4 def draw(): # 绘制函数,每帧重复运行
5 background(255) # 设置白色背景,并覆盖整个画面
6 fill(255) # 设置填充色为白色(默认黑色线条)
7 circle(400, 300, 500) # 绘制圆脸
8 circle(305, 180, 180) # 绘制左眼边框
9 circle(495, 180, 180) # 绘制右眼边框
10 circle(400, 300, 40) # 绘制鼻子
11 circle(400, 420, 140) # 绘制嘴巴
12 fill(0) # 设置填充色为黑色(用于绘制眼珠)
13 # 将鼠标位置映射为左眼珠坐标
14 x1 = map(mouseX,0,width,280,330)
15 y1 = map(mouseY,0,height,155,195)
16 circle(x1, y1, 110) # 绘制左眼珠
17 # 将鼠标位置映射为右眼珠坐标
18 x2 = map(mouseX,0,width,470,520)
19 y2 = map(mouseY,0,height,155,195)
20 circle(x2, y2, 110) # 绘制右眼珠
这一章主要讲解了整数、变量、算术运算符等语法知识,介绍了绘制圆圈、设置亮度、鼠标坐标等用法。利用这些知识,实现一个转动眼珠的圆脸。读者也可以尝试利用本章所学知识,尝试用圆圈组合出其他有趣的互动图形。
[1] 上述数值均以像素(px)为单位,参见第13章。——编者注