/* built with Studio Sketchpad: * https://sketchpad.cc * * observe the evolution of this sketch: * https://studio.sketchpad.cc/sp/pad/view/ro.UJ8xVTkROOB/rev.15 * * authors: * GoToLoop * license (unless otherwise specified): * creative commons attribution-share alike 3.0 license. * https://creativecommons.org/licenses/by-sa/3.0/ */ /** * Pendula (v2.05) * by Oighen (2014/Jun) * mod GoToLoop * * forum.processing.org/two/discussion/5795/pendula * studio.processingtogether.com/sp/pad/export/ro.9yPdCEFDrKsJH/latest */ static final color BG = -1; static final short NUM = 20; final Pendulum[] pendula = new Pendulum[NUM]; void setup() { size(800, 600, JAVA2D); frameRate(60); smooth(2); stroke(Pendulum.OUTLINE); strokeWeight(1.5); ellipseMode(CENTER); Pendulum.fx = width>>1; Pendulum.fy = height>>5; for (int i = 0; i != NUM; pendula[i] = new Pendulum(i++, NUM)); } void draw() { background(BG); for (Pendulum p: pendula) p.action(); } static abstract class PendulumShare { static final color OUTLINE = 0; static final float ALFA = .2467; static final short DIAM = 50, VEL = 1, NEAR = 3; static int fx, fy; } final class Pendulum extends PendulumShare { final short c, l, k; short h = -1, s = 1, w = -1; Pendulum(int val, int qty) { c = (short) map(val, 0, qty, 050, 0300); l = (short) ((height>>2) + DIAM/NEAR * val); k = (short) (l>>VEL); } void action() { if (++w > k) s *= -(w=1); float beta = ALFA - 2.0*ALFA/k * (h+=s); float sign = beta < 0.0? 1.0 : -1.0; beta = abs(beta); float x = fx + l*sin(beta)*sign; float y = fy + l*cos(beta); display(x, y); } protected void display(float x, float y) { line(fx, fy, x, y); fill(c); ellipse(x, y, DIAM, DIAM); } }