// 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;