Zderzenia kulek w oknie graficznym

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

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/blog/2011/04/20/collision-detection-for-dummies/

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