Kolizja dwóch różnych figur - organizacja klasy

0

Cześć,
Mam do was takie pytanie:
mam klasę abstrakcyjną figura oraz dwie inne klasy prostokąt i koło. Zastanawiam się teraz jak zrobić funkcję kolizji tych dwóch obiektów? Tzn. chodzi mi o to, że klasa koło nie wie, czy zderzy się z innym kołem czy z prostokątem i teraz pytanie jak to zaimplementować? Oczywiście mogę zrobić dla każdej figury jakiś index i sprawdzać przy zderzeniu, jaki obiekt zderzył się z jakim (np. czy koło z prostokątem czy z innym kołem) ale czy nie ma innego sposobu?

Innymi słowy można to rozwiązać np. tak:

class Figura
    {
    public:
        virtual bool kolizja(Figura* figura) = 0;
        int index;
    };

class Prostokat
    {
    public:
        //index = 0;
        float top, left, right, bottom;    //współrzędne prostokąta na osiach
        bool kolizja(Figura* figura)
            {
            switch(figura->index)
                {
                case 0: //gdy kolizja jest np. z prostokątem
                //...
                break;
                case 1: //gdy kolizja jest np. z kołem
                //...
                break;
                //itd.
                }
            }
    };

class kolo
    {
    public:
        float promien, srodek_x, srodek_y; //promien okręgu oraz współrzędne środka koła
        //index = 1;
        bool kolizja(Figura* figura)
            {
            switch(figura->index)
                {
                case 0: //gdy kolizja jest np. z prostokątem
                //...
                break;
                case 1: //gdy kolizja jest np. z kołem
                //...
                break;
                //itd.
                }
            }
    };

Ale ten sposób wydaje mi się trochę nieelegancki...

Tzn. źle się wyraziłem - chodzi mi o sprawdzenie czy kolizja w ogóle nastąpiła między dwoma obiektami

0

Najprosciej to zamknac kolo w kwadracie i tak sprawdzac, a potem ew. sprawdzic jakiego typu sa obiekty i porownac je precyzyjniej.
Druga metoda, to wylicz dlugosc odcinka od srodka figury do jej krawedzi wzdluz prostej przecinajacej srodki obu figur i sprawdzic czy suma tych odcinkow <= od odleglosci miedzy nimi.
Trzecia opcja, zamknac obiekt w mniejsze kola lub kwadraty, co spowoduje uzyskanie wiekszej precyzji, jednak wciaz nie bedzie dokladne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1