Improve simulation documentation
This commit is contained in:
parent
5f38c6c64e
commit
ab5e892bdd
|
@ -8,16 +8,16 @@ import network from "./network.json";
|
|||
|
||||
const server = "http://localhost:4321";
|
||||
|
||||
// Number of milliseconds to stay at each stop
|
||||
// Time to stay at each stop (milliseconds)
|
||||
const stopTime = 10000;
|
||||
|
||||
// Step used to compute the vehicle angle in meters
|
||||
// Step used to compute the vehicle bearing (meters)
|
||||
const angleStep = 10;
|
||||
|
||||
// Maximum speed of a vehicle
|
||||
// Maximum speed of a vehicle (meters per millisecond)
|
||||
const maxSpeed = 60 / 3600;
|
||||
|
||||
// Minimum speed of a vehicle
|
||||
// Minimum speed of a vehicle (meters per millisecond)
|
||||
const minSpeed = 10 / 3600;
|
||||
|
||||
// Normal speed of a vehicle
|
||||
|
@ -38,42 +38,41 @@ class Course {
|
|||
// Stop to which this course is headed
|
||||
this.finalStop = null;
|
||||
|
||||
// Previous stops that this course left (with timestamps)
|
||||
// Previous stops that this course left (stop id/timestamp pairs)
|
||||
this.prevPassings = [];
|
||||
|
||||
// Next stops that this course will leave (with timestamps)
|
||||
// Next stops that this course will leave (stop id/timestamp pairs)
|
||||
this.nextPassings = [];
|
||||
|
||||
// Stop that this course just left or will leave
|
||||
this.departureStop = null;
|
||||
|
||||
// Time at which the last stop was left or will be left
|
||||
// Time at which the last stop was left or will be left (timestamp)
|
||||
this.departureTime = 0;
|
||||
|
||||
// Next stop that this course will reach
|
||||
// (if equal to departureStop, the course has reached its last stop)
|
||||
this.arrivalStop = null;
|
||||
|
||||
// Time at which the next stop will be left
|
||||
// Time at which the next stop will be left (timestamp)
|
||||
this.arrivalTime = 0;
|
||||
|
||||
// Segment of points between the current departure and arrival
|
||||
// Route between the current departure and arrival stops
|
||||
this.segment = null;
|
||||
|
||||
// Number of meters travelled between the two stops
|
||||
// Distance already travelled between the two stops (meters)
|
||||
this.traveledDistance = 0;
|
||||
|
||||
// Current vehicle speed in meters per millisecond
|
||||
// Current vehicle speed (meters per millisecond)
|
||||
this.speed = 0;
|
||||
|
||||
// Current vehicle latitude and longitude
|
||||
this.position = [0, 0];
|
||||
|
||||
// Current vehicle bearing
|
||||
// Current vehicle bearing (clockwise degrees from north)
|
||||
this.angle = 0;
|
||||
}
|
||||
|
||||
/** Retrieve information about the current segment used by the vehicle. */
|
||||
/** Find a route between the current departure and arrival stops. */
|
||||
updateSegment() {
|
||||
if (this.departureStop === null || this.arrivalStop === null) {
|
||||
this.segment = null;
|
||||
|
@ -117,7 +116,7 @@ to ${this.arrivalStop}`);
|
|||
this.segment.properties.length = 1000 * turfLength(this.segment);
|
||||
}
|
||||
|
||||
/** Merge data received from the server. */
|
||||
/** Merge passings data received from the server. */
|
||||
receiveData(data) {
|
||||
this.line = data.line;
|
||||
this.direction = data.direction;
|
||||
|
@ -129,7 +128,7 @@ to ${this.arrivalStop}`);
|
|||
);
|
||||
|
||||
// Remove older passings from next passings
|
||||
for (let [stop, time] of this.prevPassings) {
|
||||
for (let [stop, _] of this.prevPassings) {
|
||||
delete passings[stop];
|
||||
}
|
||||
|
||||
|
@ -268,6 +267,12 @@ to ${this.arrivalStop}`);
|
|||
this.position = positions[1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute the optimal speed to arrive on time.
|
||||
* @param {number} distance Distance to cover (meters)
|
||||
* @param {number} duration Remaining time (seconds)
|
||||
* @return {number} Optimal speed (meters per second)
|
||||
*/
|
||||
static computeSpeed(distance, duration) {
|
||||
if (duration <= 0) {
|
||||
// Late: go to maximum speed
|
||||
|
@ -285,6 +290,7 @@ to ${this.arrivalStop}`);
|
|||
}
|
||||
}
|
||||
|
||||
/** Fetch passing data from the server and update simulation. */
|
||||
const updateData = async courses => {
|
||||
const dataset = (await axios.get(`${server}/courses`)).data;
|
||||
|
||||
|
@ -307,13 +313,6 @@ const updateData = async courses => {
|
|||
}
|
||||
};
|
||||
|
||||
const tick = (courses, time) => {
|
||||
for (const course of Object.values(courses)) {
|
||||
course.update();
|
||||
course.move(time);
|
||||
}
|
||||
};
|
||||
|
||||
export const start = () => {
|
||||
const courses = {};
|
||||
let lastFrame = null;
|
||||
|
@ -328,9 +327,12 @@ export const start = () => {
|
|||
}
|
||||
|
||||
const time = lastFrame === null ? 0 : now - lastFrame;
|
||||
|
||||
lastFrame = now;
|
||||
tick(courses, time);
|
||||
|
||||
for (const course of Object.values(courses)) {
|
||||
course.update();
|
||||
course.move(time);
|
||||
}
|
||||
};
|
||||
|
||||
return { courses, update };
|
||||
|
|
Loading…
Reference in New Issue