2012-01-08 28 views
2

enter image description here圓形碰撞反應,同時移向一個點。 (已解決)

我有圈子(可以有兩個以上)正朝着一個點移動。到目前爲止,它們在接近時會重疊。我該如何做到這一點,以便它們不相交,但仍然朝着這一點邁進?

P.S .:我正在使用Java。

編輯:

  • 圓圈不遵循物理定律的球,他們 代表生物體(無關)。
  • 我已經有碰撞檢測工作
  • 圓圈不粘在一起,它們根本不能相交。

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

我認爲你需要做進一步的細節,以行爲應該是什麼時候圈發生碰撞。 – 2012-01-08 00:25:42

+1

你想知道如何從頭開始做這件事嗎?或者你想知道Java中可以提供幫助的庫嗎? – 2012-01-08 00:26:39

+0

圖像中的那些圓圈將在*某點*處發生碰撞。 – Perception 2012-01-08 00:41:10

回答

1

這不是一個簡單的問題。

我認爲你有一些系統計算圓的座標,渲染它們,並重復。這些重複稱爲幀。

每個圓都有一個向量,它描述了它應該移動的方向。在每個幀上,您需要執行碰撞檢測,並根據需要更改該向量。

任何兩個圓之間的碰撞可以通過檢查它們之間的距離是否小於它們的半徑之和來檢測。碰撞圓的中心之間的連線爲您提供碰撞的方向。一個圓的碰撞矢量在碰撞的方向上,指向圓的中心,其大小等於圓重疊的單位數的一半,即它們的半徑減去他們之間的距離除以二。 (如果這些圓的大小可能不相同,那麼就需要弄清楚劃分的多少)。

因此,對您的問題的一種可能的解決方案是簡單地將碰撞矢量添加到方向矢量然後縮放方向矢量,使其大小等於碰撞前的大小。 (所以只有它的方向將被調整,而不是它的大小)。

請注意,這隻適用於你給出的具體描述,你希望球粘在一起並繼續向點移動;如果你想要更逼真的效果,你需要模擬檯球類型的物理。

+0

請閱讀編輯,我希望我已澄清。你會用僞代碼來詳細說明第4段(「任何兩個之間的碰撞...」)嗎? – 2012-01-08 01:41:51

+0

那麼,你說你已經有碰撞檢測工作,所以你不需要這個段落。一旦你計算出了碰撞矢量,真正的問題是如何處理。我認爲將其添加到方向矢量將產生所需的效果。 (注意:在每一幀中,您需要計算碰撞*,就好像*運動向量已應用於圓的位置,然後通過添加碰撞向量來修改運動向量,然後最後將修改的運動向量應用於球的位置,否則,這些圓會重疊。) – 2012-01-08 01:50:14

+0

你能證明獲得碰撞矢量所需的數學嗎? – 2012-01-08 01:51:04

0

而不是重新發明輪子,考慮使用現有的2D物理引擎。它會爲你做所有的碰撞檢測,它會很快,並可能免費爲你提供很多很酷的功能。

JBox2D是流行開源2D物理引擎Box2D的Java端口。一個好地方開始。

0

我用JQuery做了。 這裏是數學背後 - 沒有三角函數。

用一個球向你想要的方向邁出一小步。

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

檢查所有其他球[我]他們是否碰撞。

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

現在 - 在通過兩個中心點的直線上 - 推動其他球(如果他們碰撞),以便他們只是互相接觸。

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

滑動其位置已改變的每個球[i]。意識到x,y是中點的座標,而不是左上角的座標。 Math.round(x [i] -r),「top」:Math.round(y [i] -r)});

如果你想看到它的工作看here