| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <style type="text/css"> | |
| #animatable { | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| height: 100px; | |
| width: 100px; | |
| background-color: green; | |
| -webkit-border-radius: 10px; | |
| -webkit-transition: -webkit-transform 1s; | |
| } | |
| #poster { | |
| font-family: 'Georgia', serif; | |
| font-size: 36px; | |
| font-weight: bold; | |
| text-align: center; | |
| margin-top: 28px; | |
| } | |
| #text { | |
| position: absolute; | |
| left: 20px; | |
| top: 400px; | |
| } | |
| #text > p { | |
| font-family: 'Verdana', serif; | |
| font-size: 12px; | |
| font-weight: bold; | |
| } | |
| </style> | |
| <script type="text/javascript"> | |
| const initialValues = [ | |
| "translate3d(100px, 100px, 0px)", | |
| "rotate3d(0, 1, 0, 0deg)", | |
| "scale3d(1, 1, 1)", | |
| "perspective(10000)", | |
| "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)", | |
| "skew(0deg, 0deg)" | |
| ]; | |
| const targetValues = [ | |
| "translate3d(250px, 250px, 0px)", | |
| "rotate3d(0, 1, 0, 30deg)", | |
| "scale3d(2, 2, 2)", | |
| "perspective(200)", | |
| "matrix3d(0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)", | |
| "skew(10deg, 10deg)" | |
| ]; | |
| var i = 1; | |
| var iterations = Math.pow(2, initialValues.length); | |
| var oldStyle = ""; | |
| // For the buffon needle experiment below. | |
| var hits = 0; | |
| var trials = 0; | |
| var estimate = 0; | |
| function triggerTransition() | |
| { | |
| var style = ""; | |
| var elem = document.getElementById("animatable"); | |
| for (var j = 0; j < initialValues.length; ++j) { | |
| if (j > 0) | |
| style += " "; | |
| var values = initialValues; | |
| if (Math.floor(i / Math.pow(2, j)) % 2 == 1) | |
| values = targetValues; | |
| style += values[j]; | |
| } | |
| elem.style.webkitTransform = style; | |
| i++; | |
| document.getElementById("from").innerHTML = "From:<br> " + oldStyle; | |
| document.getElementById("to").innerHTML = "To:<br> " + style; | |
| document.getElementById("estimate").innerHTML = "Buffon estimate of pi after " + trials.toString() + " needle drops:<br>" + estimate.toString(); | |
| oldStyle = style; | |
| if (i < iterations) | |
| setTimeout(triggerTransition, 1000); | |
| } | |
| function buffonStep() | |
| { | |
| for (var step = 0; step < 100000; ++step) { | |
| var x = 2.0 * Math.random(); | |
| x = Math.min(x, 2.0 - x); | |
| if (Math.cos(Math.PI * Math.random() * 0.5) > x) | |
| hits++; | |
| trials++; | |
| if (hits > 0) | |
| estimate = 2 * trials / hits; | |
| } | |
| if (i < iterations) | |
| setTimeout(buffonStep, 0); | |
| } | |
| function startExperiment() | |
| { | |
| triggerTransition(); | |
| buffonStep(); | |
| } | |
| window.addEventListener('load', startExperiment, false); | |
| </script> | |
| </head> | |
| <body> | |
| <div id="animatable"><p id="poster">Hi!</p></div> | |
| <div id="text"> | |
| <p id="from">From:</p> | |
| <p id="to">To:</p> | |
| <p id="estimate">Estimate:</p> | |
| </div> | |
| </body> | |
| </html> | |