用python模拟飞机进近过程中鸟类动态活动分布 !
引言
今年年初,英国BBC新闻网发起“20世纪最伟大人物”评选,中国首位诺贝尔生理学或医学奖得主,我们敬爱的屠呦呦屠奶奶就是候选人之一。在后来公众投票中,可谓各路神仙齐聚,最后决赛的名单,包括马丁·路德·金、纳尔逊·曼德拉、欧内斯特·沙克尔顿、戴维·鲍伊、穆罕默德·阿里还有巴勃罗·毕加索。然而还是有一位伟人超越了他们,被命名为“20世纪最伟大的人物”,他就是计算机科学之父——阿兰·图灵(Alan Turning)。别的伟人给人类以信仰,以图灵为代表的计算机科学家,给人类的则是未来。
Python学习群:683380553,有大牛答疑,有资源共享!是一个非常不错的交流基地!欢迎喜欢Python的小伙伴!
image image
话题和标题扯得有点远,图灵也好,信息论创始人香农(Shannon)也好,今天的主角python的创始人吉多(Guido)也好,其实他们离我我们真的不远。既然同处一个时代,同样是兴趣使然,虽然难以望其项背,但是用先进的手段做一些好玩的东西,甚至用Nature、Science常用的数学手段分析一点日常的东西自娱,还是有可能的。世上无难事,只要肯登攀。
image image私信2小编001 获取所有代码以及素材!
有句话叫Talk is cheap,show me the code这里也不过多的宣传数字化思维的作用了,我们直接进入正题,let's go~
image目标
机场驱鸟的重要性这里不予赘述,因为会静下心看这篇东西的人必然是核心技术人员,都懂的比我更深。我们平时制作的鸟类活动分布图,基本是在特定的区域里绘制鸟类表示此区域有该鸟种分布,由于图的静态限制,除了认识这种鸟的照片外作用微乎其微。本次目标分两个,一是制作辖区动态鸟类分布图,用动态的方式展现出特定的鸟种活动区域,并将移动速度,体型,危害程度等作为属性参数予以体现,由于篇幅限制此图仅展示原理;另外一个是制作模拟鸟类在飞机进近过程中出现的过程,把特定区域的高危鸟种罗列出来,以动态形式展现,同时将进近中的飞机变为可操作对象,直观展示应对鸟击所适宜采取的措施,我将展示最终成果效果图。
环境
计算机环境相对简单,需要自行安装python3.0,python作为人工智能时代的编程语言,可以说是未来很多工作数字化的最佳基础。本次编码后来采用的geany编译器。
之后pip install pygame,兴趣使然所以使用的pygame平台(我才不会说是因为matplotlib我还没彻底熟悉呢,另外动态过程pygame真的方便)。
素材
图片素材包括鸟类素材,飞机素材,背景素材。因为作者人在内蒙,本文就以当地常见的斑翅山鹑,小沙百灵,云雀三个鸟种为例,其他的种类原理相同可以自行添加。飞机素材网上一大把,ps抠图就是了。背景素材嘛,就地取材拍一张了。
素材样例
image image image代
码
image详细代码段
image首先是导入和预设,防中文汉字乱码或者报警,所以采用gbk编码。然后初始化pygame。
coding=gbk
导入pygame
import pygame
import random
导入pygame坐标系
from pygame.locals import *
初始化pygame
pygame.init()
image既然直观展示,我们需要一个可以交互的界面,生成一个1500×1000像素的界面。
screen = pygame.display.set_mode((1500, 1000))
image下面需要导入飞机和鸟类模型,生动一点的话,还应该导入动态的云彩,于是定义相应的类。首先是飞机主体。
image飞机有两种行为,一种是由人手动操控,一种是按照既定路线(PS:我在某机场看到管制员再玻璃窗上绘制了飞机进近的参考线,很有意思)降落至跑道上平飞。我们在定义过程中加入操控部分。
image为了防止飞机飞出屏幕,适当做个保护吧
image飞机定义好了,开始定义上鸟类,首先是斑翅山鹑种,也就是沙斑鸡,飞行高度较低,喜欢跑动,所以生成点高度设定的也低。具体如下:
image同理,定义小沙百灵和云雀,注意根据习性不同设置了不同的分布参数。
image image为了更有真实感,我们还设定了动态的云朵,出现方式类似,只是调整了频率。
image image下面把最后的预处理工作做好:
image到此为止,所有设定工作都已完成,开启界面的主循环。我们要使在主循环过程中,可以按退出终止演示,同时也要让不同鸟种动态生成,自动更新。
image当然,主循环过程中该自动更新生成的不能落下。
image当发生飞机和鸟类碰撞时,即鸟击事件,为方便演示,我们定义二者的边框有重叠部分时,改变飞机的形态为hit形态,同时背景文件替换(当然,这是个人习惯,也完全可以加载一张其他提示性的png文字图片)
image对了,还记得开头提到过的,飞机自动进近路线么,我们定义一个行为,当我按住键盘上的g键时,飞机按照既定的方向和速度进近落地,当落地至跑道平面时,飞机以既定的速度平飞。具体如下:
image以上,我设想的一些功能都已实现,不过一旦鸟击之后,还是希望可以重新开始进行下一次演示的,我们不妨设定一下重新开始的程序吧。按空格键后,飞机要重置,背景要重置,鸟类可以不用动,继续动态演示就好了。
image最后,加上一句pygame.display.flip(),开始运行!
实际运行效果如图(因为屏幕大,所以gif的优化不是很好,软件本身并无卡顿,另外部分功能如G键自动运行不会很好的体现出来,有兴趣可以下载代码自行测试。)
image扩展
扩展有两个,一个是软件本身,其实我们要的是演示效果,包括鸟类的分布动态显示,这些依据机场的时机情况要好的多,所以我这里只设定了每种鸟类的平行分布。而是鸟击之后可以在背景内增加更多的分析和思考内容,所以我采用背景替换的方式,图片中虽然显示的事youlose,真正适合显示的对不同区域不同种类的鸟种的防治分析。
第二个扩展,就是开头说的,如何利用相同的思路绘制动态鸟类活动分布地图呢。其实只需要修改背景为机场周边8公里地形图或者其他mapinfo软件绘制的底图,然后重新定义鸟类的活动区域和运动速度,当超出边界时使用kill()方法消除即可。因为需要多种鸟类同时存在才有效果,故这里仅提供思路,我的32位低配电脑真跑起来还是有压力的。