added exploratory work for the frontend

This commit is contained in:
didier amyot committed 2024-01-17 06:01:44 -05:00
commit b69b33ee59
4 files changed
+132

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Animation</title>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="description" content="" />
<link rel="icon" href="favicon.png">
<script src="main.js" type="module"></script>
</head>
<body>
<h1>Hello, world!</h1>
<svg height="300" width="1000" style="border: solid;">
<rect x="0" y="157.5" width="15" height="15"
style="fill: red;" id="rect-1"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="fill: blue;" id="rect-2"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="fill: yellow;" id="rect-3"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="fill: pink;" id="rect-4"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="fill: purple;" id="rect-5"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="fill: black;" id="rect-6"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="stroke: red; fill-opacity: 0;" id="rect-7"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="stroke: blue; fill-opacity: 0;" id="rect-8"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="stroke: yellow; fill-opacity: 0;" id="rect-9"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="stroke: pink; fill-opacity: 0;" id="rect-10"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="stroke: purple; fill-opacity: 0;" id="rect-11"></rect>
<rect x="0" y="157.5" width="15" height="15"
style="stroke: black; fill-opacity: 0;" id="rect-12"></rect>
</svg>
<div>
<button id="play">play</button> <br>
<button id="pause">pause</button>
<br>
<input type="number" id="seek-value">
<button id="seek">seek</button>
</div>
</body>
</html>
+62
View File
@@ -0,0 +1,62 @@
import anime from "https://esm.sh/animejs@3.2.2";
const second = 1000;
function gaussianRandom(mean=0, stdev=1) {
const u = 1 - Math.random(); // Converting [0,1) to (0,1]
const v = Math.random();
const z = Math.sqrt( -2.0 * Math.log( u ) ) * Math.cos( 2.0 * Math.PI * v );
// Transform to the desired mean and standard deviation:
return z * stdev + mean;
}
function* brownian(n){
let x = 0;
for(let i = 0; i < n; i ++){
x += gaussianRandom(0, 10);
console.log(x);
yield x;
}
}
function* pseudoBrownian(n, limit){
let x = 0;
for(let i = 0; i < n; i ++){
let delta = gaussianRandom(0, 10);
if(Math.abs(x + delta) > limit){
delta = -1 * delta
}
x += delta;
yield x;
}
}
function* keyFrames(duration, framePerSeconds){
const deltaX = 1000 / (duration * framePerSeconds);
for(const deltaY of pseudoBrownian(duration * framePerSeconds, 100)){
yield {translateX: `+=${deltaX}`, translateY: deltaY};
}
}
const duration = 60;
const timeline = anime.timeline({
duration: duration * second,
autoplay: false,
easing: 'linear'});
for(let i = 1; i <= 12; i++){
timeline.add({
targets: `#rect-${i}`,
keyframes: Array.from(keyFrames(duration, 30)),
}, 0)
}
document.querySelector('#play').onclick = timeline.play;
document.querySelector('#pause').onclick = timeline.pause;
document.querySelector('#seek').onclick = function(){
const seekVal = Number.parseFloat(second * document.querySelector('#seek-value').value);
timeline.pause();
timeline.seek(seekVal);
}