// var data = { // pos: {x, y} // target: {x, y} // } // dt: dt function dot(a, b) { return a.x * b.x + a.y * b.y; } function mul(vec, m) { return {x: vec.x*m, y: vec.y*m}; } function add(a, b) { return {x: a.x+b.x, y: a.y+b.y}; } function sub(a, b) { return {x: a.x - b.x, y: a.y - b.y}; } function length(a) { return Math.sqrt(dot(a, a)); } function limit(vec,size) { const len = length(vec); if (len > size) { return mul(vec, size/len); } return vec; } function decay(val, rate, dt) { return val * Math.exp(-rate*dt); } function powerDecay(val, rate, p, dt) { let x = Math.pow(val/rate, 1.0 / p); let x2 = Math.max(x - dt, 0.0); return rate * Math.pow(x2, p); } const delta = sub(data.target, data.pos); const dist = length(delta); if (dist > 0.0) { const dir = mul(delta, 1.0 / dist); //const mag = Math.min(dist - decay(dist, 12.0, dt), 25); //const mag = dist - decay(dist, 8.0, dt); const mag = dist - powerDecay(dist, 1000, 3, dt); const move = mul(dir, mag); data.pos = add(data.pos, move); } return data;