Javascript,Canvas:计算飞行气泡的角度

时间:2012-10-19 16:01:23

标签: javascript canvas html5-canvas angle

我有什么:

很多泡沫。但为了使它更简单,让我说我有两个。当他们相遇时,他们会发生碰撞并改变方向。

var xVelocityBubble1 = Math.random();
var yVelocityBubble1 = Math.random();

var xVelocityBubble2 = Math.random();
var yVelocityBubble2 = Math.random();

moveBubbles = function() {
xbubble1 += xVelocityBubble1;
ybubble1 += yVelocityBubble1;

xbubble2 -= xVelocityBubble2;
xbubble2 -= yVelocityBubble2;

if (Math.sqrt(Math.pow(xbubble1 - xbubble2, 2) + Math.pow(ybubble1 - ybubble2, 2)) < radius * 2) {
xVelocityBubble1 *= -1;
yVelocityBubble1 *= -1;
xVelocityBubble2 *= -1;
yVelocityBubble2 *= -1;
}
}

我想要的是什么:

我不希望圈子只是改变方向,因为这看起来很奇怪而且很无聊。所以我想计算圆相遇的角度,从中我需要计算它们交换的动量以及它对每个圆的影响。

我的问题:

我真的不知道如何计算角度和动量!任何提示?

2 个答案:

答案 0 :(得分:1)

如果它们碰撞,要获得这两个气泡之间的角度,请执行以下操作:

获取其中一个气泡正在移动的方向向量

direction = {x: Math.abs(xVelocityBubble1), y: Math.abs(yVelocityBubble1)};

然后标准化该向量(将其x和y分量除以它的长度)

在这样做之后,你将角度的余弦作为x分量,正弦作为y,只需在Math.acosMath.asin中使用它们中的任何一个,你就会有角度他们相撞的地方。

答案 1 :(得分:0)

此代码显示小行星的碰撞:

            for (var i = 0; i < asteroidsLength; i++) {
                var tmpAsteroid = asteroids[i];

                for (var j = i + 1; j < asteroidsLength; j++) {
                    var tmpAsteroidB = asteroids[j];

                    var dX = tmpAsteroidB.x - tmpAsteroid.x;
                    var dY = tmpAsteroidB.y - tmpAsteroid.y;
                    var distance = Math.sqrt((dX * dX) + (dY * dY));

                    if (distance < tmpAsteroid.radius + tmpAsteroidB.radius) {
                        var angle = Math.atan2(dY, dX);
                        var sine = Math.sin(angle);
                        var cosine = Math.cos(angle);

                        // Rotate asteroid position
                        var x = 0;
                        var y = 0;

                        // Rotate asteroidB position
                        var xB = dX * cosine + dY * sine;
                        var yB = dY * cosine - dX * sine;

                        // Rotate asteroid velocity

                        var vX = tmpAsteroid.vX * cosine + tmpAsteroid.vY * sine;
                        var vY = tmpAsteroid.vY * cosine - tmpAsteroid.vX * sine;

                        // Rotate asteroidB velocity
                        var vXb = tmpAsteroidB.vX * cosine + tmpAsteroidB.vY * sine;
                        var vYb = tmpAsteroidB.vY * cosine - tmpAsteroidB.vX * sine;

                        // Conserve momentum
                        var vTotal = vX - vXb;
                        vX = ((tmpAsteroid.mass - tmpAsteroidB.mass) * vX + 2 * tmpAsteroidB.mass * vXb) / (tmpAsteroid.mass + tmpAsteroidB.mass);
                        vXb = vTotal + vX;

                        // Move asteroids apart
                        xB = x + (tmpAsteroid.radius + tmpAsteroidB.radius);

                        // Rotate asteroid positions back
                        tmpAsteroid.x = tmpAsteroid.x + (x * cosine - y * sine);
                        tmpAsteroid.y = tmpAsteroid.y + (y * cosine + x * sine);

                        tmpAsteroidB.x = tmpAsteroid.x + (xB * cosine - yB * sine);
                        tmpAsteroidB.y = tmpAsteroid.y + (yB * cosine + xB * sine);

                        // Rotate asteroid velocities back
                        tmpAsteroid.vX = vX * cosine - vY * sine;
                        tmpAsteroid.vY = vY * cosine + vX * sine;

                        tmpAsteroidB.vX = vXb * cosine - vYb * sine;
                        tmpAsteroidB.vY = vYb * cosine + vXb * sine;
                    };

                };