我有複雜的多邊形,我知道最小x,最小y,最大x和最大y。我也有另一個矩形,我知道左上角和右下角的頂點。知道這些信息,我怎麼知道這兩個邊框是否碰撞?謝謝邊界矩形碰撞測試?
2
A
回答
3
嘗試這樣:
typedef struct rect {
int top; // maximum y-coord
int bottom; // minimum y-coord
int left; // minimum x-coord
int right; // maximum x-coord
} rectangle;
// Returns 1 if the point (x, y) lies within the rectangle, 0 otherwise
int is_point_in_rectangle(rectangle r, int x, int y) {
if ((r.left <= x && r.right >= x) &&
(r.bottom <= y && r.top >= y))
return 1;
return 0;
}
// Returns 1 if the rectangles overlap, 0 otherwise
int do_rectangles_intersect(rectangle a, rectangle b) {
if (is_point_in_rectangle(a, b.left , b.top ) ||
is_point_in_rectangle(a, b.right, b.top ) ||
is_point_in_rectangle(a, b.left , b.bottom) ||
is_point_in_rectangle(a, b.right, b.bottom))
return 1;
if (is_point_in_rectangle(b, a.left , a.top ) ||
is_point_in_rectangle(b, a.right, a.top ) ||
is_point_in_rectangle(b, a.left , a.bottom) ||
is_point_in_rectangle(b, a.right, a.bottom))
return 1;
return 0;
}
您可以爲任何多邊形做同樣的,只是遍歷所有的點,並呼籲is_point_in_rectangle
他們。由於您只有複雜多邊形的邊界框,因此此方法可能會出現誤報(即,矩形位於複雜多邊形的邊界框內,但位於多邊形本身之外)。但是,這種限制適用於將複雜形狀簡化爲邊界框的任何方法。
2
如果區間[Ax1,Ax2]和[Bx1,Bx2]重疊和,區間[Ay1,Ay2]和[By1,By2]重疊,則矩形A和B發生碰撞。
0
我覺得下面的作品大多數的時代,但它肯定比邊界框檢查更準確,雖然比較複雜。看看以下問題:
Polygon in rectangle algorithm?
在那裏,您會看到找出一種算法,如果一個點是多邊形內。您可以將此測試應用於第一個poly w.r.t的每個點。第二個。然後是相反的。如果測試通過至少一次,就會發生碰撞。
0
創建矩形左右邊緣的x座標的排序數組。然後,使用「掃描線」通過矩形從左向右移動。保留一個二叉搜索樹,該樹包含與掃描線重疊的矩形的頂部和底部邊緣的y座標。對於數組的每個元素,檢查它是左邊還是右邊。如果是右邊緣,請從BST上取下相應的頂部和底部邊緣。如果它是左邊緣,則在BST中搜索與當前矩形重疊的矩形;如果有,返回重疊。然後,將矩形頂部和底部邊緣的y座標添加到BST。搜索需要O(n log n)時間,因爲需要O(n log n)時間對矩形進行排序,並且每次2n次迭代需要O(log n)時間 - 從谷歌搜索結果複製。
相關問題
- 1. JavaScript碰撞檢測矩形和一組邊界座標?
- 2. 矩形碰撞測試問題
- 3. 碰撞檢測Libgdx矩形
- 4. 矩形碰撞
- 5. 矩形和圓形碰撞檢測
- 6. Pygame矩形碰撞
- 7. Box2D矩形碰撞
- 8. 檢測畫布邊界上的碰撞
- 9. 使用邊界框檢測碰撞
- 10. 多維邊界框碰撞檢測
- 11. Android Box2D碰撞檢測:如何測試特定邊界?
- 12. 如何識別四邊形多邊形(非矩形)碰撞檢測?
- 13. Java遊戲碰撞檢測,(側面碰撞)與矩形
- 14. ActionScript 3.0中的矩形碰撞檢測?
- 15. 碰撞檢測旋轉矩形
- 16. 碰撞檢測在旋轉矩形
- 17. 帶旋轉矩形的碰撞檢測
- 18. Android中的2D矩形碰撞檢測
- 19. 路徑上的矩形碰撞檢測
- 20. 矩形碰撞檢測工作不
- 21. 圈旋轉矩形碰撞檢測
- 22. 矩形彈跳碰撞檢測
- 23. easeljs檢測碰撞兩個矩形
- 24. 圓和矩形的碰撞檢測
- 25. 矩形之間的碰撞檢測libgdx
- 26. Java矩形碰撞檢測混淆
- 27. LibGDX - 2d中的矩形碰撞檢測?
- 28. MonoGame碰撞檢測矩形的起源
- 29. 檢測用矩形的碰撞圈
- 30. C++車削矩形的碰撞檢測
我懷疑這個算法比需要更難。至少,do_rectangles_intersect()中的第二組測試是多餘的。 – 2010-08-11 00:48:49
我如何更正確地做到這一點,以避免誤報?謝謝 – jmasterx 2010-08-11 00:48:59
@ Brian-第二個測試是檢測矩形A完全位於矩形B內的情況。矩形重疊,但B的角落都不在A內。您必須檢查相反方向。 @ Jex-如果您在複雜多邊形上使用邊界矩形,則無法避免誤報。如果你想檢測矩形和任意多邊形之間的碰撞,那完全是一個完全不同的問題。 – bta 2010-08-11 00:52:21