Skip to content

Instantly share code, notes, and snippets.

@butchi
Last active March 23, 2017 09:38
Show Gist options
  • Save butchi/3af3d5be92352f4d0e347edf8bf34077 to your computer and use it in GitHub Desktop.
Save butchi/3af3d5be92352f4d0e347edf8bf34077 to your computer and use it in GitHub Desktop.
必ず元の場所に戻るランダムウォークのサンプル ref: http://qiita.com/butchi_y/items/b1b2a2cd5d9fc81a746e
const LENGTH = 25; // 25×2の50回ランダムウォークする
const MAGNITUDE = 10; // 振動ピクセル幅
// 入力した正の数を正負両方含む配列(倍のサイズ)として返す
function double(arr) {
let ret = [];
arr.forEach((num) => {
ret.push(num);
ret.push(-num);
});
return ret;
}
// Fisher–Yatesアルゴリズムによる配列シャッフル
function shuffle(arr) {
let ret = [].concat(arr);
for(let i = ret.length - 1; i > 0; i--){
let r = Math.floor(Math.random() * (i + 1));
let tmp = ret[i];
ret[i] = ret[r];
ret[r] = tmp;
}
return ret;
}
// ランダムウォークの対象要素
let walkerElm = document.querySelector('.walker')
// ランダムウォークを始めるボタン
let startBtn = document.querySelector('.btn-start');
startBtn.addEventListener('click', () => {
// ランダム数値配列(mapを有効にするため一旦0で初期化)
let deltaXArr = (new Array(LENGTH)).fill(0).map(() => {
return Math.random() * MAGNITUDE;
});
let deltaXArr2 = double(deltaXArr);
let shuffleXArr = shuffle(deltaXArr2);
// 累積変動量
let deltaX = 0;
for(let i = 0; i < LENGTH * 2; i++) {
setTimeout(() => {
deltaX += shuffleXArr[i];
walkerElm.style.transform = `translateX(${deltaX}px)`;
}, i * 50);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment