2013-09-22 269 views
1

我正在做一個小練習,我必須初始化一個以隨機速度在屏幕上移動的球物體數組。當他們碰撞時,我需要球反轉速度。問題是我只能將每個球與自己比較,以便它們不斷「相交」並來回放鬆。我有一個很好的感覺,這個問題在if語句之下,因爲我將球[i]與球[i]比較,其中「i」同時是相同的數字。當我通過交叉函數的球[我],我需要比較每個元素除了自身以外的其他元素。我嘗試了一些方法,但他們沒有工作,並且是多餘的。for循環和陣列比較問題

//爲平局內環路()

for(int i = 0; i < balls.length; i++){ 
    //balls[i].drawBalls(); 
    //balls[i].moveBalls(); 
    ***if (balls[i].intersect(balls[i])) { 
     balls[i].moveIntersectingBalls(); 
    }*** 
    } 

//球相交的方法

boolean intersect(Ball b) { 
    float distance = dist(bXpos,bYpos,b.bXpos,b.bYpos); 

    if (distance < bRadius + b.bRadius) { 
     return true; 
    } else { 
     return false; 
    } 
    } 

//移動球,如果交叉方法

void moveIntersectingBalls(){ 
    bXspd *= -1; 
    bYspd *= -1; 
    } 
+2

'比較球[I]到球[I]其中「i」同時是相同的number' - 是什麼那應該是什麼意思? – alfasin

+0

好的,你似乎已經注意到了這個問題(「問題是我只能比較每個球本身,以便它們不斷」相交「)。你能解釋一下爲什麼你不能比較兩個不同的球嗎? – SJuan76

回答

1

比較與其他所有的球每個球,你需要兩個for循環:

for (int i = 0; i < balls.length; i++) 
{ 
    for (int j = 0; j < balls.length; j++) 
    { 
     // Check first that you are not comparing a ball to itself. 
     if (i != j) 
      if (balls[i].intersect(balls[j])) 
       balls[i].moveIntersectingBalls(); 
    } 
} 
+0

謝謝你的工作 –

+0

太棒了!聽到那個消息很開心。 –

+0

我需要更多的代表才能做到這一點,但我覺得我會更頻繁地訪問這個論壇,以積累更多。再次感謝。 –

-1

你所需要的是什麼一個雙循環:

 for(int i = 0; i < balls.length; i++){ 
     for(int j = 0; j < balls.length; j++){ 
      if (balls[i].intersect(balls[j]) && i != j) { 
       balls[i].moveIntersectingBalls(); 
      } 
     } 
    } 

用雙循環比較每個球(第一個循環)和所有其他球(第二個循環),如果你打了一個,你可以調用moveIntersecingBalls();爲第一球。

這個算法可能可以優化,因爲當兩個球碰撞時再次檢查它們是沒有用的,但這是一個好的開始。

+1

嗯......它仍然需要球不能比較自己。 – SJuan76

+0

是啊我試過這個,但球比較自己,所以它仍然不起作用 –

+0

我修改了代碼,並糾正了,你只需要確保我!= j – SegFault

0

我的意思是,這代碼似乎並沒有太大的意義:

if (balls[i].intersect(balls[i])) { 
    balls[i].moveIntersectingBalls(); 
} 

但是你指出這一點我自己覺得。

你是否在尋找類似:

for(int i = 0; i < balls.length; i++){ 
    for(int j = (i+1); j < balls.length; j++){ 
     if (balls[i].intersect(balls[j])) { 
      balls[i].moveIntersectingBalls(); 
      // Maybe also add: 
      balls[j].moveIntersectingBalls(); 
     } 
    } 
} 

您可以在i,而不是從0開始的內循環,因爲你已經「選中」那些以前。事實上,如果你從0開始,你會檢查每個球對兩次(例如(1,3)和再次在(3,1)),可能會導致你描述的抽搐。

+1

'j = i + 1'或者檢查那'j!=我' – SJuan76

+0

好點,編輯相應。 – jedwards

+0

球[j]。moveIntersectingBalls();將無法工作,因爲當j將在第一個循環中檢查時,moveIntersectingBalls將在同一個球上執行第二次,它將取消第一次修改(* -1) – SegFault