3

私は Java の初心者ですが、たくさんのボールが跳ね回るアプリケーションを作成することにしました。この種のスレッドで多く言及されている法線について、私はほとんど何も知らないことに注意してください。また、代数 1 しか取っておらず、三角関数 (sin、cos、tangent) についても少し知っています。いずれかの方法...

を使用して、衝突検出をカバーしています
if (java.awt.geom.Point2D.distance(X1, Y1, X2, Y2) < ball1.radius + ball2.radius) {return true;} else {return false;}

if (ball.x + ball.radius > getWidth) {COLLISION}

4つの壁すべてについて

私がする必要があるのは、これらの衝突を、速度と方向を切り替えるだけでなく、半現実的な方法で処理することです。

すべてが JPanel で描画されます

事前にご協力いただきありがとうございます

4

2 に答える 2

4

衝突時の反射ベクトルを計算するには、法線とは何かを理解する必要があります。幸いなことに、理解するのはそれほど難しくありません。数学が苦手な人のために、私は少し不正確になるので、それについて私を殴らないでください. :)

法線は、サーフェスに対して (90 度の角度で) 直交する単純な単位ベクトル (単位: マグニチュード = 1 を持つ) です。法線は、サーフェスからまっすぐ突き出ている矢印として視覚化できます。壁が傾いていないので、壁の法線を計算するのは簡単です (ここでは画面の左上隅が 0,0 であると仮定します)。

top: (0,1)
bottom: (0,-1)
left: (1,0)
right: (-1,0)

私たちがしなければならないことは、ボールの速度を取得し、ぶつかった壁の法線ベクトルに沿って「反射」することです。反射の式は次のとおりです。

V2 = V1 - 2*N*(N.dot(V1))

ここで、V1 は入射ベクトル (この場合は古い速度)、N はぶつかった壁の法線、V2 は反射ベクトル (新しい速度) です。「N.dot(V1)」は、N と V1 の「内積」であり、(Nx V1.x + Ny V1.y) です。

私たちが行っていることのウィキペディアからの写真 (P は入射ベクトル、Q は反射ベクトル):

代替テキスト

疑似コードの全体は次のとおりです。

float nx = 0, ny = 1; // replace these with the normal of the wall you hit
float ix = ball.vx, iy = ball.vy; // incident vector
float dotprod = (nx*ix + ny*iy); // the dot product i mentioned earlier

ball.vx = ix - 2*nx*(dotprod);
ball.vy = iy - 2*ny*(dotprod);

何か不明な点があればお知らせください。:) また、これは壁にとってはやり過ぎですが、ボールとボールの衝突を行うときは法線を計算する必要があるため、完全に無駄ではありません...

于 2010-07-11T01:56:13.707 に答える
1

ベクトルを使用した弾性衝突について説明している、三角法を使用しない2次元弾性衝突の記事をお勧めします。この動的モデルは、Javaでアプローチを実装します。

于 2010-07-11T03:28:18.860 に答える