123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /*
- * 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;
- }
|