Trudności z zadaniem (symulacja ludzi uciekających z budynku)

Odpowiedz Nowy wątek
2015-01-04 14:29
Pijany Młot
0

Mam za zadanie napisać program w C symulujący ucieczkę ludzi z budynku. Ludzie mają byc przedstawieni w postaci kulek i mają się kierować w strone wyjścia na oślep mogą się przy tym ze sobą zderzyć, przez co przez chwilę pruszają się bezwładnie, ale po kilku krokach orientują się w przestrzeni i znów nadają sobie prędkość w kierunku wyjścia. Może potem dojść do następnych
zderzeń.Mam dwa poważne problemy przy losowaniu współrzędnych ludzi w budynku nachodzą oni na siebie i nie mogę tego wyeliminować oraz nie działa mi zderzania się ludzi, które powinien realizować poniższy fragment kodu.
Uprzejmie proszę o pomoc i z góry dziękuje.
for (int j = 0; j < N; j++)
{
L = sqrt((x[i] - x[j])(x[i] - x[j]) + (y[i] - y[j])(y[i]- y[j]));
if (L <2w)
{
v1x = vx[i] - vx[j];
v1y = vy[i] - vy[j];
nx = (x[i] - x[j]) / L;
ny = (y[i] - y[j]) / L;
vnx = (v1x
nx + v1yny)nx;
vny = (v1xnx + v1yny)*ny;
vx[i] = vx[i] + (v1x - vnx);
vy[i] = vy[i] + (v1y - vny);
vx[j] = vx[j] + vnx;
vy[j] = vy[j] + vny;
}
}

Pozostało 580 znaków

2015-01-04 14:40
1
  1. Słyszałeś o strukturach?
  2. Słyszałeś o funkcji hypot?
  3. Nie używaj i++ tam gdzie możesz użyć ++i - zemści ci się ten brzydki nawyk.
  4. Zrób sobie funkcje vec make(double x,double y), vec add(vec a,vec b), vec sub(vec a,vec b), double scalar(vec a,vec b), vec mul(vec a,double val), vec div(vec a,double val) wtedy kod będzie czytelny i w sekundę znajdziesz błąd.
  5. if((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i]- y[j]) <=2*w*w) zadziała znacznie szybciej. I będzie wyglądać: if(scalar(sub(vec[i],vec[j]))<=4*w*w)
  6. Skoro nie podałeś pętli po i oznacza to że każdą parę sprawdzasz dwukrotnie, użyj: for(int i=0;i<N;++i) for(int j=0;j<i;++j)
  7. Nie widzę również sprawdzenia czy i!=j czyli masz zderzenie każdego z samym sobą!

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon, 2015-01-04 16:28
A czy w kroku 5. nie powinno być if((x[i] - x[j])(x[i] - x[j]) + (y[i] - y[j])(y[i]- y[j]) <=4ww)? No bo skoro sqrt(x) <= 2w to wtedy x <= 4w*w - KazikWielki 2015-01-04 16:23
Zgadza się, już poprawiam. - _13th_Dragon 2015-01-04 16:28

Pozostało 580 znaków

2015-01-04 14:47
1
  1. Losuj ludzi do seta aż nie wylosujesz odpowiedniej ilości. set sam wytnie duplikaty ;] Minus: złożoność O(nieskończoność) :P
  2. Ty jesteś robotem czy człowiekiem? To teraz wyobraź sobie że kod, zamiast tego co pokazałeś wyżej, wygląda tak:
    for(int i=0;i<N;++i){
    struct Person person = array[i];
    struct Person personInNewPosition = calculateNewPosition(person);
    if(collision(personInNewPosition, array)){
    modifyHeadingForFewTurns(personInNewPosition);
    }
    array[i] = personInNewPosition;
    }

Widzisz różnicę między tym co napisałem a ty co masz u siebie w kodzie? Mój można przeczytać. Ba, mógłbyś go pokazać swojej siostrze i też by go zrozumiała. Twojego nie rozumiesz nawet ty sam...


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2015-01-04 14:47
1. Piszesz o złożoności w przypadku pesymistycznym, gdy wylosowywane będą ciągle wartości, które już są w zbiorze? - mad_penguin 2015-01-04 17:06
Tak. Teoretycznie możemy mieć taki niefart :P - Shalom 2015-01-04 17:10

Pozostało 580 znaków

2015-01-04 14:48
Pijany Młot
0

Nigdy nie słyszałem o strukturach ani o funkcji hypot. Jestem totalnie niezaawansowany, a to jest po prostu projekt na informatyke na studiach i musze sobie jakoś z nim poradzić. Operuję tylko w samych podstawach języka więc przyznam, że nie do końca rozumiem co mam teraz zrobić i jak dokonać tych wszystkich sprawdzeń.

Pozostało 580 znaków

2015-01-04 14:51
0
Pijany Młot napisał(a):

... co mam teraz zrobić i jak dokonać tych wszystkich sprawdzeń.
Otworzyć byle kurs i przeczytać pierwsze kilka rozdziałów. Dalej już będziesz wiedział.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

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