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 Tròn và Hình Tròn

    Xét va chạm giữa các đối tượng là một trong các yếu tố sử dụng nhiều trong các hệ thống vật lý, trong ứng dụng được thấy nhiều trong game, ... Bài viết này hướng dẫn cách phát hiện một va chạm giữa các đối tượng hình tròn với nhau.
    18/01/2017 27/08/2020 2 phút đọc
    Collision Detection - Xét Va Chạm Giữa Hình Tròn và Hình Tròn

    Va chạm giữa hình tròn và hình tròn

    Thuật toán

    Mọi điểm nằm trên đường tròn cách đều tâm, nên việc kiểm tra va chạm giữa hai hình tròn sẽ được xác định dựa vào khoảng cách tâm giữa chúng.

    Cho 2 đường tròn:

    • C1 có bán kính r1 và tâm có toạ độ A(x1; y1).
    • C2 có bán kính r2 và tâm có toạ độ B(x2; y2).

    Để xác định khoảng cách giữa hai điểm, dựa vào công thức:

    AB = √((x1 - x2)2 + (y1 - y2)2)

    Phân tích

    Hai đường tròn C1 và C2 rời nhau

    Khi: AB > r1+ r2

    Đường tròn AB rời nhau.
    AB > r1 + r2

    Hai đường tròn C1 và C2 lồng nhau

    Khi: AB < r1 + r2

    Hai đường tròn lồng nhau.
    AB  < r1 + r2

    Ngoài ra còn trường hợp tiếp xúc: AB = r1 + r2

    Code mẫu C++ xét sự tương quan giữa 2 hình tròn

    struct Point
    {
        double x;
        double y;
    
        Point(Point p)
        {
            x = p.x;
            y = p.y;
        }
    };
    
    struct Circle
    {
        Point O;
        double r;
    
        Circle(Point _o, double _r) : Point(_o)
        {
            r = _r;
        }
    };
    
    double distance2(Point A, Point B)
    {
        return (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y);
    }
    
    bool checkCollision(Circle c1, Circle c2)
    {
        return ((c1.r + c2.r) * (c1.r + c2.r) < distance2(c1.O, c2.O));
    }
    
    int main()
    {
        Point p1(2.5, 6.6);
        Point p2(3.7, 7.3);
    
        Circle c1(p1, 2.5), c2(p2, 3.4);
    
        if(checkCollision(c1, c2))
    	    cout << "AB";
        else
    	    cout << "A   B";
    
        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