2012-01-08 3 views
2

enter image description here点に向かって動いている円の衝突反応。 (解決済み)

私は点に向かって動いているサークル(2つ以上あります)があります。今のところ、彼らは近くにいるときに重なります。交差させないようにするにはどうしたらいいですか?

P .:私はJavaを使用しています。

EDIT:

  • 円は物理学の法則に従わボールではありません、それが表す 生物(無関係)。
  • 私はすでに衝突検出機能を持っています。
  • サークルは互いに張り付いていません。交差することはできません。

はSOLUTION:

public void circleCollision(circle1, circle2) {  
    double xDistance = circle1.x – circle2.x; 
    double yDistance = circle1.y – circle2.y; 
    double distance = xDistance * xDistance + yDistance * yDistance; 
    double angle = Math.atan2(ydist, xdist); 

    if (distance < circle1.diameter * circle1.diameter) { 
     circle2.x = circle1.x + (circle1.width * Math.cos(angle)); 
     circle2.y = circle1.y + (circle1.width * Math.sin(angle)); 
    } 
} 

のおかげ:http://awesty.com/blog/2008/09/circle-collisions/

+0

を見る作業を見たい場合は、私はあなたが円が衝突したときの挙動がどうあるべきかのように更に詳細に行く必要があると思います。 –

+1

これを自分で最初からやり直す方法を知りたいのですか、これを助けるJavaのライブラリを知りたいですか? –

+0

あなたの画像内のそれらの円は、あるポイントで衝突するでしょう。 – Perception

答えて

1

これは簡単な質問ではありません。

あなたは、円の座標を計算してレンダリングし、繰り返すシステムがあるとします。これらの繰り返しはフレームと呼ばれます。

各円には、移動するはずの方向を表すベクトルがあります。各フレームで、衝突検出を実行し、必要に応じてそのベクトルを変更する必要があります。

2つの円の衝突は、それらの間の距離が半径の合計よりも小さいかどうかを確認することで検出できます。衝突する円の中心間の線は、衝突の方向を示します。円の衝突ベクトルは、円の中心に向いた衝突の方向にあり、その大きさは、円が重なる単位の数の半分に等しくなります。つまり、その半径の合計からそれらの間の距離を2で割ったものです。 (サークルのサイズが違うと複雑になるので、分割の程度を把握する必要があります)

したがって、問題の解決策の1つは、方向ベクトルに単に衝突ベクトルを追加することですその円の大きさが衝突前の大きさと等しくなるように方向ベクトルをスケーリングする。

これは、指定した特定の説明、ボールを一緒に固着させてポイントに向かって移動し続ける場所でのみ機能することに注意してください。より現実的な効果が必要な場合は、ビリヤードボールタイプの物理をエミュレートする必要があります。

+0

編集を読んでください、私は明確にしたことを願っています。擬似コードを使用して第4段落( "2つの間の衝突" ...)を詳しく説明しますか? –

+0

さて、あなたはすでに衝突検出が働いていると言っています。だから、本当にその段落は必要ありません。真の問題は、あなたがそれを計算したら、衝突ベクトルと何をするかです。私はそれを方向ベクトルに加えると、望ましい効果が得られると思います。 (注:各フレームで、*移動ベクトルが円の位置に適用されているかのように衝突*を計算する必要があります。次に、移動ベクトルに衝突ベクトルを追加して変更し、最後に変更された移動ベクトルをボールの位置。それ以外の場合は、円が重なり合う) –

+0

衝突ベクトルを取得するために必要な計算を実演できますか? –

0

よりもむしろ車輪の再発明は、既存の2D物理エンジンを使用することを検討してください。それはあなたのためにすべての衝突の検出を行います、それは速く、おそらく無料で多くのクールな機能を提供します。

JBox2Dは、オープンソースの人気2D物理エンジンBox2DのJavaポートです。始めるには良い場所です。

0

私はJQueryでそれを行いました。 ここでは、三角関数のない数学があります。

あなたが望む方向に1つのボールで小さなステップを作ります。

 function pushball(distance,x,y,xgoal,ygoal,step){/ 
       var factor=1-step/distance; 
       var x=xgoal+(xgoal-x)*factor; 
       var y=ygoal+(ygoal-y)*factor; 
       return [x,y]; 

他のすべてのボール[i]が衝突しているかどうかを確認してください。

 function distance(x1,y1,x2,y2){ 
       var x=x1-x2;var y=y1-y2; 
       return Math.sqrt(x*x+y*y); 
       } 
     var dist=distance(x,y,x[i],y[i]); 
     var touch=r+r[i]; 

今 - 2つの中央の点を通る直線上に - (それらが衝突する場合)彼らは互いに接触するように、他のボールを押します。

 if(dist<touch){ 
      var range=dist-touch; 
      newposxy=pushball(distance,x,y,x[i],y[i],range); 
      } 

位置が変更された各ボール[i]をスライドさせます。 x、yは中点の座標であり、左上の座標ではないことに注意してください。$( "#ball")。offset({"left":Math.round(x [i] -r)、 "top":Math.round(y [i] -r)});

あなたはそれがhere

関連する問題