×

使用Pi和Python制作艺术、游戏等

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-27

李巍

分享资料个

描述

概述

 
 
 
poYBAGNzb1CASThiABGY-M586r4541.png
 
1 / 3
 

通过使用 Python 使用 Pi 制作艺术、音乐和游戏来庆祝 Pi 日。在这本 Google Colaboratory Notebook 中,您将探索 Pi 是什么、如何使用它以及一些有趣的应用程序。打开 Colab Notebook 并跟随!

谷歌合作笔记本:https ://colab.research.google.com/drive/1scICArIp5mQC5EQkT4FtnQ9-qtw4ECzc?usp=sharing

GitHub 存储库:https ://github.com/mjdargen/pi/

目录 - 使用 Pi 和 Python 制作艺术、游戏等

  • 安装依赖和下载文件
  • 什么是π?
  • 就 π 而言,你几岁?
  • 近似 π
  • 一百万位π
  • 绘制 π 的位数分布图
  • π 和弦图
  • 蛇 - Pi 版本
  • π 的二值像素图像
  • 用 π 制作音乐
  • 艺术与 π & Processing
  • 使用 π 找到 Kevin Bacon

第 0 步:Colab 和设置环境

Colab 简介

Google Colaboratory 是一个使用 Jupyter Notebooks 的 Python 开发环境,可让您连接到 Google 强大的云计算资源并运行 Python 代码。

Pi是最臭名昭著的数字。它是唯一一个拥有广泛认可的假期的数字——3 月 14 日的 Pi 日。在这个笔记本中,我们将探索 pi 的各个方面,并尝试从数字中获得一些乐趣。

第 2 步:就 Pi 而言,您几岁?

用 pi 计算你的年龄。在指定的字段中输入您的生日,以确定您的年龄(以 pi-years 和 pi-days 为单位)。

第 3 步:近似 Pi

 
poYBAGNzb1WAWrg6AAD1HeUIyqs347.jpg
 

使用指定数量的求和项来近似 pi。我们将使用莱布尼茨公式来逼近 π。它是一个无限交替级数,缓慢地向 pi 收敛,如下面的公式所述。

要使用该程序,请指定要使用多少项 (n) 来近似 pi。该程序将吐出生成的近似值。

第 4 步:一百万位 Pi

查看 pi 的前 100 万位十进制数字和 pi 的前 100 万位十六进制数字。运行下面的单元格后,单击输出窗口附近的“x”以清除单元格。显示数百万个字符会给您的浏览器带来负担并降低笔记本的速度。

Pi的一百万十进制数字:https ://raw.githubusercontent.com/mjdargen/pi/main/pi_dec_1m.txt

Pi的一百万个十六进制数字:https ://raw.githubusercontent.com/mjdargen/pi/main/pi_hex_1m.txt

第 5 步:绘制 Pi 数字的分布图

 
pYYBAGNzb1iAHjEkAAFdkAuoBwg286.jpg
 

在本节中,我们将进一步检查 pi 的前一百万位十进制和十六进制数字。我们将绘制 pi 的位数的分布,以确定在 pi 的前一百万位数中是否有更多出现的数字。

第一个图将是 pi 的十进制数字,第二个图将是 pi 的十六进制数字。这些图表也会作为一个 interactive.html 网页写入“输出”文件夹,该网页可以在 Colab 左侧的文件选项卡中下载。这些图是使用 Plotly 条形图生成的。

第 6 步:Pi 和弦图

弦图是一种特殊类型的图表,它从圆形图上的节点中提取边缘或弧线。在这种情况下,我们展示了 pi 数字的进展。节点代表一个数字的每个可能值(0-9 表示十进制,0-15 表示十六进制)。弧线或边表示从一个数字到下一个数字的转换。例如,pi 小数点后的第一位数字是“14159”。我们将从 1 开始画一条弧到 4,然后画一条从 4 到 1 的弧,然后画一条从 1 到 5 的弧,然后画一条从 5 到 9 的弧,以此类推。

第一个图显示了 pi 的前一百万个十进制数字的和弦图。第二个图显示了 pi 的前一百万个十六进制数字的和弦图。这些图表也会作为一个 interactive.html 网页写入“输出”文件夹,该网页可以在 Colab 左侧的文件选项卡中下载。和弦图是使用和弦模块生成的。

第 7 步:蛇 - Pi 版本

 
 
 
 
poYBAGNzb1uAGQ9RAAHUzcivb3M593.jpg
 
1 / 2
 

玩 Snake 的 Pi 版本!我修改了 Snake,使蛇显示为 π 的各个部分。蛇不是吃食物,而是试图按顺序吃 pi 的十进制数字。看看你能吃多少位数的圆周率!

注意:此代码在 Google Colab 中无法正常运行,因此我必须嵌入我的 repl.it 项目。在此处查看源代码这个项目最初是从@LorenzoCampos分叉出来的,并经过调整以制作 pi 版本。查看并玩下面的游戏。

第 8 步:Pi 的二进制像素图像

 
 
 
 
pYYBAGNzb1-AVqs6AATGg4-4IXg443.jpg
 
1 / 2
 

Pi 也可以表示为二进制数。为了做到这一点,我取前一百万个十六进制数字并将其逐字节转换为二进制数。为了可视化这些信息,我将前 100 万个十六进制数字表示为 2000x2000 单色黑白图像。零由黑色像素表示,而零由白色像素表示。

请参阅本节中的完整图像。它可能会在一分钟内显示为纯白色图像,因为该图像需要一段时间才能加载到 Colab 输出窗口中。图像也保存在“输出”窗口中,可以在 Colab 左侧的文件选项卡中下载。该脚本使用 Pillow 模块生成图像。

第 9 步:用 Pi 制作音乐

我们甚至可以用 pi 制作音乐。下面的脚本使用 numpy 计算波形并使用 scipy 写入 a.wav 文件。我在piaudio.py中保留了一些代码,以免弄乱笔记本。该文件负责将弦音符表示映射到特定频率,并根据持续时间和 BPM 为每个音符构建选定的波形。

尝试与笔记字典一起播放,看看你可以用 pi 发出什么样的酷声音。将某些数字值映射到键盘上的键。必须按照如下所示的格式写下注释。您还可以通过将波形参数提供给 play_note() 函数来指定所需的波形类型。它可以是正弦曲线、三角形、锯齿形或方形。

通过使用第 20 行或第 22 行来确定是要使用 pi 的十进制数字还是十六进制数字。默认情况下,以下脚本仅使用 pi 的前 100 位数字。使用完整的 100 万位 pi 需要很长时间才能执行。

播放窗口将显示在输出窗口中以预览音频。您也可以下载 .wav 文件。音频也保存在“输出”窗口中,可以在左侧的文件选项卡中下载。

注释格式说明:

  • 必须以:NOTE_开头
  • 第一个字母是注释:AG
  • 如果有一个“S”,表示锐利(没有单位)
  • 数字在键盘上是八度,0-最低,8-最高

第 10 步:使用 Pi 和处理进行艺术创作

 
pYYBAGNzb2KASJahAADGxOYymcU492.png
 

Processing是一种灵活的软件速写本,也是一种用于学习如何在视觉艺术环境中编码的语言。它是一个免费的图形库和 IDE。它是用Java构建的;但是,也有Python 模式

您无法在 Google Colaboratory 中运行处理代码。您将需要下载 Processing 并安装 Python 模式插件。请遵循此入门指南

此处理脚本解析 pi 的前 10, 000 个十进制数字并将它们表示为圆圈。圆圈的颜色表示该数字的数值。

请参阅下面生成的图形。您也可以在此处下载图形我提供了生成下图的代码。您还可以在此处从我的 GitHub 存储库查看/下载脚本

第 11 步:使用 Pi 找到 Kevin Bacon

这个脚本展示了我们如何本质上使用 pi 的数字作为算法的伪随机数生成器。

下面我们将使用 pi探索Kevin Bacon 的六度。凯文培根的六度是一个游戏/思想实验,是“六度分离”的一个例子。“六度分离”背后的想法是,任何两个人(平均而言)彼此相距六个或更少的社会联系。作为探索这一点的愚蠢方式,我们将加载一个随机的 Wikipedia 页面并按照该页面上的链接,直到我们到达 Kevin Bacon 的 Wikipedia 页面。

我们使用随机的维基百科页面作为我们的起点。从那里,脚本获取链接在单个页面上的所有有效 Wikipedia 页面的列表。然后脚本按顺序使用 pi 的十六进制数字来确定我们接下来访问的维基百科页面之一。

下面的脚本可能需要很长时间才能执行,具体取决于它需要访问多少页面,直到我们找到 Kevin Bacon 的 Wikipedia 页面。到目前为止,我需要访问的最少页面数是 2, 254 页。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"//m.obk20.com/www/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用Pi和Python制作艺术、游戏等',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"https://www.elecfans.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);