22.11.2014 Views

Symulacje komputerowe zjawisk fizycznych z zakresu mechaniki

Symulacje komputerowe zjawisk fizycznych z zakresu mechaniki

Symulacje komputerowe zjawisk fizycznych z zakresu mechaniki

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

W połączeniu między punktami działa siła zgodna z prawem Hook'a F =kx więc siły (skalarnie)<br />

działające pomiędzy każdymi dwoma punktami materialnymi wyznaczymy w następujący sposób:<br />

force = k * ( dist - restlength ) #F=k*x (skalarne)<br />

by zaś dostać siły w formie wektorów [2] musimy wartość poprzednio obliczonych sił pomnożyć<br />

przez wektory jednostkowe:<br />

force = length/dist[:,NewAxis] * force[:,NewAxis]<br />

Ostatnim krokiem pętli ruchu jest aktualizacja pędów. Z doświadczenia wiemy, że pomiędzy<br />

dowolną parą sąsiednich punktów materialnych w takiej linie działają siły naprężenia równe co do<br />

wartości lecz o przeciwnych zwrotach i punktach przyłożenia. Wyznaczyliśmy poprzednio n−1<br />

sił w formie wektorów, lecz punktów materialnych mamy n . Musimy zatem w oparciu o te<br />

wiadomości zaktualizować pędy wszystkich punktów materialnych. I tak od pierwszego punktu<br />

materialnego (mającego indeks z numerem zero - na liście - patrz rysunek wcześniejszy) do<br />

przedostatniego (włącznie) zapiszemy<br />

p th=p t F th<br />

band.p[:-1] = band.p[:-1] +<br />

force*dt<br />

i analogicznie od drugiego punktu Rysunek 31: Pary sił działające na poszczególne elementy liny.<br />

materialnego (mającego indeks<br />

z numerem 1 - na liście rys wcześniejszy) do ostatniego (włącznie) zapiszemy<br />

p th=p t − F th<br />

band.p[1:] = band.p[1:] - force*dt<br />

Pozostaje jeszcze kolizja z podłożem i przeszkodą. Zacznijmy od podłoża.<br />

Kontrola detekcji z podłożem jest bardzo prosta i sprowadza się do sprawdzania czy y-grekowa<br />

składowa któregokolwiek punktu materialnego nie jest mniejsza niż jest to określone przez poziom<br />

zerowy (czyli podłoże na które upadnie sznur). W przypadku gdy owa współrzędna jest mniejsza<br />

niż ten poziom, następuje zmiana jej wartości do poziomu zerowego oraz przypisanie tej składowej<br />

pędu równego zeru.<br />

if floor:<br />

#UDERZENIE O PODLOZE<br />

below = less(band.pos[:,1],poziom_zero)#below-ponizej<br />

band.p[:,1] = where( below, 0, band.p[:,1] )<br />

#dla kazdego punktu znajdujacgo sie ponizej poziom_zero ustaw p=0<br />

band.pos[:,1] = where( below, poziom_zero, band.pos[:,1] )<br />

#dla kazdego punktu znajdujacgo sie ponizej poziom_zero ustaw y=0<br />

Detekcja kolizji sznura ze sferą sprowadza się do sprawdzania czy którakolwiek ze składowych<br />

poszczególnych punktów materialnych nie znalazła się w odległości mniejszej niż promień sfery.<br />

W przypadku przekroczenia tej odległości korygowane jest położenie tego punktu materialnego do<br />

powierzchni sfery. Sama procedura wyznaczania miejsc dopuszczalnych i zakazanych dla ruchu<br />

sznura dotyczy wszystkich sfer jednocześnie i opiera się o bardzo wydajną metodę nakładania<br />

masek. Nieco bliżej problem ten zostanie omówiony przy symulacji gazu doskonałego. Zderzenie<br />

sznura z kulą jest niesprężyste i dlatego nie dochodzi do odbicia kolidujących punktów<br />

materialnych od sfery. Odbicie takie jest realizowane przez rozłożenie wektora pędu na dwa<br />

39

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!