Skip to content

Instantly share code, notes, and snippets.

@sethbergman
Created August 18, 2018 20:53
Show Gist options
  • Save sethbergman/9225d6619e367fe6d2f8140e46791670 to your computer and use it in GitHub Desktop.
Save sethbergman/9225d6619e367fe6d2f8140e46791670 to your computer and use it in GitHub Desktop.
Hyper Fractals
<!-- Please view in -webkit *****
*Hypotrochoid: a roulette traced by a point attached to a circle of radius r (var rad2) rolling around the inside of a fixed circle of radius R (var rad1), where the point is a distance d (var diam) from the center of the interior circle. (relate to the Spirograph)
(see: http://en.wikipedia.org/wiki/Hypotrochoid for equation)
TIPS:
* Move your mouse for objects to trail you - stop
suddenly to spawn something fantastic (mouse only)
* click for random awesome (mouse || touch)
* click&&hold zooming (mouse only)
* click once, keep mouse still > hit a few random keys of the keyboard (not too fast) as the shape enlarges for some real action.
* Use 'Clear Canvas' button if it gets too messy..
* The more you play, the more varied the designs become.
<!-- <div id = 'info'>Please Read The Use Tips <br />In The HTML Editor Section. </div> -->
<canvas id="canv" width='900' height='900'></canvas>
<div>
<button id = 'clear'>Clear Canvas</button>
</div>
</body>
//I've commented everything
//first attaching button behavior to clear canvas
window.onload = function () {
document.getElementById('clear').onclick = clear;
};
var M = Math, //assign math object
update = 0, // assign update / increment value
win = window,
c = document.getElementById("canv"),
$ = c.getContext("2d"),
W = c.width = win.innerWidth,
H = c.height = win.innerHeight;
$.fillRect(0, 0, W, H);
$.globalCompositeOperation = "lighter"; // display new image and old image
$.lineWidth = 0.2;
$.lineCap = "round";
var bool = 0, //truth value
theta = 0; // theta
win.requestAnimFrame = (function(callback) {
return win.requestAnimationFrame || win.webkitRequestAnimationFrame || win.mozRequestAnimationFrame || win.oRequestAnimationFrame || win.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})
//Randomly display objects / shapes in varius sizes through mouseover:
c.onmousemove = function (e) {
if(win.time) {
if(diam==9) { //our starting point
diam=Math.random()*15; //draw at random
f(1); //e = 1
}
clearTimeout(time);
}
X = e.pageX; // hold x,y coords
Y = e.pageY;
prevX=0; // previous x
prevY=0; // previous y
origX = X, // assign to original x
origY = Y; // assign to original y
rad1=(e.pageX/W * 999>>0)/999; //starting R (fixed point)
rad2=(e.pageY/H * 999>>0)/999; //starting r (inner point)
update = e.pageX/H * 360 >>0; //update value
diam=9; //size || diameter
n = 360 * Math.PI / 180; //even threshold value for maths
time = setInterval(f = function (e) { // start looping function f
$.save(); //save drawings
$.globalCompositeOperation = "source-over"; //now draw new image over over the old
if(e!=1) { //function f conditional(e)
//if not equal to 1 - ie. not equal to 9 (see earlier mousemove function)- draw like this:
$.fillStyle = "rgba(0,0,0,0.02)"; //super light overlay on...
$.fillRect(0, 0, W, H); //blank canvas > this will happen if there is no mouse movement, canvas will reset itself and move on to the following actions:
}
$.restore(); //restore context
i = 25; while(i --) { //vary sizes of objects
$.beginPath();
if(diam > 450 || bool) { // decrease diameter
if(!bool) { // has hit maximum
bool = 1; //true value is 1
}
if(diam < 0.1) { // has hit minimum
bool = 0; //truth value is 0
}
theta -= n; // decrease theta
diam -= 0.1; // decrease size
}
if(!bool) { //if not true, make it big
theta += n; // increase theta
diam += 0.1; // increase size
}
hypo = (rad1 / rad2 - 1) * theta; // create hypotrochoid from current mouse position, and setup variables
x = (rad1 - rad2) * M.cos(theta) + diam * M.cos(hypo) + (origX + (X - origX) * (i / 25)) + (rad2 - rad1); // center on xy coords
y = (rad1 - rad2) * M.sin(theta) - diam * M.sin(hypo) + (origY+ (Y - origY) * (i / 25));
if (prevX) { // draw once two points are set
$.moveTo(prevX, prevY);
$.lineTo(x, y)
}
$.strokeStyle = "hsla(" + (update % 360) + ",100%,50%,0.75)"; // draw rainbowed hypotrochoid
$.stroke();
prevX = x; // set previous x
prevY = y; // set previous y
}
update -= 0.5; // increment hue
origX = X; // set origin x
origY = Y; // set origin y
}, 16);
}
document.onkeydown = function(e) { //go wild on keyboard action
prevX = prevY = 0; //center
rad1 += 0.05 //abuse the fixed circle radius (R)
}
c.onmousemove({ //on mouse move, trail
pageX:300, pageY:290
});
function clear(){
$.clearRect(0, 0, W, H); //blank canvas
$.fillStyle = "rgba(0,0,0,1)"; //color it black
$.fillRect(0, 0, W, H);
}
//time out function for the note to users
setTimeout(function() {
var info= document.getElementById('info');
info.style.right = '-500px';
}, 5500);
@import url(https://fonts.googleapis.com/css?family=Raleway:900);
body{
margin:0;
width:100%;
overflow:hidden;
}
canvas{
width:100%;
height:100vh;
}
#info {
border-radius: 3px;
margin: 0;
position: fixed;
top: 0;
right: 0;
width:15em;
text-align:center;
text-shadow:
-1px 2px hsla(0,0%,0%,0.4);
background-color: hsla(255, 255%, 255%,1);
background-image:url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/131045/black-lozenge.png');
color: hsla(0,0%,0%,1);
padding: 1em;
transition: right 0.3s cubic-bezier(.65,.18,.79,.3);
line-height:1.5;
font-size:1.2em;
font-family: 'Raleway', sans-serif;
}
button{
float:left;
bottom:0em;
margin-bottom:0;
width:10em;
position:fixed;
border:none;
background-image:url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/131045/black-lozenge.png');
color: hsla(0,0%,0%,1);
font-weight:bold;
padding: .5em;
text-shadow: -1px 2px hsla(0,0%,0%,0.4);
background-color: hsla(255, 255%, 255%,1);
user-select:none;
outline:none;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment