Symulacje komputerowe zjawisk fizycznych z zakresu mechaniki
Symulacje komputerowe zjawisk fizycznych z zakresu mechaniki
Symulacje komputerowe zjawisk fizycznych z zakresu mechaniki
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