-
Notifications
You must be signed in to change notification settings - Fork 2
/
PerlinRiver.pde
113 lines (95 loc) · 2.69 KB
/
PerlinRiver.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
import processing.pdf.*;
RiverLine riverLine;
PVector target;
PVector rock;
PVector noiseForce;
float curY;
float a0,b0;
float yInc = 15.0;
int numRocks = 3;
int numRockVertices = 14;
PVector rocks[];
int rockSize[];
PVector rockVerts[][];
PGraphics canvas;
boolean hasDrawnRocks = false;
boolean hasSaved = false;
void setup() {
size(1400,700,P2D);
pixelDensity(2);
smooth(8);
noiseDetail(2,1);
background(255);
curY = 60.0; // starting Y location
// for perlin noise
a0 = curY/width;
b0 = curY/height;
riverLine = new RiverLine(0, curY);
target = new PVector(width,curY);
rocks = new PVector[3];
rockSize = new int[4];
rockVerts = new PVector[4][14];
// generate random rocks
for (int i=0;i<numRocks;i++) {
rocks[i] = new PVector(random(400+i*300,650+i*300), random(120.0,height-170.0));
rockSize[i] = floor(random(100,130));
// generate random rock vertices
for (int j=0;j<numRockVertices;j++) {
float rnd = random(rockSize[i]*.5,rockSize[i]*.6);
rockVerts[i][j] = new PVector(sin(TWO_PI/numRockVertices * j) * rnd, cos(TWO_PI/numRockVertices * j) * rnd);
}
}
ellipseMode(RADIUS);
String fn = "perlinRiver_"+millis()+".pdf";
println("output : " + fn);
beginRecord(PDF, fn);
}
void draw() {
if (curY < height - 100) {
// draw until near bottom. Note different between top and bottom margins - it's intentional
stroke(0);
noFill();
a0 += 0.025;
// first, draw the rocks, but only once
if (!hasDrawnRocks) {
for (int i=0;i<numRocks;i++) {
stroke(90);
strokeWeight(3);
noFill();
pushMatrix();
translate(rocks[i].x,rocks[i].y+20); // offset intentional to counteract lookahead
beginShape();
curveVertex(rockVerts[i][0].x,rockVerts[i][0].y);
for (int j=0;j<numRockVertices;j++) {
curveVertex(rockVerts[i][j].x,rockVerts[i][j].y);
}
curveVertex(rockVerts[i][0].x,rockVerts[i][0].y);
endShape(CLOSE);
popMatrix();
}
hasDrawnRocks = true;
}
riverLine.update();
riverLine.seek(new PVector(riverLine.location.x + 150.0, target.y));
for (int i=0;i<numRocks;i++) {
riverLine.avoid(rocks[i],rockSize[i],i);
}
riverLine.display();
if (( target.dist(riverLine.location) < 2) || (riverLine.location.x > target.x)) {
curY += yInc;
riverLine = new RiverLine(0, curY);
target = new PVector(width,curY);
a0 = curY/width;
b0 = curY/height;
}
} else {
if (!hasSaved) {
hasSaved = true;
endRecord();
// show non-recorded green dot in top left
noStroke();
fill(0,255,0);
rect(0,0,5,5);
}
}
}