/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.TFwoWwBY$5r/rev.40
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
* Rotating Arcs (v2.5.2)
* by Marius Watz
* mod GoToLoop
*
* Using sin/cos lookup tables, blends colors, and draws a series of
* rotating arcs on the screen.
*
* GitHub.com/processing/processing-docs/blob/master/content/
* examples/Demos/Graphics/RotatingArcs/RotatingArcs.pde
*
* forum.Processing.org/two/discussion/14071/
* converting-java-code-to-python-for-dataviz#Item_11
*
* studio.ProcessingTogether.com/sp/pad/export/ro.9AqEIV-5Q9sCx
*/
static final int ARC_LINES = 0, ARC_BARS = 1, ARC_SOLIDS = 2;
static final int FPS = 60, SMOOTH = 2, NUM = 100, A = 210;
static final float WEIGHT = 1.0, SIXTH_PI = THIRD_PI * .5;
static final boolean ONLINE = 1/2 == 1/2.;
// Trig lookup tables borrowed from Toxi; cryptic but effective.
static final float PRECISION = 2.0, RADS = .5 * DEG_TO_RAD*PRECISION;
static final int LENGTH = (int) (360/PRECISION), LUTS = LENGTH<<1;
static final float[] COS_SIN = new float[LUTS];
//static // Comment this out for JS Mode!
{ // Fill the tables
for (int i = 0; i < LUTS; i += 2) {
COS_SIN[i] = cos(RADS*i);
COS_SIN[i+1] = sin(RADS*i);
}
}
final float[] pt = new float[6*NUM]; // spd, rotX, rotY, deg, rad, width
final int[] styles = new int[2*NUM]; // color, render styles
int clockwise = 1;
boolean paused;
void setup() {
size(800, 650, P3D);
smooth(SMOOTH);
frameRate(FPS);
strokeWeight(WEIGHT);
initArcShapes();
}
void draw() {
background(0);
translate(width>>1, height>>1);
rotateX(SIXTH_PI);
rotateY(SIXTH_PI);
for (int idx = 0, i = 0; i < styles.length; idx += 6, i += 2) {
pushMatrix();
final float spd = clockwise * pt[idx]; // Rotation speed
rotateX(pt[idx+1] += spd);
rotateY(pt[idx+2] += spd * .5);
final float deg = pt[idx+3], rad = pt[idx+4], w = pt[idx+5];
final color c = styles[i];
switch (styles[i+1]) {
case ARC_LINES:
stroke(c);
noFill();
arcLines(0, 0, deg, rad, w);
break;
case ARC_BARS:
fill(c);
noStroke();
arcBars(0, 0, deg, rad, w);
break;
case ARC_SOLIDS:
fill(c);
noStroke();
arcSolids(0, 0, deg, rad, w);
}
popMatrix();
}
if (!ONLINE) frame.setTitle("FPS: " + round(frameRate));
}
void mousePressed() {
switch (mouseButton) {
case LEFT:
clockwise *= -1;
break;
case RIGHT:
if (paused ^= true) noLoop();
else loop();
break;
case CENTER:
initArcShapes();
}
}
// Draw arc lines:
void arcLines(float x, float y, float deg, float rad, float w) {
final int angs = min((int) (2.0/PRECISION*deg), LUTS-1);
final int lines = (int) w >> 1;
for (int j = 0; j < lines; rad += 2.0, ++j) {
beginShape();
for (int i = 0; i < angs; i += 2)
vertex(x + rad*COS_SIN[i], y + rad*COS_SIN[i+1]);
endShape();
}
}
// Draw arc line with bars:
void arcBars(float x, float y, float deg, float rad, float w) {
final int angs = min((int) (.5/PRECISION*deg), LUTS-5);
final float rdw = rad+w;
beginShape(QUADS);
for (int i = 0; i < angs; i += 8) {
final float c1 = COS_SIN[i], s1 = COS_SIN[i+1];
final float c2 = COS_SIN[i+4], s2 = COS_SIN[i+5];
vertex(x + rad*c1, y + rad*s1);
vertex(x + rdw*c1, y + rdw*s1);
vertex(x + rdw*c2, y + rdw*s2);
vertex(x + rad*c2, y + rad*s2);
}
endShape();
}
// Draw solid arc:
void arcSolids(float x, float y, float deg, float rad, float w) {
final int angs = min((int) (2.0/PRECISION*deg), LUTS-1);
final float rdw = rad+w;
beginShape(QUAD_STRIP);
for (int i = 0; i < angs; i += 2) {
final float c = COS_SIN[i], s = COS_SIN[i+1];
vertex(x + rad*c, y + rad*s);
vertex(x + rdw*c, y + rdw*s);
}
endShape();
}
// Get blend of two colors:
color blendColors(float fract,
color r, color g, color b,
color rr, color gg, color bb, color a) {
rr -= r;
gg -= g;
bb -= b;
return color(r + rr*fract, g + gg*fract, b + bb*fract, a);
}
void initArcShapes() {
for (int i = 0; i < pt.length; i += 6) { // Get spd, rotX, rotY, deg, rad, wdt:
pt[i] = DEG_TO_RAD/50 * random(5, 30); // Speed of rotation
pt[i+1] = random(TAU); // Random x axis rotation
pt[i+2] = random(TAU); // Random Y axis rotation
// Short to quarter-circle arcs:
pt[i+3] = random(1) > .9? 10 * (int) random(8, 27) : random(60, 80);
pt[i+4] = 5 * (int) random(2, 50); // Radius. (Space them out nicely)
pt[i+5] = random(1) > .9? random(40, 60) : random(4, 32); // Width of band
}
for (int i = 0; i < styles.length; i += 2) { // Get colors
final float rnd = random(1), f = random(1);
if (rnd < .3) styles[i] = blendColors(f, 255, 0, 100, 255, 0, 0, A);
else if (rnd < .5) styles[i] = blendColors(f, 200, 255, 0, 50, 120, 0, A);
else if (rnd < .7) styles[i] = blendColors(f, 0, 153, 255, 170, 225, 255, A);
else if (rnd < .9) styles[i] = blendColors(f, 200, 255, 0, 150, 255, 0, A);
else styles[i] = 0xdcFFFFFF;
styles[i+1] = (int) random(3); // Pick arc style
}
}