Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <SDL_collide.hpp>
  4. #include "Vector2D.hpp"
  5. #include <vector>
  6. #include <ctime>
  7.  
  8. struct Data//Speichert ein Molekül ab
  9. {
  10.     Vec2D Pos;
  11.     Vec2D Speed;
  12.     int radius;
  13.     Data(Vec2D p,Vec2D s,int r):Pos(p),Speed(s),radius(r) {};
  14.     Data(){}
  15. };
  16. std::vector<Data> mol;
  17. float Time;
  18. int NumOfAvg;
  19. float SumHitWall,HitWallSec,HitWallSecAvg;
  20. float SumHitMol ,HitMolSec ,HitMolSecAvg;
  21. __int64 TimeLast , TimeNow , TimeElapsed;
  22.  
  23. void ProcessTime();
  24. void CheckCollision();
  25. bool CircleCollision(int x1 , int y1 , int r1 , int x2 , int y2 , int r2 , int offset);
  26.  
  27. #define ROOM_HEIGTH 100000
  28. #define ROOM_LENGTH 100000
  29.  
  30. int main(int argc,char* argv[])
  31. {
  32.     //Letzten Zeitpunkt einmal merken
  33.     time(&TimeLast);
  34.     TimeNow=TimeElapsed=0;
  35.  
  36.     return 0;
  37. }
  38.  
  39. void ProcessTime()
  40. {
  41.     time(&TimeNow);
  42.     TimeElapsed=TimeNow-TimeLast;
  43.     TimeLast=TimeNow;
  44. }
  45.  
  46. void CheckCollision()
  47. {
  48.     for(std::vector<Data>::iterator it=mol.begin();it!=mol.end();it++)
  49.     {
  50.         if(it->Pos.x  <= 0 && it->Speed.x >0)//Berührt ein Molekül die wand?
  51.         {
  52.             it->Speed.x= - it->Speed.x;
  53.             SumHitWall++;HitWallSec++;
  54.         }
  55.         else if(it->Pos.x + it->radius*2 >= ROOM_HEIGTH && it->Speed.x <0)
  56.         {
  57.             it->Speed.x= - it->Speed.x;
  58.             SumHitWall++;HitWallSec++;
  59.         }
  60.  
  61.         if(it->Pos.y  <= 0 && it->Speed.y >0)
  62.         {
  63.             it->Speed.y= - it->Speed.y;
  64.             SumHitWall++;HitWallSec++;
  65.         }
  66.         else if(it->Pos.y + it->radius*2 >= ROOM_LENGTH && it->Speed.y <0)
  67.         {
  68.             it->Speed.y= - it->Speed.y;
  69.             SumHitWall++;HitWallSec++;
  70.         }
  71.  
  72.         std::vector<Data>::iterator i=it;
  73.         i++;
  74.         for(;i!=mol.end();i++)//berühren sich Moleküle miteinander
  75.         {
  76.             if(CircleCollision(it->Pos.x+it->radius , it->Pos.y+it->radius , it->radius,
  77.                                                                  i->Pos.x+it->radius ,  i->Pos.y+it->radius ,  i->radius,0))
  78.             {
  79.                 Vec2D aVec=Vec2D((it->Pos.x+it->radius) - (i->Pos.x+i->radius),
  80.                                  (it->Pos.y+it->radius) - (i->Pos.y+i->radius));//Ja-> Verbindungvektor
  81.                 if(aVec.x==0 && aVec.y==0)
  82.                 {//wenn die Moleküle zufällig aufeinander liegen zufälliger Verbindungsvektor
  83.                     aVec.x=rand()%5-2.5;
  84.                     aVec.y=rand()%5-2.5;
  85.                 }
  86.  
  87.                 float Temp = (it->radius + i->radius - aVec.vLength());//Greifen sie ineinander?
  88.                 aVec.normalize();
  89.                 it->Pos.x += aVec.x * Temp;//Verschiebe sie auseinander, bis sie sich nicht mehr berühren
  90.                 it->Pos.y += aVec.y * Temp;
  91.                 i->Pos.x  -= aVec.x * Temp;
  92.                 i->Pos.y  -= aVec.y * Temp;
  93.                 double b1=aVec.DotProduct(aVec,it->Speed);
  94.                 double b2=aVec.DotProduct(aVec,i->Speed );
  95.                 Vec2D b1Vec=aVec * b1;
  96.                 Vec2D b2Vec=aVec * b2;
  97.                 Vec2D c1Vec=it->Speed - b1Vec;
  98.                 Vec2D c2Vec=i->Speed  - b2Vec;
  99.                
  100.                 double Tempb1=b1;
  101.                 b1 = b2;//Vektoren vertauschen -> da Massen gleich sind
  102.                 b2 = Tempb1;
  103.                 b1Vec=b1*aVec;
  104.                 b2Vec=b2*aVec;
  105.  
  106.                 it->Speed=b1Vec+c1Vec;
  107.                 i->Speed =b2Vec+c2Vec;
  108.  
  109.                 SumHitMol++;HitMolSec++;
  110.             }
  111.         }
  112.     }
  113. }
  114.  
  115. bool CircleCollision(int x1 , int y1 , int r1 , int x2 , int y2 , int r2 , int offset)
  116. {
  117.     int xdiff = x2 - x1;   
  118.     int ydiff = y2 - y1;   
  119.    
  120.     int dcentre_sq = (ydiff*ydiff) + (xdiff*xdiff);
  121.    
  122.     int r_sum_sq = r1 + r2;
  123.     r_sum_sq *= r_sum_sq;
  124.  
  125.     return (dcentre_sq - r_sum_sq <= (offset*offset));
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement