/**
* Strange Attractors in Chaos Theory
* "The Chaos Game" to build the Sierpinski Triangle
*
* @author Jeremy Heminger <j.heminger13@gmail.com>
* @dependency wes.mantooth.js
*
* This was discovered in the 1970's. It's called a game, but really it's a demonstartion of stange attractors.
* 1. On a piece of paper draw 3 points creating a triangle. Let these points be named [ [ 1,2 ],[ 3,4 ],[ 5,6 ] ]
* 2. Draw a point at any random location on the paper (as long as it is within the triangle)
* 3. Roll a 6-sided die
* 4. Draw a point half-way from the first point to the corresponding point in the triangle to the roll of the die.
* - example a roll of 3 would correpond to point [ 3,4 ]
* 5. Roll the die again
* 6. From the second point, draw another point half-way to the corresponding point (repeating step 4 )
* 7. Repeat this steps n
*
* The result will be a highly ordered system from a nearly random input
*
* This program automates the steps to allow the result to be displayed
* */
// when the browser is ready, run the program
window.onload = function() {
Chaos.init();
}
/**
* Chaos
* @returns {Object}
* */
var Chaos = (function() {
"use strict";
// the borders
// @param {Array}
var tri_p = [];
// track the chaos
// @param {Array}
var prev_xy, now_xy;
// @param {Number}
var LOOPID;
// @param {Number}
var LOOPCOUNT = 0;
// @param {Number}
var LOOPMAX = 10000;
// @param {Number}
var I;
/**
* init
* initialize everything
* @returns {Void}
* */
var init = function() {
// set the grid to 1/2 the visible width x the visible height
// @param {Number}
var w = (window.innerWidth / 2);
// @param {Number}
var h = window.innerHeight;
// set a grid unit
// @param {Number}
var s = w / 110;
// initialize Wes Mantooth
I = $w.canvas.init(document.getElementById("target"));
// lets draw a grid to help set things up
$w.draw.grid(I,w,h,10);
// draw {5,6}
tri_p[0] = [(w/2),(s * 3)];
$w.canvas.text(I,tri_p[0][0],tri_p[0][1]-s,"{ 5,6 }");
$w.canvas.circle(I,tri_p[0][0],tri_p[0][1],5);
// draw {3,4}
tri_p[1] = [(w/8),(h - (s * 4))];
$w.canvas.text(I,tri_p[1][0]-(s * 3),tri_p[1][1],"{ 3,4 }");
$w.canvas.circle(I,tri_p[1][0],tri_p[1][1],5);
// draw {1,2}
tri_p[2] = [(w/2)+(w/3),(h - (s * 4))];
$w.canvas.text(I,tri_p[2][0]+(s * 2),tri_p[2][1],"{ 1,2 }");
$w.canvas.circle(I,tri_p[2][0],tri_p[2][1],5);
// create a seed
now_xy = [(tri_p[1][0] + Math.random() * tri_p[2][0]),tri_p[0][1] + Math.random() * tri_p[1][1]];
// make sure the seed is located inside the triangle
while(!$w.collision.inside(now_xy,tri_p)) {
now_xy = [(tri_p[1][0] + Math.random() * tri_p[2][0]),tri_p[0][1] + Math.random() * tri_p[1][1]];
}
LOOPID = setInterval(function(){loop()},10);
}
/**
* loop
* self explanitory
* @returns {Void}
* */
var loop = function() {
// holds the current target
// @param {Array}
var t;
// let r be the value of roll of the dice
var r = rolldice();
//
if (r == 1 || r == 2)t = tri_p[2];
if (r == 3 || r == 4)t = tri_p[1];
if (r == 5 || r == 6)t = tri_p[0];
// get the direction of the target point from the current origin
var d = $w.motion.point_direction(now_xy[0],now_xy[1],t[0],t[1],false);
// get the distance to the target point form the current origin
var dis = $w.motion.distance_to_point(now_xy[0],now_xy[1],t[0],t[1]);
// set the current origin to a point 1/2 the distance form the origin to the target
now_xy = $w.motion.motion_set(now_xy[0],now_xy[1],d,dis*30);
// draw a dot at the new origin
$w.canvas.circle(I,now_xy[0],now_xy[1],1);
// increment the loop count
LOOPCOUNT++;
if (LOOPCOUNT >= LOOPMAX) {
// if the loopcount is greater than the loopmax then we are done
clearInterval(LOOPID);
}
}
/**
* rolldice
* returns a random integer between 1 - 6
* @returns {Number}
* */
var rolldice = function() {
// well use the $ws function framdom
// to get a flat integer between 1-6
return 1 + $w.math.frandom(6);
}
return {
init: init
};
}());