-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPhysarum.pde
139 lines (119 loc) · 3.81 KB
/
Physarum.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Moulder[] physarum;
final int phyN = 1000000;
final float TOWEIGHT = 0.75;//red follows green follows blue follows red
final float FROWEIGHT = 0.5;//red avoids blue avoids green avoids red
String baseName;
Moulder randomMoulder(){
switch(floor(random(3))){
case 0:
return new RedMoulder();
case 1:
return new GreenMoulder();
case 2:
return new BlueMoulder();
default:
return null;
}
}
RPSMoulder randomRPSMoulder(){
return new RPSMoulder(floor(random(3)),TOWEIGHT,FROWEIGHT);
}
float circularNoise(float t, float nscale,float seedx,float seedy){
return noise(seedx + nscale*cos(t),seedy + nscale*sin(t));
}
float toroidalNoise(float t1,float t2,float r1, float r2,float s1,float s2, float s3){
float x = (r1 + r2*cos(t2))*cos(t1);
float y = (r1 + r2*cos(t2))*sin(t1);
float z = r2*sin(t2);
return noise(x + s1,y + s2,z + s3);
}
void colonyMould(int colNum,float radius){
baseName = "Colony" + colNum;
physarum = new Moulder[phyN];
for (int i=0;i<physarum.length;i++){
PVector c = new PVector((3*i%colNum) * width/colNum,((2*i+3)%colNum) * height/colNum);
physarum[i] = randomRPSMoulder();
float r = random(radius);
physarum[i].pos = PVector.add(c,PVector.mult(PVector.fromAngle((i*TAU/physarum.length)),r));
}
}
void cornerMould(float radius){
baseName = "Corner";
physarum = new Moulder[phyN];
for (int i=0;i<physarum.length;i++){
physarum[i] = randomRPSMoulder();
float r = radius + sqrt(radius)*noise(i*0.01);
physarum[i].pos = PVector.mult(PVector.fromAngle((i*TAU/physarum.length)),r);
}
}
void centerMould(float radius,float angleOffset){
baseName = "Center" + round(180*angleOffset/PI);
PVector c = new PVector(width/2,height/2);
physarum = new Moulder[phyN];
for (int i=0;i<physarum.length;i++){
physarum[i] = randomRPSMoulder();
float r = radius + 0.25*radius*randomGaussian();
physarum[i].pos = PVector.add(c,PVector.mult(PVector.fromAngle((i*TAU/physarum.length)),r));
physarum[i].heading = PVector.sub(c,physarum[i].pos).heading() + angleOffset;// + 0.25*randomGaussian();
}
}
void randomMould(){
baseName = "Random";
physarum = new Moulder[phyN];
for (int i=0;i<physarum.length;i++){
physarum[i] = randomRPSMoulder();
physarum[i].pos = new PVector(random(width),random(height));
}
}
void sineMould(){
baseName = "Sine";
physarum = new Moulder[phyN];
for (int i=0;i<physarum.length;i++){
physarum[i] = randomRPSMoulder();
physarum[i].pos = new PVector(i,height/2 + height*0.25*sin(TAU*i/width));
physarum[i].heading = (new PVector(1,cos(TAU*i/width)).heading());
}
}
void noiseMould(float xscale,float yscale){
baseName = "Noise";
physarum = new Moulder[phyN];
float XSEED = random(39562305);
float YSEED = random(39562305);
float ZSEED = random(39562305);
int p = 0;
while (true){
for (int j = 0;j<height;j++){
for (int i = 0;i<width;i++){
if(random(0.5f) > toroidalNoise(TAU*i/(float)width,TAU*j/(float)height,xscale,yscale,XSEED,YSEED,ZSEED)){//if good roll
//add mould
physarum[p] = randomMoulder();
physarum[p].pos = new PVector(i,j);
p++;
}
if(p == phyN){return;}
}
}
}
}
void setup(){
fullScreen();
//size(720,720);
//sineMould();
centerMould(height/4f,PI/2);
//colonyMould(4,20);
//noiseMould(15f,15f);
background(0);
noStroke();
}
void draw(){
filter(BLUR);
fill(0,15);
rect(-1,-1,width+2,height+2);
loadPixels();
for(Moulder spore:physarum){
spore.stepTime();
}
updatePixels();
String fullName = "frames/Physarum" + phyN + baseName + "To" + TOWEIGHT + "Fro" + FROWEIGHT + "Sense" + round(physarum[0].sensorAngle/DEGREES) + "Turn" + round(physarum[0].turnAngle/DEGREES);
saveFrame(fullName + "/physarum#########.png");
}