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