/* built with Studio Sketchpad: * https://sketchpad.cc * * observe the evolution of this sketch: * https://studio.sketchpad.cc/sp/pad/view/ro.3HAFqkWqzWo/rev.15 * * authors: * GoToLoop * license (unless otherwise specified): * creative commons attribution-share alike 3.0 license. * https://creativecommons.org/licenses/by-sa/3.0/ */ /** * Necklace (v2.05) * by scott_me (2014/Aug) * mod GoToLoop * * forum.processing.org/two/discussion/7294/ * why-doesn039t-my-sketch-run-in-javascript-mode * * studio.processingtogether.com/sp/pad/export/ro.9NwgKBhS$Gxju/latest */ static final int NUM=120, HUES=120, DIAM=10, RAD=DIAM>>1; static final float STEP=.01, LIMIT=20.0; final PVector places[]=new PVector[NUM], vel=new PVector(); static final float[] lookup=new float[NUM]; static final color[] hues=new color[NUM]; void setup() { size(1000, 1000, JAVA2D); frameRate(60); smooth(4); noStroke(); ellipseMode(CENTER); colorMode(HSB, HUES); for (int i=0; i!=NUM;) { places[i]=new PVector(random(width), random(height)); lookup[i]=sin(TWO_PI/NUM * i)/10.0; hues[i]=color((float) HUES/NUM * i++, HUES, HUES); } } void draw() { background(0); PVector pos=places[0]; for (int i=0; i!=NUM;) { display(hues[i], pos); move(lookup[i], pos, pos=places[++i%NUM], vel); } } void keyTyped() { for (PVector p: places) p.set(random(width), random(height), 0); } void mousePressed() { if (mouseButton != LEFT) keyTyped(); } void display(color wheel, PVector place) { fill(wheel); ellipse(place.x, place.y, DIAM, DIAM); } void move(float t, PVector p, PVector n, PVector v) { v.set(n); v.sub(p); float len=v.mag(), adjust=(len-LIMIT)/len; v.mult(adjust*STEP); p.add(v); v.normalize(); p.add(v.y*t, -v.x*t, 0); p.x=constrain(p.x, RAD, width - RAD-1); p.y=constrain(p.y, RAD, height - RAD-1); }