Skip to content

Commit

Permalink
Added more options and started applying vec2 class.
Browse files Browse the repository at this point in the history
  • Loading branch information
evilsetg committed Nov 4, 2018
1 parent 3df888d commit 2c71683
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 43 deletions.
46 changes: 34 additions & 12 deletions main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
#include "stickman.h"

int KASTENGROSSE = 5;
const int FRAMERATE = 25;
const int FRAMERATE = 30;

int main ()
{
Expand All @@ -54,6 +54,7 @@ int main ()
std::vector<kraftpartikel>::iterator vKpointer = world.vKPartikel.begin();
while (quit!=true)
{
SDL_Delay(1);
while(SDL_PollEvent(&event)!=0)
{
if(event.type == SDL_QUIT)
Expand All @@ -75,7 +76,7 @@ int main ()
std::cout << timer.get() << "\n" << std::flush;
break;
case SDLK_w:
std::cout << (world.vKPartikel.end()-1)->getX() << " , " << (world.vKPartikel.end()-1)->getY() << "\n" << std::flush;
std::cout << vKpointer->getX() << " , " << vKpointer->getY() << "\n" << std::flush;
break;
case SDLK_n:
tempPart.setX(static_cast<float>(mousex));
Expand All @@ -96,14 +97,14 @@ int main ()
vKpointer->setyvel( vKpointer->getyvel() - 5);
break;
case SDLK_PLUS:
//vKpointer->color = {0xFF,0x00,0x00,0xFF};
vKpointer->color = {0x00,0x00,0x00,0xFF};
vKpointer+=1;
//vKpointer->color = {0xFF,0x00,0x00,0xFF};
vKpointer->color = {0xFF,0x00,0x00,0xFF};
break;
case SDLK_MINUS:
//vKpointer->color = {0xFF,0x00,0x00,0xFF};
vKpointer->color = {0x00,0x00,0x00,0xFF};
vKpointer-=1;
//vKpointer->color = {0xFF,0x00,0x00,0xFF};
vKpointer->color = {0xFF,0x00,0x00,0xFF};
break;
case SDLK_e:
std::cout << world.getEnergy() << "\n" << std::flush;
Expand All @@ -116,10 +117,28 @@ int main ()
break;
case SDLK_1:
world.coulombfaktor -= 1000;
break;
break;
case SDLK_2:
world.coulombfaktor += 1000;
break;
case SDLK_3:
world.gravF.Y -= 1;
break;
case SDLK_4:
world.gravF.X += 1;
break;
case SDLK_5:
vKpointer->setMass(vKpointer->getMass() - 2);
break;
case SDLK_6:
vKpointer->setMass(vKpointer->getMass() + 2);
break;
case SDLK_7:
world.bouncetype -=1;
break;
case SDLK_8:
world.bouncetype +=1;
break;
}

}
Expand All @@ -133,20 +152,23 @@ int main ()
}
if (!timer.getstatus())
{
for (int i=0; i<1000; i++)
{
//std::cout << timer.get() << "\n";
world.iterate(1e-5);
}
}
if( timer.get() >= (1000/FRAMERATE) )
{
if( timer.get() >= (1000/FRAMERATE) )
{
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(gRenderer);
SDL_SetRenderDrawColor(gRenderer, 0x00, 0x00, 0x00, 0xFF);
drawobjs(gRenderer, world.vKPartikel, KASTENGROSSE);
SDL_SetRenderDrawColor(gRenderer, 0x00, 0x00, 0x00, 0x00);
SDL_RenderDrawRect(gRenderer, &drawnRect);
SDL_RenderPresent(gRenderer);
timer.reset();
}
}
}
}

SDL_DestroyWindow(gWindow);
SDL_DestroyRenderer(gRenderer);
Expand Down
60 changes: 34 additions & 26 deletions physobj.cc
Original file line number Diff line number Diff line change
Expand Up @@ -131,14 +131,10 @@ void kraftpartikel::setCharge(float q)




void kraftpartikel::iterate(float t) //iteration of simulation
{
setY( getY() + t * getyvel() ); //Iterate Position with velocity
setX( getX() + t * getxvel() );
setyvel( getyvel() + t * F.Y / mMass ); //Iterate velocity with force
setxvel( getxvel() + t * F.X / mMass );
return;
pos += t*vel;
vel += t/mMass * F;
}


Expand All @@ -160,47 +156,47 @@ Worldframe::~Worldframe()

void Worldframe::iterate(float t)
{
for ( std::vector<kraftpartikel>::iterator i = vKPartikel.begin(); i < vKPartikel.end(); i++)
{
for (std::vector<kraftpartikel>::iterator j = i+1; j < vKPartikel.end(); j++)
{
elasticBounce(&*i,&*j);
}
if (isoutofworld(*i))
{
periodicboundary(&*i);
}
}

for ( std::vector<kraftpartikel>::iterator i = vKPartikel.begin(); i < vKPartikel.end(); i++)
{
i->setFx(0.);
i->setFy(0.);

for ( std::vector<kraftpartikel>::iterator j = vKPartikel.begin(); j < vKPartikel.end(); j++)
{
if ( i!=j )
{
elasticBounce(&*i,&*j);
radialForce(&*i,&*j,coulombfaktor,-2.);
//radialForce(&*i,&*j,-9*coulombfaktor,-5.);
}
}

gravitationalForce(&*i,gravF.X,gravF.Y);
i->iterate(t);

if (isoutofworld(*i))
{
switch (bouncetype)
{
case 1:
wallbounce(&*i);
break;
case 2:
periodicboundary(&*i);
break;
}
}
}
}

void Worldframe::radialForce(kraftpartikel* part1, kraftpartikel* part2, float kraftfaktor, float exponent)
{
float x = part2->getX() - part1->getX();
float y = part2->getY() - part1->getY();
part1->setFx(part1->getFx() + part1->getCharge() * part2->getCharge() * x * kraftfaktor * pow( pow(x,2) + pow(y,2) , 0.5 * (exponent - 1.)));
part1->setFy(part1->getFy() + part1->getCharge() * part2->getCharge() * y * kraftfaktor * pow( pow(x,2) + pow(y,2) , 0.5 * (exponent - 1)));
vec2 r = part2->pos - part1->pos;
part1->F += part1->getMass() * part2->getMass() * kraftfaktor * pow( r.abspow2(), 0.5 * (exponent-1)) * r;
}

void Worldframe::gravitationalForce(kraftpartikel* part, float Fx, float Fy)
{
part->setFx( part->getFx() + Fx);
part->setFy( part->getFy() + Fy);
part->F += gravF;
}

void Worldframe::elasticBounce(kraftpartikel* part1, kraftpartikel* part2)
Expand All @@ -212,7 +208,7 @@ void Worldframe::elasticBounce(kraftpartikel* part1, kraftpartikel* part2)
float m1 = part1->getMass();
float m2 = part2->getMass();

float faktor = 10;
float faktor = 5;
vec2 rrel = r2 - r1;
vec2 vrel = v2 - v1;
float r = rrel.abs();
Expand Down Expand Up @@ -258,3 +254,15 @@ float Worldframe::getEnergy()
}
return T;
}

void Worldframe::wallbounce(physobj* part)
{

if (part->pos.X > size.X || part->pos.X < 0)
part->vel.X *= -1;

if (part->pos.Y > size.Y || part->pos.Y < 0)
part->vel.Y *= -1;

return;
}
6 changes: 4 additions & 2 deletions physobj.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class physobj
~physobj();
vec2 pos;
vec2 vel;
std::array<Uint8,4> color = {0x00,0x00,0x00,0xFF};
std::array<unsigned short,4> color = {0x00,0x00,0x00,0xFF};

private:
};
Expand All @@ -63,9 +63,9 @@ class kraftpartikel : public physobj
void setFy(float F);
void setMass(float m);
void setCharge(float q);
vec2 F;

private:
vec2 F;
float mMass=1;
float mCharge=1;

Expand All @@ -86,13 +86,15 @@ class Worldframe
float coulombfaktor = 40000;
float getEnergy();
std::vector<kraftpartikel> vKPartikel;
int bouncetype = 1;
private:
void radialForce(kraftpartikel* part1, kraftpartikel* part2, float kraftfaktor, float exponent); //radialkraft part2 auf part1. Form: F^{->} = e^{^}_{r} * kraftfaktor * r^{exponent}
void elasticBounce(kraftpartikel* part1, kraftpartikel* part2);
void gravitationalForce(kraftpartikel* part, float Fx, float Fy); //In bestimmte Richtung gerichtete kraft.
bool collisioncheck(physobj* part1, physobj* part2);
bool isoutofworld(const physobj& part) const;
void periodicboundary(physobj* part);
void wallbounce(physobj* part);
};

#endif
Binary file modified stickfight
Binary file not shown.
5 changes: 2 additions & 3 deletions utility.cc
Original file line number Diff line number Diff line change
Expand Up @@ -266,15 +266,14 @@ void drawobj(SDL_Renderer* Renderer, kraftpartikel* Obj, int boxsize)
SDL_Rect objRect = {0,0,boxsize,boxsize};
objRect.x= Obj->getX()-boxsize/2;
objRect.y= SCREEN_HEIGHT - Obj->getY()-boxsize/2;
std::array<Uint8,4> color = Obj->color;
std::cout << unsigned(color.at(0)) << "\n" << std::flush;// << Obj->color[1] << Obj->color[2] << Obj->color[3] << "\n" << std::flush;
std::array<unsigned short,4> color = Obj->color;
SDL_SetRenderDrawColor(Renderer, color.at(0), color.at(1), color.at(2), color.at(3));
SDL_RenderFillRect(Renderer,&objRect);
}

void drawobjs(SDL_Renderer* Renderer, std::vector<kraftpartikel> vObj, int boxsize)
{
for (auto it = begin(vObj); it != end(vObj); ++it)
for (auto it = vObj.begin(); it < vObj.end(); it++)
{
drawobj(Renderer, &(*it), boxsize);
}
Expand Down
4 changes: 4 additions & 0 deletions vec2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ float vec2::abs() const
{
return std::sqrt(pow(X,2)+pow(Y,2));
}
float vec2::abspow2() const
{
return pow(X,2)+pow(Y,2);
}


float vec2::angle() const
Expand Down
1 change: 1 addition & 0 deletions vec2.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class vec2
vec2(float X,float Y);
std::array<float,2> toarr() const;
float abs() const;
float abspow2() const;
float angle() const;
float distTo(const vec2 &b) const;
float angTo(const vec2 &b) const;
Expand Down

0 comments on commit 2c71683

Please sign in to comment.