/* built with Studio Sketchpad: * https://sketchpad.cc * * observe the evolution of this sketch: * https://studio.sketchpad.cc/sp/pad/view/ro.w55967FT2CR/rev.69 * * authors: * GoToLoop * license (unless otherwise specified): * creative commons attribution-share alike 3.0 license. * https://creativecommons.org/licenses/by-sa/3.0/ */ /*____________________________________________________________________________________________________*/ // Twister (v2.3) // date @ 2012/Aug // program by tonyrocks // modded by GoToLoop // Converted from MS Small Basic // Import Code: FKF358-5 // http://social.msdn.microsoft.com/Forums/en-US/smallbasic // /thread/abc69be0-b2a9-4bb2-b5aa-c652f4258308 /*____________________________________________________________________________________________________*/ // Constants: private static final short gw = 800; // window width private static final short gh = 600; // window height private static final short oSet = gw>>1; // offset (gw/2) private static final short tSize = 180; // twister size private static final short twist = 200; // twister amplitude private static final short angMax = 180; // max angle samples private static final byte fps = 10; // FPS refresh private static final byte ruggy = 1; // how rugged lines are private static final boolean useSmooth = false; //colors = "0=Maroon;1=DarkRed;2=Red;3=SkyBlue;4=DodgerBlue;5=Blue;6=Navy;7=Indigo;" private static final color[] colors = { #800000, #8B0000, #FF0000, #87CEEB, #1E90FF, #0000FF, #000080, #4B0082 }; private static final byte colorsIndex = (byte) colors.length; // # of colors = # of lines to draw at each row private static final float angStep = 360f/colorsIndex; // angle gap for lines of each color /*____________________________________________________________________________________________________*/ // Variables: private static short ang = 0; // current angle loop iterator to display private static boolean isRunning = true; // running status private static final short[][][] x = new short[angMax][gh][colorsIndex + 1]; // coordinate 3d array /*____________________________________________________________________________________________________*/ // Initialization: final void setup() { size(800, 600); frameRate(fps); strokeWeight(ruggy); if (useSmooth) smooth(); TwisterData(); } /*____________________________________________________________________________________________________*/ // Store all calcs in array x[ang][y][row]: private static final void TwisterData() { float amp, calc; for (short ang = 0; ang < angMax; ++ang) { amp = sin(ang)*gh + twist; // Set the amplitude and change it based on height & angle for (short y = 0; y < gh; y += ruggy) { calc = y/amp + ang; // Pre-Calc for (byte row = 0; row < colorsIndex; ++row) x[ang][y][row] = (short) ( sin(angStep*row + calc) * tSize + oSet ); x[ang][y][colorsIndex] = x[ang][y][0]; // Extra redundant row = 1st row } } } /*____________________________________________________________________________________________________*/ // Twister drawing loop: final void draw() { background(0); // Clear screen w/ black print(ang + " \t"); // Print current angle in the text console for (short y = 0, x1, x2; y < gh; y += ruggy) { x1 = x[ang][y][0]; // 1st horizontal coordinate for (byte row = 0; row < colorsIndex; ++row, x1 = x2) { x2 = x[ang][y][row+1]; // destination horizontal coordinate if (x1 < x2) { stroke( colors[row] ); line( x1, y, x2, y ); } } } if (++ang == angMax) ang = 0; // Increase angle & check if it's time to reset it } /*____________________________________________________________________________________________________*/ // Pause animation final void keyPressed() { if (isRunning = !isRunning) loop(); else noLoop(); } /*____________________________________________________________________________________________________*/ // Pause animation final void mousePressed() { keyPressed(); } /*____________________________________________________________________________________________________*/