修订版 | 0215a98b26e7b59f4203ce9f60b7e9e4edb9f643 (tree) |
---|---|
时间 | 2023-02-07 08:17:57 |
作者 | Lorenzo Isella <lorenzo.isella@gmai...> |
Commiter | Lorenzo Isella |
A function to create artwork.
@@ -0,0 +1,91 @@ | ||
1 | +rm(list=ls()) | |
2 | + | |
3 | +library(data.table) | |
4 | +library(scattermore) | |
5 | +library(viridis) | |
6 | + | |
7 | +makeStreams <- function(startpos,m=100,FUN,d=0.1){ | |
8 | + pos=matrix(nrow=length(startpos), ncol=m) | |
9 | + pos2=matrix(nrow=length(startpos), ncol=m) | |
10 | + pos[,1] <- startpos | |
11 | + pos2[,m] <- startpos | |
12 | + for(i in 2:m){ | |
13 | + v <- FUN(pos[,i-1]) | |
14 | + pos[,i] <- pos[,i-1] + d * v/Mod(v) | |
15 | + } | |
16 | + for(i in (m-1):1){ | |
17 | + v <- FUN(pos2[,i+1]) | |
18 | + pos2[,i] <- pos2[,i+1] - d * v/Mod(v) | |
19 | + } | |
20 | + pos <-cbind(pos,pos2) |> as.vector() | |
21 | + cbind(Re(pos),Im(pos)) | |
22 | +} | |
23 | + | |
24 | +flowFunction <- function(z) { | |
25 | + fz = z-zeros[1] | |
26 | + for(i in zeros[-1]) fz = fz * (z-i) | |
27 | + for(i in poles) fz = fz / (z-i) | |
28 | + fz/Mod(fz) | |
29 | + } | |
30 | + | |
31 | + | |
32 | + | |
33 | +set.seed(1211) | |
34 | + | |
35 | +## polesandzeros <- seq(-1,1,l=40)-0.5i*seq(-1,1,l=40) + | |
36 | +## .7i*seq(-1,1,l=40)^2 - .3i | |
37 | + | |
38 | + | |
39 | +polesandzeros <- seq(-1,1,l=40)-0.5i*seq(-1,1,l=40) ## + | |
40 | + ## .7i*seq(-1,1,l=40)^2 - .3i | |
41 | + | |
42 | + | |
43 | +pole = rbinom(39, 1,0.2 ## 0.5 | |
44 | + ) | |
45 | +poles = polesandzeros[pole==1] | |
46 | +zeros = polesandzeros[pole==0] | |
47 | + | |
48 | + | |
49 | + | |
50 | + | |
51 | + | |
52 | + | |
53 | +N=60000 | |
54 | +startZ <- c( | |
55 | + 0.5*exp(2i * pi * seq(0,1,l=N/6)), | |
56 | + 0.3*exp(2i * pi * seq(0,1,l=N/6)), | |
57 | + 0.4*exp(2i * pi * seq(0,1,l=N/6)), | |
58 | + 0.6*exp(2i * pi * seq(0,1,l=N/6)), | |
59 | + 0.8*exp(2i * pi * seq(0,1,l=N/6)), | |
60 | + 1.0*exp(2i * pi * seq(0,1,l=N/6)) | |
61 | + ) | |
62 | + | |
63 | +pos <- makeStreams(startZ,m= 500 | |
64 | + ,FUN=flowFunction,d=0.0025 ## 0.005 | |
65 | + ) | |
66 | + | |
67 | +## col=rep(c(hsv(0, 1,0.5,0.4), | |
68 | +## hsv(0.0,1,0.5,0.4), | |
69 | +## hsv(0.1,1,0.5,0.4), | |
70 | +## hsv(0.9,1,0.5,0.4), | |
71 | +## hsv(0.8,1,0.5,0.4), | |
72 | +## hsv(1, 1,0.5,0.1) | |
73 | +## ), each=N/6) | |
74 | + | |
75 | + | |
76 | +col=rep(mako(10)[1:6], each=N/6) | |
77 | + | |
78 | + | |
79 | +col <- rep(col,1000) | |
80 | + | |
81 | +png("my_artwork.png", width=5000, height=5000) | |
82 | +par(mar=0.1*c(1,1,1,1), bg="#dddddd") | |
83 | +scattermoreplot(pos,size=c(3000,3000), | |
84 | + xlim=c(-1,1), | |
85 | + ylim=c(-1,1), | |
86 | + col=col, | |
87 | + axes=F) | |
88 | +dev.off() | |
89 | + | |
90 | + | |
91 | +print("So far so good") |