2011-04-25 29 views
2

首先,我對C++很陌生!所以我已經有了一個標準的2d空間元素列表,我想做一些基本的碰撞檢測。我的第一個想法(來自大多數Java背景......)是將每個對象與其他對象進行比較,調用一個函數來檢查每個對或對象上的交集。這在Java中很簡單,將ArrayList的第一項與第二項,第三項等進行比較,然後將第二項與第三項,第四項等進行比較。這是我採用的方法問題在C++中,但我使用的是一個迭代器(而不是象我在Java中那樣直接訪問元素),但是迭代器可以線性使用,對吧?所以直接訪問是不合適的。用於碰撞檢測的C++雙迭代器循環

所以我的問題是如何執行此算法?我也有理由相信,這不是檢測碰撞的最佳方式(非常基本),所以對此的任何建議都會受到歡迎。這是我的(非工作)代碼。

for (list<Box>::iterator p = mBoxes.begin(); p != mBoxes.end(); p++) { 
    for (list<Box>::iterator q = mBoxes.begin() + p); q != mBoxes.end(); q++) { 
     if (p->isIntersecting(q)) { 
      p->changeDirection(); 
      q->changeDirection(); 
     } 
    } 
} 

這應該說明我試圖方法,但當然,我的嘗試mBoxes.begin() + p不起作用!

+2

只是一個建議,當處理迭代器時,更喜歡前綴++而不是後綴(性能明智),所以在你的循環中它應該是:++ q和++ p – snoofkin 2011-04-25 19:58:21

+0

註明以備將來使用! – jackbot 2011-04-25 20:08:53

+0

還有一個建議:如果你想使用索引而不是interator,考慮'std :: vector'而不是'std :: list.' – 2011-04-25 20:14:04

回答

5

編輯:迴應多個評論。

for (list<Box>::iterator p = mBoxes.begin(); p != mBoxes.end(); ++p) { 
    for (list<Box>::iterator q = p); q != mBoxes.end(); ++q) { 
     if (p==q) continue; 
     if (p->isIntersecting(*q)) { 
      p->changeDirection(); 
      q->changeDirection(); 
     } 
    } 
} 
+0

因爲p和q是指針,你可以比較它們(例如「if(p == q)繼續;「跳過比較本身) – 2011-04-25 20:04:30

+0

偉大,非常有意義。我的isIntersecting()函數需要一個Box類型作爲參數,我如何從列表中獲取實際元素,並按照我的示例傳遞它q通過迭代器 – jackbot 2011-04-25 20:05:27

+0

「* q」應該爲您提供迭代器指向的框至。 – Arelius 2011-04-25 20:08:41

-1

像這樣的東西應該工作:

for (int p = 0; p < mBoxes.size(); ++p) 
{ 
    for (int q = 0; q < mBoxes.size(); ++q) 
    { 
     if (p == q) 
     { 
      // don't compare for collision against itself 
      continue; 
     } 
     if (mBoxes[p]->isIntersecting(mBoxes[q])) 
     { 
      mBoxes[p]->changeDirection(); 
      mBoxes[q]->changeDirection(); 
     } 
    } 
} 

然而,一個問題,這是因爲你遍歷你會比較p相交q和也q相交p意思是,如果他們不相交他們會改變方向兩次,每次都將它們放回相同的方向。所以需要一些額外的邏輯來避免這種情況。

+1

-1:'int p' ...'p-> isIntersecting'?你認爲'p'是什麼類型? – 2011-04-25 20:04:52

+0

這是行不通的,mBoxes是一個Box元素的鏈表,你已經做了p和q整數,他們沒有你調用的方法,而且你不能索引到mBoxes,因爲鏈表是可迭代的,不可索引。 – Arelius 2011-04-25 20:06:51

1

列表類是一個鏈表,你不能直接索引它。此外,迭代器不是索引,+只是沒有任何意義。但是,從理論上講,如果將q = mboxes.begin()+ p改爲q = p,應該可以複製一個迭代器,它應該將q設置爲指向p的相同位置的迭代器,這可能只是解決你的問題。

for (list<Box>::iterator p = mBoxes.begin(); p != mBoxes.end(); p++) { 
    for (list<Box>::iterator q = p, q++; q != mBoxes.end(); q++) { 
    if (p->isIntersecting(q)) { 
     p->changeDirection(); 
     q->changeDirection(); 
    } 
    } 
} 

的Q ++應該簡單地跳過當前元素,所以你不要對自己比較的項目。