Va chạm giữa hai hình chữ nhật
Thuật toán
Giả định thông số cho 2 hình chữ nhật như sau:
- Rect1 có thông số là: góc trên bên trái M1(x1, y1), chiều rộng và cao là W1, H1.
- Rect2 có thông số là: góc trên bên trái M2(x2, y2), chiều rộng và cao là W2, H2.
2 hình chữ nhật trên xảy ra va chạm với nhau khi thỏa 2 điều kiện sau đây:
Xét theo trục Ox
|(x1 + W1/2)| - |(x2 + W2/2) ≤ |(W1 + W2)/2|
Xét theo trục Oy
|(y1 + H1/2)| - |(y2 + H2/2) ≤ |(H1 + H2)/2|
Lúc 2 hình chữ nhật chưa va chạm:
Sau khi chúng va chạm vào nhau:
Code mẫu C++ xét va chạm giữa hình chữ nhật và hình chữ nhật
struct Rectangle { double x; double y; double W; double H; Rectangle(double _x, double _y, double _W, double _H) { x = _x; y = _y; W = _W; H = _H; } }; bool checkCollision(Rectangle rect1, Rectangle rect2) { double distX = (rect1.A.X + (rect1.W/2)) - (rect2.A.X + (rect2.W)/2); if (distX < 0) distX = -distX; double distW = (rect1.W + rect2.W)/2; int distY =(rect1.A.Y + (rect1.H/2)) - (rect2.A.Y + (rect2.H)/2); if(distY < 0) distY = -distY; int distH = (rect1.H + rect2.H)/2; return (distX <= distW && distY <= distH); } int main() { Rectangle rect1(1.56, 7.95, 3.28, 13.4); Rectangle rect2(1.73, 27.95, 1.28, 23.2); if(checkCollision(rect, rect)) cout << "rect1(rect2)"; else cout << "rect1 rect2"; return 0; }