/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.l55rZ28MHmC/rev.12
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
* Perlin Egg (v2.43)
* 2013/Mar/30
* forum.processing.org/one/topic/how-to-make-perlin-noise-loop
* forum.processing.org/one/topic/
* how-do-i-add-another-same-circle-but-smaller-inside-this
*
* studio.processingtogether.com/sp/pad/export/ro.9DrxZ3Xdrd4eI/latest
*/
final static byte NUM_CIRCLES = 2;
final static PerlinCircle[] circles = new PerlinCircle[NUM_CIRCLES];
final static color BG = -1;
final static short FPS = 40, BOLD = 3;
final static String RENDERER = JAVA2D; // JAVA2D or P2D
void setup() {
size(600, 500, RENDERER);
frameRate(FPS);
smooth(4);
ellipseMode(CENTER);
strokeWeight(BOLD);
final int CenterX = width >> 1, CenterY = height >> 1;
circles[0] = new PerlinCircle(CenterX, CenterY, width/5, height/3, #204080);
circles[1] = new PerlinCircle(CenterX, CenterY, width/10, height/5, #F04020);
}
void draw() {
background(BG);
for (final PerlinCircle pc: circles) pc.render();
}
final class PerlinCircle {
final static short SEGMENTS = 50;
final static float NUM_ANGLES = TWO_PI/SEGMENTS;
final static float NOISE_SCALE = .5;
final static float TIME_SCALE = .01;
final static short TIME_DIFF = 1000;
float dx, dy;
final float TIME_UNIQUE = random(TIME_DIFF);
final short X, Y;
final short MIN_RAD, MAX_RAD;
final color FG;
PerlinCircle(int xx, int yy, int minSize, int maxSize, color c) {
X = (short) xx;
Y = (short) yy;
MIN_RAD = (short) minSize;
MAX_RAD = (short) maxSize;
FG = c;
}
void render() {
translate(X, Y);
stroke(FG);
findNextCoords(0);
float px = dx, py = dy;
int i = 0;
while (i++ != SEGMENTS) {
findNextCoords(i);
line(px, py, px = dx, py = dy);
}
resetMatrix();
}
void findNextCoords(final int seg) {
final float angle = NUM_ANGLES*seg;
final float cosAngle = cos(angle);
final float sinAngle = sin(angle);
final float time = TIME_SCALE*frameCount + TIME_UNIQUE;
final float noiseValue = noise(
NOISE_SCALE*cosAngle + NOISE_SCALE,
NOISE_SCALE*sinAngle + NOISE_SCALE, time);
final float rad = MAX_RAD*noiseValue + MIN_RAD;
dx = rad*cosAngle;
dy = rad*sinAngle;
}
}