12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /*
- * 2D Physic Engine
- * force.cpp:
- * Based on pikuma.com Learn Game Physics Engine Programming course.
- * Copyright (c) 2022 986-Studio. All rights reserved.
- *
- * Created by Manoël Trapier on 17/06/2022.
- */
- #include <physics/force.h>
- #include <algorithm>
- vec2 force::generateDragForce(const particle &particleRef, double k)
- {
- vec2 dragForce;
- if (particleRef.velocity.magnitudeSquared() > 0)
- {
- vec2 dragDirection = particleRef.velocity.unitVector() * -1;
- double dragMagnitude = k * particleRef.velocity.magnitudeSquared();
- dragForce = dragDirection * dragMagnitude;
- }
- return dragForce;
- }
- vec2 force::generateFrictionForce(const particle &particleRef, double k)
- {
- vec2 frictionForce;
- vec2 frictionDirection = particleRef.velocity.unitVector() * -1;
- double frictionMagnitude = k;
- frictionForce = frictionDirection * frictionMagnitude;
- return frictionForce;
- }
- vec2 force::generateGravitationalForce(const particle &a, const particle &b, double g, double minDistance,
- double maxDistance)
- {
- vec2 attractionForce;
- vec2 d = b.position - a.position;
- double distanceSquared = d.magnitudeSquared();
- vec2 attractionDirection = d.unitVector();
- distanceSquared = std::clamp(distanceSquared, minDistance, maxDistance);
- double attractionMagnitude = g * (a.mass * b.mass) / distanceSquared;
- 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;
- }
|