1

私は大きな円と大きな円の中にある約30個の小さな泡を持っています。小さな泡は大きな円から出ることはできず、小さな泡が別の泡と出会うと、反対方向に偏向します。

これは、2つの小さな円のたわみのコードです。

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

大きな円の中の泡

さて、ここに問題があります。この写真でわかるように、時々私の泡が衝突しているのですが、その理由はわかりません。1つのサークルがクラッシュするまではすべて正常に機能し、その後突然、ますます多くのバブルが戦争に参加します。円375、240、330、410を見てください。最初は、これは異なる速度と関係があるのではないかと思いましたが、それは問題ではありませんでした。誰かアイデアはありますか?

4

4 に答える 4

1

あなたのコードは、円が互いに真っ直ぐに移動しているために衝突すると想定しています。したがって、衝突の反応は、両方の円がまったく反対の方向に進むことです。

ほぼ同じ方向に動いているサークルミーティングの場合、その反応は奇妙になります。円が交わる角度を計算し、そこから円が交換する運動量とそれが各円にどのように影響するかを計算する必要があります。

これはおそらく、円が1回の計算で複数の衝突を行って互いに移動するという不安定な反応が原因です。円が衝突に対して180度回転するので、それは2回(または任意の偶数)衝突した場合、何も起こらなかったかのように進み続けることを意味します。

于 2012-10-16T16:19:56.453 に答える
0

ある半径が別の半径の内側に入り、衝突を検出したように見えますが、半径の外側に出る前に、衝突を再度検出し、方向が間違った方法で再び逆になります。1つの円が別の円の内側に入ると、両方の円が永久に振動します。

于 2012-10-16T16:08:17.580 に答える
0

衝突をチェックする必要があると思います。衝突が検出されたら、衝突したものからバブルを遠ざけて、重なりがないようにします。現在、衝突をチェックしていますが、逆の速度で状況が修正されるまで、その間に衝突をオーバーラップさせます。重複してはいけません。

于 2012-10-16T16:10:11.517 に答える
0
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) {
xbubble1 -= xVelocityBubble1;
ybubble1 -= yVelocityBubble1;
xbubble2 += xVelocityBubble2;
xbubble2 += yVelocityBubble2;

xVelocityBubble1 *= -1;
yVelocityBubble1 *= -1;
xVelocityBubble2 *= -1;
yVelocityBubble2 *= -1;
}
}

泡が一種の違法な状態になるため、衝突の原因となったアクションを元に戻す必要があります

于 2012-10-16T16:10:53.757 に答える