我一直在實施我的窄相位碰撞檢測的幾個問題。 Broadphase正在完美運作。多邊形到多邊形碰撞檢測問題
我有一組多邊形,它們的頂點順時針順序具有一個stl :: vector數組。每個週期,我檢查他們是否碰撞。
我從here使用我的觀點的數據結構借來以下點在多邊形測試和改變了它:
int InsidePolygon(std::vector <Point> poly, Point p) {
int i, j, c = 0;
int nvert = poly.size();
for (i = 0, j = nvert-1; i < nvert; j = i++) {
if (((poly[i].y> p.y) != (poly[j].y> p.y)) && (p.x < (poly[j].x-poly[i].x) * (p.y-poly[i].y)/(poly[j].y-poly[i].y) + poly[i].x))
c = !c;
}
return c;
}
我已經延長,爲包括PolygonPolygon功能,檢查所有1個多邊形兌點另一個,然後扭轉它來檢查其他方式。
int PolygonPolygon(std::vector <Point> polygon1, std::vector <Point> polygon2) {
for(int i=0; i<polygon1.size();i++) {
if(InsidePolygon(polygon2, polygon1[i])) {
return 1;
}
}
for(int j=0; j<polygon2.size();j++) {
if(InsidePolygon(polygon1, polygon2[j])) {
return 1;
}
}
return 0;
}
奇怪的是,我的PolygonPolygon函數總是返回1.所以,我有幾個問題:
我有沒有什麼地方搞砸了的邏輯?我應該以不同的方式編寫我的PolygonPolygon函數嗎?
對於PolygonPolygon測試是否有更好的方法,多邊形本身不能保證是凸的,這就是爲什麼我在多邊形方法中選擇點的原因。我也希望能夠確定哪一點最終會發生碰撞,如果我能通過這一點。
我是否應該按照特定的順序來呈現我的觀點以進行InsidePolygon測試?
您對多邊形內點的測試將無法檢測到多邊形內部沒有點的多邊形重疊(請考慮像大衛星那樣排列的兩個三角形)。您可以測試一個多邊形與另一個多邊形的每個邊的交點,以確保我能想到。但聽起來像是越來越昂貴... – 2010-06-22 12:44:57
你應該用'const std :: vector&polygon1'替換'std :: vector polygon1'來提高性能。什麼輸入數據確實給出了1? –
2010-06-22 12:47:04
@Sam Holder,是的,我已經想到了,在我開始工作之後,邊緣檢測測試就在議程中。 @Alexey Malistov,目前爲止我輸入的任何輸入都會導致返回1.x和y值可以在-100到100之間的任何值。感謝您的優化。 – Cetra 2010-06-22 13:05:26