STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

    Collision Detection - Xét Va Chạm Giữa Hình Chữ Nhật và Hình Chữ Nhật

    Xét tính va chạm trong phần mềm, game, các hệ thống mô phỏng là tính năng tạo nên sự trực quan, nhưng các tính năng này cũng bắt đầu bằng những phương pháp vật lý, hình học cơ bản, bài viết trình bày giải thuật về sự va chạm giữa hai hình chữ nhật.
    15/08/2016 27/08/2020 1 phút đọc
    Collision Detection - Xét Va Chạm Giữa Hình Chữ Nhật và Hình Chữ Nhật

    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;
    }

    Bài chung series

    0 Bình luận
    Giải Thuật Lập Trình

    Giải Thuật Lập Trình

    STDIO Training - Chia sẻ các giải thuật lập trình từ cổ điển đến hiện đại.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021