假設有矩形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 }
參考資料:
