Thuật toán va chạm giữa hình tròn và hình chữ nhật

Thuật toán va chạm giữa hình tròn và hình chữ nhật

Để mô phỏng được các tình huống như ở thế giới thực thì cần phải kết hợp vật lý trong thế giới thực, các tính năng như phát hiện va chạm, lực đàn hồi, độ đàn hồi, ma sát, … cần được đưa vào phần mềm. Bài viết này giới thiệu 1 trong các tình huống đó là phát hiện va chạm giữa hình tròn và hình chữ nhật và giải thích thuật toán va chạm giữa hình tròn và hình chữ nhật.

Thuật toán va chạm giữa hình tròn và hình chữ nhật

Thuật toán

Gọi C(Xc, Yc) là tâm hình tròn có bán kính là R. Tìm điểm A là điểm gần nhất thuộc hình chữ nhật đến tâm C. So sánh độ dài CA và R. Nếu CA<=R thì va chạm. CA>R thì không va chạm. (Khi C nằm trong hình chữ nhật thì C trùng A).

Khoảng cách CA được biểu diễn như hình vẽ:

Thuật toán va chạm giữa hình tròn và hình chữ nhật

Để tính được CA, cần xác định điểm A theo thuật toán sau:

  • B1: Gán A = C (Xa = Xc, Ya = Yc)
  • B2: Nếu Xc < rect.left thì Xa=rect.left
    • Xc > rect.right thì Xa = rect.right
    • Xc >= rect.left && Xc <= rect.right thì Xa = Xc
  • B3: Nếu Yc < rect.top thì Ya = rect.top
    • Nếu Yc > rect.bottom thì Ya = rect.bottom
    • Nếu Yc >= rect.top && Yc<= rect.right thì Ya = Yc 

* Trường hợp điểm 0(0, 0) nằm ở góc trên bên trái màn hình, trục tọa độ hướng xuống.

Có điểm A, tính CA rồi so sánh với R.

Code mẫu JavaScript xét sự tương quan giữa hình tròn và hình chữ nhật

class Circle { constructor(x, y, radius) { this.x = x; this.y = y; this.radius = radius; } } class Rect { constructor(x, y, width, height) { this.x = x; this.y = y; this.w = width; this.h = height; } } function checkCollision(cir, rect) { let Ax = cir.x; let Ay = cir.y; let rect_left = rect.x; let rect_top = rect.y; let rect_right = rect.x + rect.w; let rect_bottom = rect.y + rect.h; if (cir.x < rect_left) Ax = rect_left; else if (cir.x > rect_right) Ax = rect_right; if (cir.y < rect_top) Ay = rect_top; else if (cir.y > rect_bottom) Ay = rect_bottom; let dx = cir.x - Ax; let dy = cir.y - Ay; return (dx * dx + dy * dy) <= cir.radius * cir.radius; }
Code language: JavaScript (javascript)

Cảm ơn bạn đã theo dõi bài viết!

Các bạn có thể tham khảo các bài viết hay về JavaScript tại đây.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

TỔNG HỢP TÀI LIỆU HỌC LẬP TRÌNH CƠ BẢN CHO NGƯỜI MỚI BẮT ĐẦU

KHOÁ HỌC BOOTCAMP JAVA/JAVASCRIPT/PHP TRỞ THÀNH LẬP TRÌNH VIÊN TRONG 5-6 THÁNG

Bình luận