Last active
March 23, 2017 09:38
-
-
Save butchi/3af3d5be92352f4d0e347edf8bf34077 to your computer and use it in GitHub Desktop.
必ず元の場所に戻るランダムウォークのサンプル ref: http://qiita.com/butchi_y/items/b1b2a2cd5d9fc81a746e
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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