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 =...