Hozzászólások
Üdv Mindenkinek.
Már több helyen is próbálkoztam, de választ még nem kaptam.
Remélem itt több szerencsével járok :D ...
Az érdekelne, hogyan lehet pattogó labdák függőleges útvonalát kiszámolni..A számoláshoz használt képlet :
BobSinY = 6*sin ( i/600 ).
Itt az i egy folyamatosan növekvő érték, de ezzel csak egy egyszerű szinuszos mozgást érek el. Milyen képlet használható a pattogás élethű szimuláláshoz?
- A hozzászóláshoz be kell jelentkezni
Üdv!
[quote:cf283be24a="midge"]
Az érdekelne, hogyan lehet pattogó labdák függőleges útvonalát kiszámolni..A számoláshoz használt képlet :
BobSinY = 6*sin ( i/600 ).
Itt az i egy folyamatosan növekvő érték, de ezzel csak egy egyszerű szinuszos mozgást érek el. Milyen képlet használható a pattogás élethű szimuláláshoz?
Ha a pattogásnál nincsen súrlódás és egy síkról indul, 0 sebességgel, mindig a vízszintes síkra (y=0) esik vissza, akkor csak a visszapattanást kell bevinned az egyenletbe:
[code:1:cf283be24a]BobSinY = 6 * fabs ( sin ( i / 600 ) );[/code:1:cf283be24a]
Ha nem erre gondoltál, vagy nem jó a megoldásom, akkor elnézésedet kérem.
- A hozzászóláshoz be kell jelentkezni
Nincs semmi surlódás, meg hasonló dolgok. Ez egy intróba kellene, ahol keresztül pattog pár pontokból, vagy ha úgy jobban tetszik csillagokból álló labda. Előtte pedig 1-2 DYSP scroll fog kavarni.
Tehát a lényeg : egy egyszerű pattogásnak tűnő függőleges mozgás kellene a lasztiknak. A vízszintes speed pedig labdánként változó lesz, de egyenletes marad.
Szóval ehez kellene egy képlet, mert nincs kedvem - lusta dög vagyok :oops: - kézzel megírni a kordinátákat.
- A hozzászóláshoz be kell jelentkezni
Nem is szinusz, hanem parabolapályán mozognak... :)
Különben pedig, ha elmondjuk, hogyan kell, oda a demoírás öröme :)
(komolyan)
((de ha ragaszkodsz a képletedhez, akkor az amplitudó 6-os szorzóját fokozatosan csökkentve egyre alacsonyabbra pattan vissza, ezzel is realisztikusabb lesz))
- A hozzászóláshoz be kell jelentkezni
Igaz, de má nem van halyam, pedig nemrég még egész hoszú volt :twisted: .
Azért kösz mindent.
- A hozzászóláshoz be kell jelentkezni
Hali,
Szóval intro, ám legyen :)...
Ilyen esetben sajna elö kell venni a régi fizikakönyvet, és lefújni róla a
port :). Innen kicsit fizikaóra-hangulata lesz, úgyhogy akit nem érdekel, attól
elöre is elnézést...
Szóval a labdának minden pillanatban van egy 'y' magassága, egy 'vy' függöleges
sebessége, és van a rá ható gravitáció okozta konstans 'g' gyorsulása.
!!! A belekavarodást elkerülendö, innentöl a pozitiv irany a felfelé !!!
Ha még emlékszel, ha egy 'y' kezdöpoziciójú, 'vy' kezdösebességü pont 'a'
gyorsulással mozog 't' ideig, akkor a végén:
- a helyzete y2 = y + vy*t + a*(t^2)/2
- a sebessége pedig v2y = vy + a*t
lesz.
Ezek alapján, ha y, vy és g adott, akkor egy 1 másodperces léptetés így néz ki:
t = 1;
y = y + (vy*t) + (g*t*t / 2);
vy = vy + (g*t);
A gond persze ott jön, amikor a labda lemenne a föld alá... Ezt onnan vesszük
észre, hogy y < 0. Ekkor meg kell határozni azt a 0<=t<=1 idöpillanatot,
amikor pontosan eléri a talajt, szépen elmozgatni addig (kiszámolni a
földetérési sebességét), visszapattintani (vy=-vy), majd mozgatni a maradék
1-t idöben.
Mikor éri el a talajt? Amikor vy sebességröl g-vel gyorsulva megteszi a talajig
lévö -y utat.
-y = vy*t + g*(t^2)/2
-2*y = 2*vy*t + g*(t^2)
g*(t^2) + 2*vy*t + 2*y = 0
t[1,2] = (-2*vy +- sqrt(4*vy*vy - 8*g*y)) / (2*g)
t[1,2] = (-vy +- sqrt(vy*vy - 2*g*y)) / g
Ezen két eredményböl természetszerüleg a kisebbik (korábban bekövetkezö) kell
nekünk, ekkor ér földet a labda:
t = (-vy - sqrt(vy*vy - 2*g*y)) / g
Ekkor, mivel földetért, y=0 lesz, a sebessége pedig vy = vy + g*t.
Itt visszapattan, azaz vy = -vy, majd megy (1-t) ideig, merthogy ennyi van
hátra a lépésidöböl, azaz t=1-t.
Milyen magasra jut ezen idö alatt, és mennyi lesz ott a sebessége ?
y = y + (vy*t) + (g*t*t / 2)
vy = vy + (g*t)
Most már tudunk mindent, ami kell, úgyhogy akár le is programozhatjuk (lásd
lentebb).
Persze ennek is vannak hibái, föképp abból, hogy y és vy számolgatásainál
lesz kerekítési/számábrázolási hiba, ami sajnos halmozódik.
Ezt is lehetne korrigálni kisebb csalásokkal, mint pl. a legelején kiszámolni
a labda összenergiáját (helyzeti+mozgási), aztán a pattanás után, mivel a helyét
ismerjük, a helyzeti energiáját is, így számolhatjuk a mozgásit, és aztán
_abból_ a sebességet, de ha nem egy pingpongozó robot célkövetéséhez kell, akkor
szvsz. kicsit túllihegés lenne :).
Ui.: az elírásokért bocsi, a vi magzar billentzuyetröl nem egy rózsakert...
Szóval a program (bocs, hogy csak szöveges terminált kezel :)) :
// forditas: gcc -Wall -lm -o labda labda.c
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#define MAXX 80
#define MAXY 25
// A c karaktert kiirni az (x,y) poziciora. (0,0) = bal also sarok
#define kirak(x, y, c) printf("\x1b[%d;%df%c", (int)(MAXY-(y)), (int)(x), c)
int main(void)
{
int x, vx;
double y, vy;
double g, t;
g = -0.05;
x = 10; vx = 1;
y = 20; vy = 0;
printf("\x1b[2J"); // kepernyotorles
while (1)
{
kirak(x, y, '.');
x = x+vx; // x lep
if ((x==1) || (x==MAXX)) vx = -vx; // pattan, ha kell
// kerdes: hol lenne a labda 1 sec mulva?
t = 1;
y = y + (vy*t) + (g*t*t / 2); // itt
// kerdes: foldet er-e kozben
if (y>=0)
{ // nem megy a fold ala -> nem erne foldet -> sima eset
vy = vy + (g*t); // sebessege a lepes vegen (1 sec mulva)
}
else
{ // foldeterne
y = y - (vy*t) - (g*t*t / 2); // a lepest 'visszacsinaljuk'
// kerdes: mikor eri el a foldet?
t = (-vy - sqrt(vy*vy - 2*g*y)) / g;
// ido = (t-0) -> a labda eleri a talajt
y = 0;
vy = vy + (g*t);
// ido = (t+0) -> visszapattan
vy = -vy;
// ido=1 -> lepesido vegen hol lesz?
t = 1-t; // a hatralevo ido = 1-t
y = y + (vy*t) + (g*t*t / 2); // itt lesz
vy = vy + (g*t); // ez lesz a sebessege
}
kirak(x, y, 'o');
fflush(stdout);
usleep(100000); // 0.1 sec varakozas
}
return 0;
}
- A hozzászóláshoz be kell jelentkezni
Köszy.
Valami ilyesmi kellett.
- A hozzászóláshoz be kell jelentkezni
Kedves Gsimon!
Csak olvasgattam itt a hozzászólásokat, s nem tudok szó nélkül elmenni amellett, hogy így kell hogy kinézzen egy hasznos hozzászólás mint a tied.
Szóval az ember ha kérdést tesz fel egy fórumon, akkor valami ilyesmi jellegű választ szeretne rá kapni, ilyen alapossággal.
PS.: Ne változtass ezen a jó szokásodon! :D
- A hozzászóláshoz be kell jelentkezni