版权所有。转载请保留作者和原文链接信息。
前些天在微信公众号上看到一篇文章,讲的是把圆周率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*360
mat <- 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即可,再看一下路径走势。
这样一来就美观多了,一个有意思的现象是:路径中间有一大片空白,它所代表的数学含义是什么呢?
网友评论