使用C++判斷兩矩形是否相交


假設有矩形RECT1和RECT2、有八個頂點

 1 bool test_collision__2(SDL_Rect *rect1, SDL_Rect *rect2)
 2 {
 3     int x1_1 = rect1->x;
 4     int y1_1 = rect1->y;
 5     int x1_2 = rect1->x + rect1->w;
 6     int y1_2 = rect1->y;
 7     int x1_3 = rect1->x;
 8     int y1_3 = rect1->y + rect1->h;
 9     int x1_4 = rect1->x + rect1->w;
10     int y1_4 = rect1->y + rect1->h;
11 
12 
13 
14     int x2_1 = rect2->x;
15     int y2_1 = rect2->y;
16     int x2_2 = rect2->x + rect2->w;
17     int y2_2 = rect2->y;
18     int x2_3 = rect2->x;
19     int y2_3 = rect2->y + rect2->h;
20     int x2_4 = rect2->x + rect2->w;
21     int y2_4 = rect2->y + rect2->h;
22 
23     // 判斷矩形一的四個頂點之一是否在矩形二中
24     if( (x1_1 > x2_1 && x1_1 < x2_4) && (y1_1 > y2_1 && y1_1 < y2_4) )
25     {
26         return true;
27     }
28 
29     if( (x1_2 > x2_1 && x1_2 < x2_4) && (y1_2 > y2_1 && y1_2 < y2_4) )
30     {
31         return true;
32     }
33 
34     if( (x1_3 > x2_1 && x1_3 < x2_4) && (y1_3 > y2_1 && y1_3 < y2_4) )
35     {
36         return true;
37     }
38 
39     if( (x1_4 > x2_1 && x1_4 < x2_4) && (y1_4 > y2_1 && y1_4 < y2_4) )
40     {
41         return true;
42     }
43 
44     // 判斷矩形二的四個頂點之一是否在矩形一中
45 
46     if( (x2_1 > x1_1 && x2_1 < x1_4) && (y2_1 > y1_1 && y2_1 < y1_4) )
47     {
48         return true;
49     }
50 
51     if( (x2_2 > x1_1 && x2_2 < x1_4) && (y2_2 > y1_1 && y2_2 < y1_4) )
52     {
53         return true;
54     }
55 
56     if( (x2_3 > x1_1 && x2_3 < x1_4) && (y2_3 > y1_1 && y2_3 < y1_4) )
57     {
58         return true;
59     }
60 
61     if( (x2_4 > x1_1 && x2_4 < x1_4) && (y2_4 > y1_1 && y2_4 < y1_4) )
62     {
63         return true;
64     }
65 
66 
67 
68     return false;
69 }

判斷的方法狠簡單、如果矩形相交、那么肯定存在至少一個矩形的頂點存在於另一個矩形內、所謂在矩形內、也就是這個頂點的坐標的X值和Y值分別位於矩形的左上角(x_min, y_min)坐標與右下角(x_max, y_max)坐標之間、也就當x_min < x < x_max且y_min < y < y_max時、這個頂點存在於

 

實際上、上面這么描述並不對、這個算法充其量就是邊界算法、因為下面這種情況是兩個矩形的四個頂點都不矩形中、但因為這種是特殊的簡化情況、一旦碰壁就停止、那么也沒什么所謂、如果是需要計算碰壁后能穿透的情況下、這種蠻力算法就無能為力了

 

 

 

 

假設有矩形1的左上角點(x1,y1)和右下角點(x2, y2)、和矩形2從左上角點(x3,y3)和右下角點(x4,y4)、可根據以下算法判斷是否相交

優化算法:

 1 // 判斷兩矩形是否相交、原理狠簡單、如果相交、肯定其中一個矩形的頂點在另一個頂點內、
 2 bool test_collision(SDL_Rect *rect1, SDL_Rect *rect2)
 3 {
 4     int x1 = rect1->x;
 5     int y1 = rect1->y;
 6     int x2 = rect1->x + rect1->w;
 7     int y2 = rect1->y + rect1->h;
 8 
 9     int x3 = rect2->x;
10     int y3 = rect2->y;
11     int x4 = rect2->x + rect2->w;
12     int y4 = rect2->y + rect2->h;
13 
14     return ( ( (x1 >=x3 && x1 < x4) || (x3 >= x1 && x3 <= x2) ) &&
15         ( (y1 >=y3 && y1 < y4) || (y3 >= y1 && y3 <= y2) ) ) ? true : false;
16 
17 }

 

 

參考資料:

http://zh.wikipedia.org/wiki/%E7%9B%B8%E4%BA%A4

http://zh.wikipedia.org/zh/%E7%9B%B4%E7%BA%BF


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM