- 将R的极客理想(工具篇)一书,利用caTools包绘制圆形的代码整理解释如下:
当时不懂第四步的公式,提问在这里:https://ask.csdn.net/questions/7414407
对于for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.25)
- 分析如下:
如果image[,,1:10]只填入cos(r),而不涉及*i/10,则image为十张一模一样的图片;
如果cos(r-i);cos(r-i/10);cos(r-(2*pi)*i/10),则产生流动;cos(r-(2*pi)*i却不会动,可能是因为2*pi是一个周期;pi与2pi没影响;3.5*pi则会变动不流畅,缺乏周期性;没有pi显得颜色红亮;
cos(r-(2*pi)*i/10)除以r、2r,颜色深蓝;除以r平方会导致圈圈极小;除以(r**0.5)导致圈圈大,且开根号越大颜色越艳丽,条纹越来越多;
cos(r-(2*pi)*i/10)/(r**0.25)为最佳,考虑周期、变动、颜色不艳不暗,/(r**0.25)导致圈圈与圈间距大,条纹多。
详细统计如下,请忽略。
|
代码 |
图示 |
解释 |
1 |
library(caTools); x <- y <- seq(-4*pi, 4*pi, len=200); r <- sqrt (outer (x**2, y**2, '+')); image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r) write.gif (image, "cosr.gif", col="rainbow"); z = read.gif("cosr.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧相同画面,看起来像静图,颜色红艳 |
cos(r)只能构成十张一模一样的圈圈 |
2 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi*i/10)) write.gif (image, " cosr_sub.gif", col="rainbow"); z = read.gif(" cosr_sub.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色鲜艳同上 |
cos(r-(2*pi*i/10))构造十张不同的渐变圈圈 |
3 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r)/(r**0.25) write.gif (image, " cosr_div.gif", col="rainbow"); z = read.gif(" cosr_div.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧相同画面,看起来像静图,颜色透亮 |
cos(r)/(r**0.25)只能构成十张一模一样的圈圈 |
4 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r)/(r) write.gif (image, " cosr_divr.gif", col="rainbow"); z = read.gif(" cosr_divr.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
10帧相同画面,都是红色的,圈圈不明显 |
cos(r)/(r)只能构成十张一模一样的圈圈 |
5 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi*i/10))/r write.gif (image, " cosr_sub_div.gif", col="rainbow"); z = read.gif(" cosr_sub_div.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色深蓝 |
cos(r-(2*pi*i/10))/r构造十张不同的渐变圈圈 |
6 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(2*r) write.gif (image, " cosr_sub_div2r.gif", col="rainbow"); z = read.gif(" cosr_sub_div2r.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
同上 |
cos(r-(2*pi)*i/10)/(2*r)同上,/(2*r)导致颜色深蓝 |
7 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**2) write.gif (image, " cosr_sub_divr2.gif", col="rainbow"); z = read.gif(" cosr_sub_divr2.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色亮蓝,且圈圈极小 |
/(r**2)导致圈圈小 |
8 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.5) write.gif (image, " cosr_sub_divr05.gif", col="rainbow"); z = read.gif(" cosr_sub_divr05.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色青蓝,且圈圈间距大 |
/(r**0.5)导致圈圈大 |
9 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.25) write.gif (image, " cosr_sub_divr025.gif", col="rainbow"); z = read.gif(" cosr_sub_divr025.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色绿和蓝,且圈圈间距大 |
/(r**0.25)导致圈圈大 |
10 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.1) write.gif (image, " cosr_sub_divr01.gif", col="rainbow"); z = read.gif(" cosr_sub_divr01.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色绿紫蓝,且圈圈间距大,条纹多 |
同上 |
11 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.01) write.gif (image, " cosr_sub_divr001.gif", col="rainbow"); z = read.gif(" cosr_sub_divr001.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色越来越红艳,条纹越来越多 |
颜色越来越红艳,条纹越来越多 |
12 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i/10)/(r**0.001) write.gif (image, " cosr_sub_divr0001.gif", col="rainbow"); z = read.gif(" cosr_sub_divr0001.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
同上一模一样 |
同上 |
13 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(pi)*i/10)/(r) write.gif (image, " cosr_subpi_div.gif", col="rainbow"); z = read.gif(" cosr_subpi_div.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,颜色亮蓝,且圈圈极小 |
同7 |
14 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(pi)*i/10)/(r**0.25) write.gif (image, " cosr_subpi_div025.gif", col="rainbow"); z = read.gif(" cosr_subpi_div025.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
同9 |
/(r**0.25)导致圈圈大,pi与2pi没影响 |
15 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(3.5*pi)*i/10)/(r**0.25) write.gif (image, " cosr_sub35pi_div025.gif", col="rainbow");z = read.gif(" cosr_sub35pi_div025.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
同9,变得有些突兀 |
同上 |
16 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-2*i/10)/(r**0.25) write.gif (image, " cosr_sub2_div025.gif", col="rainbow");z = read.gif(" cosr_sub2_div025.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
同3,但是能动了 |
没有pi显得颜色红亮 |
17 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-i/10) write.gif (image, " cosr_subi10.gif", col="rainbow");z = read.gif(" cosr_subi10.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,棒棒糖红 |
cos(r-i/10)红且首尾帧不连贯 |
18 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-i) write.gif (image, " cosr_subi.gif", col="rainbow");z = read.gif(" cosr_subi.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧不同画面,且流动成动画,棒棒糖红同上 |
cos(r-i)波动很大,动得快 |
19 |
image = array(0, c(200, 200, 10)); for(i in 1:10) image[,,i] = cos(r-(2*pi)*i) write.gif (image, " cosr_sub2pii.gif", col="rainbow");z = read.gif(" cosr_sub2pii.gif") for(i in 1:10) image(z$image[,,i], col=z$col, breaks=(0:256)-0.5, asp=1) |
共10帧相同画面,看起来像静图,棒棒糖红同上 |
静止不动,(2*pi)造成的周期 |
总结:
r为二维矩阵,cos(r)则可根据坐标信息做成同心圆,cos(2*pi+r)刚好是一个周期,
for(i in 1:10) cos(r+i)对圈与颜色有改动,for(i in 1:10) cos(r+2*pi*i)刚好是一个周期,2*pi*i/10则解决周期性问题,
除以r的函数,除数越大则圈形越小,除数越大则圈形越大;除以r幂级数越大则间距越大,幂级数小则间距密集。
- 附录:绘制热力图:
r的热力图:
library(reshape2); melt_r<-melt(r);library(ggplot2); ggplot( data=melt_r,aes(x=Var1, y=Var2, fill=value))+geom_tile()
cos(r)的热力图:
melt_cosr<-melt(cos(r)); ggplot( data=melt_cosr,aes(x=Var1, y=Var2, fill=value))+geom_tile() #显然cos(r)值域为[-1,1]
image[,,1:10]的热力图:
melt_image<-melt(image); ggplot( data=melt_image,aes(x=Var1, y=Var2, z=Var3, fill=value))+geom_tile()
解释:cos(r-(2*pi)*i/10)/(r**0.25) 对cos(r)进行移动拉伸后,max(melt_image$value)=1.821998; min(melt_image$value)=-1.821998
cos(r-(2*pi)*i/10)值域为[-1,1],因此/(r**0.25)造成纵坐标延展。