Browse Source

Adding spring force.

Godzil 1 year ago
parent
commit
30fbd77cd7
4 changed files with 42 additions and 11 deletions
  1. 24 10
      source/app.cpp
  2. 4 1
      source/include/app.h
  3. 1 0
      source/include/physics/force.h
  4. 13 0
      source/physics/force.cpp

+ 24 - 10
source/app.cpp

@@ -29,8 +29,9 @@ void application::setup()
     this->running = graphics::openWindow();
     this->millisecsPreviousFrame = SDL_GetTicks();
 
-    this->particles.push_back(new particle(200, 200, 1, 6));
-    this->particles.push_back(new particle(500, 500, 20.0, 20));
+    this->anchor = vec2(graphics::width() / 2.0,30);
+    this->particles.push_back(new particle(graphics::width() / 2.0, graphics::height() / 2.0,
+                                       2.0, 10));
 }
 
 void application::input()
@@ -141,14 +142,21 @@ void application::update()
 
     for (auto part:this->particles)
     {
+        part->addForce(pushForce);
+
         vec2 friction = force::generateFrictionForce(*part, 20);
         part->addForce(friction);
+
+        vec2 drag = force::generateDragForce(*part, 0.001);
+        part->addForce(drag);
+
+        vec2 weight = vec2(0, part->mass * 9.81 * PIXELS_PER_METER);
+        part->addForce(weight);
     }
 
-    vec2 attraction = force::generateGravitationalForce(*this->particles[0], *this->particles[1],
-                                                        1000, 5, 100);
-    this->particles[0]->addForce(attraction);
-    this->particles[1]->addForce(-attraction);
+    vec2 spring = force::generateSpringForce(*this->particles[0],
+                                             this->anchor, this->restLenght, this->k);
+    this->particles[0]->addForce(spring);
 
     for (auto part:this->particles)
     {
@@ -203,10 +211,16 @@ void application::render()
                              this->mouseCursor.x, this->mouseCursor.y, 0xFFFFFFFF);
     }
 
-    graphics::draw::fillCircle(this->particles[0]->position.x, this->particles[0]->position.y,
-                               this->particles[0]->radius, 0xFFAA3300);
-    graphics::draw::fillCircle(this->particles[1]->position.x, this->particles[1]->position.y,
-                               this->particles[1]->radius, 0xFF00FFFF);
+    graphics::draw::line(this->anchor.x, this->anchor.y,
+                         this->particles[0]->position.x, this->particles[0]->position.y,
+                         0xFF313131);
+    graphics::draw::fillCircle(this->anchor.x, this->anchor.y, 5, 0xFF001155);
+
+    for(auto part: this->particles)
+    {
+        graphics::draw::fillCircle(part->position.x, part->position.y, part->radius, 0xFFAA3300);
+    }
+
 
     if (this->showForceSum || this->showVelocity || this->showAllForces)
     {

+ 4 - 1
source/include/app.h

@@ -27,9 +27,12 @@ private:
     double deltaTime;
 
     vec2 pushForce = vec2(0, 0);
-
     vec2 mouseCursor;
 
+    vec2 anchor;
+    double k = 100;
+    double restLenght = 400;
+
     const double G = 0.00000000006674;
     bool leftButtonPressed;
 

+ 1 - 0
source/include/physics/force.h

@@ -20,6 +20,7 @@ public:
     static vec2 generateDragForce(const particle &particleRef, double k);
     static vec2 generateGravitationalForce(const particle &a, const particle &b, double g,
                                            double minDistance = 0, double maxDistance = INFINITY);
+    static vec2 generateSpringForce(const particle &particle, vec2 anchor, double restLength, double k);
 };
 
 #endif /* PHYSICENGINE_FORCE_H */

+ 13 - 0
source/physics/force.cpp

@@ -54,4 +54,17 @@ vec2 force::generateGravitationalForce(const particle &a, const particle &b, dou
     attractionForce = attractionDirection * attractionMagnitude;
 
     return attractionForce;
+}
+
+vec2 force::generateSpringForce(const particle &particle, vec2 anchor, double restLength, double k)
+{
+    vec2 d = particle.position - anchor;
+    double displacement = d.magnitude() - restLength;
+
+    vec2 springDirection = d.unitVector();
+    double springMagnitude = -k * displacement;
+
+    vec2 springForce = springDirection * springMagnitude;
+
+    return springForce;
 }