动画帆布形状从任何位置居中

时间:2015-10-18 19:45:35

标签: javascript html5 canvas

所以我对如何使形状设置为画布中心有点困惑。我可以得到中心值:

width = canvas.width = window.innerWidth,
height = canvas.height = window.innerHeight,
centerX = width / 2,
centerY = height / 2;

和简单的减量或增量取决于初始位置是正还是负也可以这样做:

var x = 100;
var y = 100;

    function fn (){
       ctx.beginPath();
       ctx.arc(x, y, 50, 0, 2 * Math.PI, false);
       ctx.fillStyle = '#444';
       ctx.fill();
       ctx.closePath();

       x -= 1;
       y -= 1;
    }

动画将使用:

完成
requestAnimationFrame(fn)

这一切都有问题。我需要每次手动调整x和y。我怎样才能更好地简单地使x和y值随机变为形状并使其成为中心的动画,无论从哪个方向以及初始位置是负还是正。我在考虑atang2但老实说我并不完全确定。

2 个答案:

答案 0 :(得分:2)

你基本上走在正确的轨道上。使用Math.sqrt表示距离,使用Math.atan2查找方向。然后就是你希望物体移动到目标(画布中心)的速度(速度)问题。

var tx = centerX - x,
    tx = centerY - y,
    distance = Math.sqrt(tx * tx + ty * ty),
    radius = Math.atan2(ty, tx),
    angle = (radius / Math.PI) * 180;

// Ensure we don't divide by zero if distance is 0
if (distance !== 0)
{
   velX = (tx / distance) * velocity;
   velY = (ty / distance) * velocity;

   x += velX;
   y += velY;
}

答案 1 :(得分:0)

给出的答案是有缺陷的,因为没有检查除零。这个错误很容易被忽略,然后在生产代码中突然出现,很难找出出错的地方。

应该是

var tx = centre.x - x;
var ty = centre.y - y;
var dist = Math.sqrt(tx * tx + ty * ty);
// or 
var dist = Math.sqrt(Math.pow(tx, 2) + Math.pow(ty, 2));
if(dist !== 0){ // must have this test or when the coords get to the centre 
                // you will get a divide by zero
     tx /= dist;  // Normalise direction vector
     ty /= dist;
}
tx *= speed; // set the magnitude to required speed;
ty *= speed; // Note that if at the centre this will be zero
x += tx;
y += ty;