版权所有。转载请保留作者和原文链接信息。
前些天在微信公众号上看到一篇文章,讲的是把圆周率pi的小位映射成曲谱,用钢琴演奏出来的效果(竟然还蜜汁好听……)
众所周知,圆周率是一个无限不循环的数学常数,然而它并不仅仅只是具有数学、物理含义,它代表着一种自然规律。正是这种玄妙的自然规律,以至于即使在听觉上映射成音符,也具有美妙的效果。数理、乐理,皆是自然之理,这种自然之理能在听觉上表示使人沉醉,那么理所当然,它也应当能在视觉上让人炫目。
事实上,两年前我就看到一位大神把可视化出来,的确具有让人眼前一亮的美观;根据当时传授给我的思想原理,这里复现一下。
主要思想如下:把pi小数位映射成单位向量,意即从原点作为起点,每一位小数映射成一个方向,基于这个方向向前走一步,映射完N位小数,走了N步,会是一种什么样的轨迹。
基于这个思想,我们把0-9归一化到0~2的弧度,从0开始,向量长度固定为1,根据弧度分解成笛卡尔坐标系下的位移,每一步基于上一步的坐标迭代计算出下一步的坐标,然后把路径图画出来。
下面直接上代码——————
library(ggplot2) library(stringr) library(dplyr) nums <- str_extract_all(txt,"\\d") %>% unlist %>% as.numeric() nums <- nums/9*360mat <- matrix(nrow=length(nums),ncol=3) mat[,3] <- nums[1:nrow(mat)] get_next_pos <- function(x,y,angle,i){ delta_x <- cos(angle/360*2*pi) delta_y <- sin(angle/360*2*pi) return(c(x+delta_x*i,y+delta_y*i)) } mat[1,1:2] <- get_next_pos(0,0,nums[1],1)for(i in 2:nrow(mat)){ mat[i,1:2] <- get_next_pos(mat[i-1,1],mat[i-1,2],nums[i],(1)^((i+1)%%2)) } df <- as.data.frame(mat) colnames(df) <- c("x","y","num") ggplot(data = df[1:10000,],aes(x=x,y=y,color=num))+ geom_path()+ scale_color_gradient(low="#FED976",high="#BD0026")+ labs(x="",y="")+ guides(color=F)+ theme(panel.background = element_rect(fill = "#212121"), plot.background = element_rect(fill = "#212121"), panel.grid = element_blank(), legend.background = element_blank(), axis.text = element_blank(), axis.ticks = element_blank())
(这怎么长得跟股价走势似的……)
这看起来很像时间序列曲线,是因为我们限定了每往前走一步的长度是1,所以它的走势总体上是向上的;假如把规则换一下呢:如果令奇数步向前走-1,偶数步向前走1呢——即根据小数位的方向,走一步退一步是什么样子的?
只要把上述代码某行的1改成-1即可,再看一下路径走势。
这样一来就美观多了,一个有意思的现象是:路径中间有一大片空白,它所代表的数学含义是什么呢?
作者:真依然很拉风
链接:https://www.jianshu.com/p/7e406d17b78f
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦