C++ fizikai szimulációban tudnátok segíteni?
Szabadesést szeretnék csinálni, úgy, hogy mikor leesik a négyzetem, akkor pattogjon, mert a sima szabadesést nem lehet beadni, mert túl könnyű. Jelenleg annyit csinál a prgramom, hogy lefele billentyű nyomására leesik egy négyzet (elvileg gyorsul, gyakorlatilag szerintem nem), és megáll a képernyő alján. Szerintem nem is gyorsul, meg a pattogást sem tudom megírni. így néz ki eddig a program:
#include "graphics.hpp"
#include <ctime>
#include <cstdlib>
#include <sstream>
#include <cmath>
#include <vector>
using namespace genv;
using namespace std;
const int SX = 150;
const int SY = 600;
class doboz_class{
public:
int x,y,meret;
color szin;
doboz_class(int xhely, int yhely): x(xhely), y (yhely), szin(rand()%16*10+128,0,128){
meret=20;
}
void mozog(){
double vy;
int a= 10;
vy=+a;
y+=vy;
}
void kirajzol(){
gout << move_to(x,y)<<szin<<box(meret,meret);
}
};
void doboz(int x,int y,color szin, int meret){
gout << move_to(x,y)<<szin<<box(meret,meret)<<refresh;}
int main()
{
srand (time(0));
gin.timer(50);
gout.open(SX,SY);
int a=255;
for(int i=0; i<500;++i )
{
gout<<move_to(1-i,30);
gout<<color(a,0,0);
gout<<line_to(SX-51,SY);
a=a-1;
}
vector< doboz_class> tomb;
event ev;
int changetime=3;
color szin = color(rand ()%256,rand ()%256,rand ()%256);
while (gin >>ev){
if(ev.keycode==key_down){
doboz_class ujdoboz(ev.pos_x, ev.pos_y);
tomb.push_back(ujdoboz);
}
if(ev.type==ev_timer){
gout << color(0,0,0) << move_to(0,0) << box(SX,SY);
for(unsigned int i=0; i<tomb.size(); i++){
tomb[i].kirajzol();
if(tomb[i].y<SY-tomb[i].meret)
tomb[i].mozog();
}
gout<<refresh;
}}
return 0;
}
Nem néztem végig, de a "vy=+a;" nem "vy+=a;" akart volna lenni?
Pattogás esetén van a sebességvektorod és a felület normálvektora. Ekkor a visszapattanás utáni vektor R=V−2N(V⋅N).
Egyébként ahogy te gondoltad csinálni, az a szabadesés közelítő, de egyben naiv megoldása. A célnak (emberi szemnek) megfelel, de ha tényleg fizikai mennyiségeket akarsz a szimuláció során leolvasni, akkor nem.
igazából a pattogást nem tudom, hogy m.ennyire kell már komolyan venni, mert egy négyzet esik le. a tanár csak ennyit írt: Mert a szabadesés önmagában túl könnyű feladat, így valószínűleg nem bólintottam rá.
Még a függőleges hajítást sem engedtem, oda is kértem mellé legalább, hogy pattogjon. úgyhogy én annyit gondoltam, hogy kettőt pattan:egy nagyobb és egy kisebb parabola alakú pályán, vagy egyet pattan, ami a gyökfüggvényre hasonlít. ez utóbbi működik is, csak akkor is gyorsul, és az ugye nem kellene
Ezt nagyjából, közelítőleg, de kellően tisztességesen úgy tudod megcsinálni, hogy leprogramozod a test (négyzet) mozgását.
Nagyjából úgy néz ki, hogy a testnek két állapota van a te esetedben:
1. a pozíciója, ez egy síkvektor a te esetedben: (x, y)
2. a sebessége, mozgásállapota, ami szintén egy síkvektor a te esetedben.
Azonos időközönként, ami időköz így a szimulációs lépésköz lesz, a testnek az előző lépésben felrajzolt képét törlöd a képernyőről, a pozíció vektorához hozzáadod a sebességvektort, így megkapod az új pozíciót:
(x1, y1) = (x0+vx, y0+vy),
ahol (x1, y1) az új pozíció, (x0, y0) az előző pozíció, (vx, vy) a sebességvektor.
Ez így eddig egy egyenes vonalú, egyenletes mozgás. Fizikából megtanultad, hogy a mozgásállapot gyorsulással változik (egészen pontosan a lendület megváltozása arányos a testre ható erővel, a lendület megváltozása arányos a gyorsulással és viszont).
A gyorsulást úgy tudod szimulálni, hogy a sebességvektort is változtatod a gyorsulásnak megfelelően minden lépésben, tehát a gyorsulás vektorát hozzáadod a sebesség vektorához.
Ha szabadesést akarsz, akkor egy adott pozícióból, nulla kezdősebességgel és lefelé mutató gyorsulással indítod a szimulációt.
Ferde szabadesésnél mondjuk vízszintes irányú sebességvektorral indítod a lefelé mutató gyorsulás mellett.
Ferde hajításnál a pozíció lehet lent, a kezdősebesség ferdén felfelé mutat, a gyorsulás ismét lefelé.
Szelet is szimulálhatsz, ha a gyorsulás nem pont lefelé mutat, hanem kissé ferdén, lefelé (ami egyenlő azzal, mintha egy vízszintes szél által adott vízszintes gyorsulást összeadod a lefelé mutató nehézségi gyorsulással).
Surlódást is szimulálhatsz azzal, ha a sebességvektorból minden lépésben (az előző műveletekkel együtt) kivonsz egy, a surlódásnak megfelelő vektort. A surlódás, ha konstans (vagyis mindig ugyanazt a vektort vonod ki a sebességből, tehát nem függ a surlódás a sebességtől), akkor kb. az asztalon csúszó tárgyak mozgását szimulálhatod. Légellenálást is szimulálhatsz, ha a levont surlódási sebesség vektor (ez valójában a surlódási erő okozta gyorsulásnak megfelelő időegység alatti sebességváltozás) függ a sebességtől.
A pattogás már nehezebb. Ha a képernyő szélére való ütközést kell kezelned, akkor könnyebb. Ekkor megnézed, hogy az új pozíció kívül van-e a képernyőn, ha igen, akkor ellentettjére állítod a sebesség x, vagy y koordinátáját, attól függően, hogy a képernyő szélét alkotó egyenesek közül a függőlegeseken, vagy a vízszinteseken lógna túl a pozíció. Ez persze így erősen csak közelítő (valójában nem így kellene), de a te célodnak megfelel.
Ha ezt mind megcsinálod, akkor tetszőleges számú test rengetegféle mozgását tudod szimulálni, a kezdeti adatok értékétől függően.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!