Trajactory
by jrj2211
HTML
<script src="
https://cdn.jsdelivr.net/npm/[email protected]/dist/chart.umd.min.js
"></script>
<canvas id="lineChart" style='width: 100%;height:100%'></canvas>
CSS
html, body {
height:100vh;
padding:0;
margin:0;
}
JavaScript
const easing = {
cubic: easeInOutCubic,
linear: easeLinear,
}
// Example usage
const distance = 1000 // feet
const maxAcceleration = 10 // ft/s^2
const maxDeceleration = 5 // ft/s^2
const maxSpeed = 150 // ft/s
const timeStep = 0.01 // seconds
const ease = easing.cubic;
/**
* Easing function: easeInOutCubic
* Smoothly interpolates value from 0 to 1.
* @param {number} t - Normalized time (0 to 1).
* @returns {number} - Interpolated value (0 to 1).
*/
function easeInOutCubic(t) {
return t < 0.5 ? 4 * t ** 3 : 1 - Math.pow(-2 * t + 2, 3) / 2
}
function easeLinear(t) {
return t
}
/**
* @param {number} distance - Total distance in feet.
* @param {number} maxAcceleration - Maximum acceleration in ft/s^2.
* @param {number} maxSpeed - Maximum speed in mph.
* @param {number} timeStep - Time step for simulation in seconds.
* @returns {Object} - Object containing positions and velocities arrays.
*/
function trajectory({
distance,
maxAcceleration,
maxDeceleration,
maxSpeed,
ease,
timeStep = 0.1,
}) {
// Generate trajectory
const positions = []
const velocities = []
const accelerations = []
let currentPosition = 0
let lastPosition = 0
let lastVelocity = 0;
const maxAccDistance = maxSpeed ** 2 / (2 * maxAcceleration) // Distance needed for max speed
const maxDecDistance = maxSpeed ** 2 / (2 * maxDeceleration)
let peakSpeedFtPerSec // Peak speed in ft/s
let accelerationTime, decelerationTime
const accelerationDistance = 0.5 * maxAcceleration * accelerationTime ** 2
const decelerationDistance = 0.5 * maxDeceleration * decelerationTime ** 2
let cruiseDistance, cruiseTime
if (maxAccDistance + maxDecDistance <= distance) {
// The car can reach max speed and cruise
peakSpeedFtPerSec = maxSpeed
accelerationTime = peakSpeedFtPerSec / maxAcceleration
decelerationTime = peakSpeedFtPerSec / maxDeceleration
cruiseDistance = distance - (accelerationDistance + decelerationDistance)
cruiseTime =...