Zderzenia kulek w oknie graficznym

Odpowiedz Nowy wątek
2015-01-12 19:03
0

Witam, mam następujący problem

Robię zadanie polegające na symulowaniu ludzi(w postaci kuli) uciekających z budynku, w czasie ucieczki mają się zderzać następnie odbijać od siebie i po jakimś czasie znowu kierować w stronę wyjścia. Mam zrobione tablice, wolosowane współrzędne, zderzanie ze ścianami itp.
Nie moge sobie jednak poradzić ze zderzaniem się kulek tak, żeby po jakimś czasie się zatrzymały i skierowały znowu w strone wyjścia.
Nie wiem czy gdzieś nie ma błędu czy może źle to wymyśliłem. Wrzucam cały fragment kodu odpowiedzialny za animacje ruchu kulek oraz zderzeń

while (t < 500)                     // animacja 
    {
        animate(SPEED);
        cleardevice();
        displayroom();
        for (int i = 0; i < N; i++)   // ruch ludzi w kierunku wyj?cia
        {
            // jesli stan jest równy true, przechodzi do zderzenia
            if (stany[i]== true)
            {
                // ruch od zderzenia do upadku
                if (od_kolizji[i] < odleglosc) 
                {
                    vx[i] = vxmod[i];
                    vy[i] = vymod[i];
                    od_kolizji++;
                }
                // czas leżenia mierzony od upadku, po tym casie wstaje i idzie dalej
                else
                {
                    // leży w miejscu

                        // zerowanie się parametrów w ruchu normalnym żeby mogły się zderzać ponownie
                        od_kolizji[i] = 0;
                        stany[i] = false;

                        //nadanie kierunku i prędkości ucieczki
                        // punkt do ktorego daza ma wspolrzedne 300, 100
                        double odcinek = sqrt(300 * x[i] + 100 * y[i]);
                        vx[i] = 10 * (300 - x[i]) / odcinek;
                        vy[i] = 10 * (100 - y[i]) / odcinek;

                }
            }
            //ruch normalny
            else
            {
                vx[i] = vx[i] * przyspieszenie;
                vy[i] = vy[i] * przyspieszenie;
            }

            x[i] = x[i] + vx[i];
            y[i] = y[i] + vy[i];

            circle(x[i], y[i], w);

            if ((x[i] - w >285) && (x[i] + w <315)) // znikanie kulek gdy osiągną punkt wyj?cia
            {
                if (y[i] - w<110)
                {
                    x[i] = -100;
                    y[i] = -100;
                    zywi = zywi + 1;
                }
            }
            if (x[i] - w < 100 || x[i] + w>500) // zderzanie się kulek ze ścianami na osi x
            {
                if (od_kolizjix[i] < odleglosc)
                {
                    vx[i] = -vx[i];
                }
                else
                {
                    // zerowanie się parametrów w ruchu normalnym żeby mogły się zderzać ponownie
                    od_kolizjix[i] = 0;

                    //knadanie kierunku i prędkości ucieczki
                    // punkt do ktorego daza ma wspolrzedne 300, 100
                    double odcinek = sqrt(300 * x[i] + 100 * y[i]);
                    vx[i] = 10 * (300 - x[i]) / odcinek;
                    vy[i] = 10 * (100 - y[i]) / odcinek;
                }
            }
            if (y[i] - w < 101 || y[i] + w>500) // zderzanie się kulek ze ścianami na osi y
            {
                if (od_kolizjiy[i] < odleglosc)
                {
                    vy[i] = -vy[i];
                }
                else
                {
                    // zerowanie się parametrów w ruchu normalnym żeby mogły się zderzać ponownie
                    od_kolizjiy[i] = 0;

                    //knadanie kierunku i prędkości ucieczki
                    // punkt do ktorego daza ma wspolrzedne 300, 100
                    double odcinek = sqrt(300 * x[i] + 100 * y[i]);
                    vx[i] = 10 * (300 - x[i]) / odcinek;
                    vy[i] = 10 * (100 - y[i]) / odcinek;
                }
            }

            for (int j = 0; j < N; j++) //  NIE DZIAŁA zderzanie się kulek ze sobą
            {
                if (j != i)
                {
                    double dif_x = x[j] - x[i];
                    double dif_y = y[j] - y[i];
                    L = sqrt(dif_x*dif_x + dif_y*dif_y);

                    if (L <= 2 * w)
                    {
                        // ustawienie stanu zachowania po kolizji, czyli musi być true
                        stany[i] = true;

                        // zerowanie wartości pomocniczych, bo wszytsko wraca do normy
                        od_kolizji[i] = 0;
                        double e1 = vx[i] * vx[i] + vy[i] * vy[i] + vx[j] * vx[j] + vy[j] * vy[j];

                        // obliczenie prędkości po kolizji z instrukcji 5.2
                        v1x = vx[i] - vx[j];
                        v1y = vy[i] - vy[j];

                        nx = (x[i] - x[j]) / L;
                        ny = (y[i] - y[j]) / L;

                        vnx = 2*(v1x*nx + v1y*ny)*nx;
                        vny = 2*(v1x*nx + v1y*ny)*ny;

                        vxmod[i] = (vx[i] - vnx)/4;
                        vymod[i] = (vy[i] - vny)/4;
                        vx[j] = (vx[j] + vnx)/4;
                        vy[j] = (vy[j] + vny)/4;

                        double e2 = vx[i] * vx[i] + vy[i] * vy[i] + vx[j] * vx[j] + vy[j] * vy[j];
                        if (e2 > e1)
                            printf_s("wieksza energia po zderzeniu - cos jest zle  <- zle wzory?\t");
                        // energie są zawsze większe od początkowych czyli jest gdzieś błąd
                        vx[i] = vxmod[i];
                        vy[i] = vymod[i];
                    }

                }
            }
        }

        end = time(NULL);  // program działa przez 10 sekund i w tym czasie ludzie muszą uciec z budynku
        czas = end - start;
        if (czas > 200)
        {
            printf_s("\n!!   Budynek splonal   !!\n");
            break;
        }
        t = t + 0.01;
    }
    }
edytowany 2x, ostatnio: entgen, 2015-01-12 21:23

Pozostało 580 znaków

2015-01-12 21:23
0

Poradziłem sobie ze zderzaniem kulek i tym żeby one się poruszały w konkretnym kierunku, ale teraz pojawił sie inny problem. Mianowicie kulki po zderzeniu nakładają się ze sobą. Czy ktoś może pomóc mi i powiedzieć co mam zrobić aby do tego nie dochodziło. w Pierwszym poście wrzucam poprawioną wersje kodu.

Pozostało 580 znaków

2015-01-13 22:12
Biały Kot
0
entgen napisał(a):

Poradziłem sobie ze zderzaniem kulek i tym żeby one się poruszały w konkretnym kierunku, ale teraz pojawił sie inny problem. Mianowicie kulki po zderzeniu nakładają się ze sobą. Czy ktoś może pomóc mi i powiedzieć co mam zrobić aby do tego nie dochodziło. w Pierwszym poście wrzucam poprawioną wersje kodu.

To normalne. Musisz ustawic pozycje kulki która się zderza tak, aby obydwie się tylko dotykały.
Zerknij tutaj:
http://www.wildbunny.co.uk/bl[...]lision-detection-for-dummies/

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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