Kezdőoldal » Számítástechnika » Programozás » C++ fizikai szimulációban...

C++ fizikai szimulációban tudnátok segíteni?

Figyelt kérdés

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;

}



2013. márc. 17. 22:38
 1/5 Srapnel ***** válasza:

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.

2013. márc. 18. 09:38
Hasznos számodra ez a válasz?
 2/5 A kérdező kommentje:
igen, valóban elírtam azt a részt. időközben sikerült úgy kijavítanom, hogy nem csak szemre, hanem tenylegesen is szabadon esik, viszont a pattogással meg mindig nem boldogulok.
2013. márc. 18. 19:48
 3/5 anonim ***** válasza:
Akkor a pattogás fizikájának nézz utána. Mindenképpen szükséged lesz a rugalmassági modulusra. Mi pattog? Nem mindegy, hogy gyurma esik vagy gumilabda vagy fémgolyó, és nem mindegy, hogy perzsaszőnyegre esik vagy márványlemezre vagy egy kis kád nitroglicerinbe.
2013. márc. 19. 06:44
Hasznos számodra ez a válasz?
 4/5 A kérdező kommentje:

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

2013. márc. 19. 08:24
 5/5 Srapnel ***** válasza:

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.

2013. márc. 19. 09:01
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!