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

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 = (v1x
nx + v1y
ny)*ny;
vx[i] = vx[i] + (v1x - vnx);
vy[i] = vy[i] + (v1y - vny);
vx[j] = vx[j] + vnx;
vy[j] = vy[j] + vny;
}
}

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ą!
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...

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ń.

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ł.

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