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