sprężyna oscylująca góra dół

0

Witam, mam do narysowania sprężynę oscylującą góra-dół. Sprężyna może być kwadratowa (prostokąciki jeden na drugim) i powiedzmy jakiś kwadracik na niej jako ciało, natomiast nie mam pomysłu jak zrobić żeby realistycznie oscylowała przez jakiś czas góra dół.

Z góry dzięki za pomoc.

0

Wzory na odkształcenia znajdziesz w ruchu harmonicznym a jeśli ma się "wygaszać w czasie" to chyba dodatkowo tłumionym. Co do samego rysowania to wypadało by zrobić sobie funkcję przyjmującą za argument jedynie wysokość i wywoływać ją w czasie np. wątku. A rysowanie samej sprężyny jeśli widok ma być z boku w 2D to możesz zauważyć, że sprężyna składa się z kawałków trójkątów równoramiennych o zmiennej podstawie, ale stałym obwodzie więc możesz policzyć długości ramion tego trójkąta odejmując od obwodu podstawę (kawałek sprężyny na długość) i dzieląc na 2. Później z Pitagorasa policzysz wysokość padającą na podstawę i w ten sposób wyznaczysz położenie wierzchołka (rozjeżdżanie się sprężyny na boki). Mając już jeden taki "trybik" tylko go powielasz z odpowiednimi przesunięciami i tak powstaje sprężyna.

0

Prosty do zrobienia rysunek sprężyny jest tu: <url>http://www.matthewz.republika.pl/pliki/wyt18.1.gif>/url&gt;.

0

A czy ktoś mógłby poratować kawałkiem kodu jeśli chodzi chociaż o samą sprężynę, ponieważ pomimo wielu prób nie udaje mi się tego zrobić :(

0

na wiki masz równanie różniczkowe sprężyny: http://pl.wikipedia.org/wiki/[...]uch_harmoniczny_t.C5.82umiony
czyli: \frac{d<sup>{2}x}{dt</sup>{2}} = -\frac{k}{m} x - \frac{b}{m}\frac{dx}{dt}
jak to zasymulować? przyjmujesz sobie 3 stałe:
k - współczynnik sprężystości
m - masa obiektu przyczepionego do sprężyny
b - współczynnik tłumienia

to jest przyspieszenie punktu x (będę oznaczał a)

\frac{d<sup>{2}x}{dt</sup>{2}}

to jest prędkość punktu x (oznaczam v):

\frac{dx}{dt}

x to położenie końca sprężyny

położenie 0 to początek sprężyny (położenie neutralne sprężyny to x=0, czyli jak sprężyna jest w 100% złożona, jeśli chcesz, żeby sprężyna miała jakąś długość to przyjmij sobie położenie początka sprężyny w dowolnym innym punkcie - sztywno ustalonym), położenie x to koniec sprężyny (to jak to narysujesz na formie to Twoja sprawa)

warunki początkowe, czyli takie jakie koniec sprężyny posiada na starcie:
a = 0;
v = 0;
x = dowolna_wartosc; // jesli dowonlna_wartosc = 0 to sprezyna nic nie bedzie robic. to jest po prostu wartosc ktora mowi Ci o tym o ile rozciagneles sprezyne, a symulacja to jest moment puszczenia tej sprezyny

co jakiś czas (np. 100ms albo mniej) wykonuj operacje:
dt = czas_miedzy_poprzednimi_obliczeniami_a_aktualnymi_w_sekundach; // czyli dla 100ms: 0.1
a += dt(-k/mx-b/mv);
v += dt
a;
x += dt*v;

w zasadzie cała symulacja zależy od warunków początkowych. jeśli chcesz możesz rozwiązać równanie różniczkowe albo znaleźć rozwiązanie w internecie i po prost skorzystac z wzoru, podstawiajac za czas aktualny czas w sekundach. takie rozwiązanie jak Ci podałem nie potrzebuje rozwiązywania równania różniczkowego i łatwo można te równanie różniczkowe zmienić (w razie gdybyś chciał dodać np. drugą sprężynę dołączoną do pierwszej albo jakiś zupełnie nowy element)

to, źe wszystkie elementy powinny być typu zmiennoprzecinkowego jest oczywiste, ale nie zapomnij o tym. jeśli dasz masę punktu przyczepionego do sprężyny = 0 to jak wynika z wzoru wszystko sie rozp***li

0

dzieki wielkie za pomoc, zrobilem sprezyne tylko mam taki problem poniewaz animacja mojej prowizorycznej kwadratowej sprezyny opiera sie na tym ze wg tlumionego ruchu harmonicznego zmienia sie wysokosc czyli dla g2d.fillRect(x,y , szer, H); zmienia sie H a H musi byc int a wartosci H z funkcji wychodza z liczbami po przecinku ma ktos moze jakis pomysl jak to rozwiazac?

0

Rzutowanie?

g2d.fillRect(x,y , szer, (int)H);
0

nie...

raczej podstawy programowania

0

tak - rzutowanie i podstawy programowania :P dzieki ;)

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