A 3D+ point is a point with latitude, longitude, elevation, and time components.
A 3D+ vector describes the angle and magnitude of the difference between two 3D+ points.
A route is a series of 3D+ points which connect to form a continuous path.
Score routes against given 3D+ points origin and destination
DEFINE drudge, a factor to convert lat/lng distances to a score
DEFINE wander, a factor to convert deviation from course to a score
DEFINE effort, a factor to convert elevation gain to a score
DEFINE patience, a factor to convert time to a score
DEFINE rush, a factor to convert lateness to a score
SET speed = 13mph
FOR each route
SET score to 0
FIND start, the nearest 3D+ point to origin
FIND finish, the nearest 3D+ point to destination
CREATE ride, a 3D+ vector using start and finish
CREATE commute, a 3D+ vector using origin and destination
FOR each 3D+ point step in route
GET next step
GET lean, 3D+ vector using step and next step
BUMP score by wander * difference between angle of commute and angle of lean
BUMP score by effort * elevation gain of lean
BUMP score by wander * difference between angle of commute and angle of ride * distance of ride
BUMP score by rush * (time of finish - (time of destination - distance between finish and destination / speed))
BUMP score by patience * difference between time of origin and time of start
BUMP score by patience * difference between time of finish and time of destination
SORT routes descending by score
- improve penalty for arriving late
- improve accounting for pleasant deviation
- balance of elevation gain and loss
- frequency of alternation between climbing and descending
- maybe allow some configuration by the user of the conversion factors
- can I refactor comparisons to leverage 4-component vectors' inherent qualities (i.e. angle & magnitude)?