Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <SDL_collide.hpp>
- #include "Vector2D.hpp"
- #include <vector>
- #include <ctime>
- struct Data//Speichert ein Molekül ab
- {
- Vec2D Pos;
- Vec2D Speed;
- int radius;
- Data(Vec2D p,Vec2D s,int r):Pos(p),Speed(s),radius(r) {};
- Data(){}
- };
- std::vector<Data> mol;
- float Time;
- int NumOfAvg;
- float SumHitWall,HitWallSec,HitWallSecAvg;
- float SumHitMol ,HitMolSec ,HitMolSecAvg;
- __int64 TimeLast , TimeNow , TimeElapsed;
- void ProcessTime();
- void CheckCollision();
- bool CircleCollision(int x1 , int y1 , int r1 , int x2 , int y2 , int r2 , int offset);
- #define ROOM_HEIGTH 100000
- #define ROOM_LENGTH 100000
- int main(int argc,char* argv[])
- {
- //Letzten Zeitpunkt einmal merken
- time(&TimeLast);
- TimeNow=TimeElapsed=0;
- return 0;
- }
- void ProcessTime()
- {
- time(&TimeNow);
- TimeElapsed=TimeNow-TimeLast;
- TimeLast=TimeNow;
- }
- void CheckCollision()
- {
- for(std::vector<Data>::iterator it=mol.begin();it!=mol.end();it++)
- {
- if(it->Pos.x <= 0 && it->Speed.x >0)//Berührt ein Molekül die wand?
- {
- it->Speed.x= - it->Speed.x;
- SumHitWall++;HitWallSec++;
- }
- else if(it->Pos.x + it->radius*2 >= ROOM_HEIGTH && it->Speed.x <0)
- {
- it->Speed.x= - it->Speed.x;
- SumHitWall++;HitWallSec++;
- }
- if(it->Pos.y <= 0 && it->Speed.y >0)
- {
- it->Speed.y= - it->Speed.y;
- SumHitWall++;HitWallSec++;
- }
- else if(it->Pos.y + it->radius*2 >= ROOM_LENGTH && it->Speed.y <0)
- {
- it->Speed.y= - it->Speed.y;
- SumHitWall++;HitWallSec++;
- }
- std::vector<Data>::iterator i=it;
- i++;
- for(;i!=mol.end();i++)//berühren sich Moleküle miteinander
- {
- if(CircleCollision(it->Pos.x+it->radius , it->Pos.y+it->radius , it->radius,
- i->Pos.x+it->radius , i->Pos.y+it->radius , i->radius,0))
- {
- Vec2D aVec=Vec2D((it->Pos.x+it->radius) - (i->Pos.x+i->radius),
- (it->Pos.y+it->radius) - (i->Pos.y+i->radius));//Ja-> Verbindungvektor
- if(aVec.x==0 && aVec.y==0)
- {//wenn die Moleküle zufällig aufeinander liegen zufälliger Verbindungsvektor
- aVec.x=rand()%5-2.5;
- aVec.y=rand()%5-2.5;
- }
- float Temp = (it->radius + i->radius - aVec.vLength());//Greifen sie ineinander?
- aVec.normalize();
- it->Pos.x += aVec.x * Temp;//Verschiebe sie auseinander, bis sie sich nicht mehr berühren
- it->Pos.y += aVec.y * Temp;
- i->Pos.x -= aVec.x * Temp;
- i->Pos.y -= aVec.y * Temp;
- double b1=aVec.DotProduct(aVec,it->Speed);
- double b2=aVec.DotProduct(aVec,i->Speed );
- Vec2D b1Vec=aVec * b1;
- Vec2D b2Vec=aVec * b2;
- Vec2D c1Vec=it->Speed - b1Vec;
- Vec2D c2Vec=i->Speed - b2Vec;
- double Tempb1=b1;
- b1 = b2;//Vektoren vertauschen -> da Massen gleich sind
- b2 = Tempb1;
- b1Vec=b1*aVec;
- b2Vec=b2*aVec;
- it->Speed=b1Vec+c1Vec;
- i->Speed =b2Vec+c2Vec;
- SumHitMol++;HitMolSec++;
- }
- }
- }
- }
- bool CircleCollision(int x1 , int y1 , int r1 , int x2 , int y2 , int r2 , int offset)
- {
- int xdiff = x2 - x1;
- int ydiff = y2 - y1;
- int dcentre_sq = (ydiff*ydiff) + (xdiff*xdiff);
- int r_sum_sq = r1 + r2;
- r_sum_sq *= r_sum_sq;
- return (dcentre_sq - r_sum_sq <= (offset*offset));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement