Reimplement everything using vectors(pseudopoints)

Velocities are almost always best represented by velocity vectors.
Implementing this way allows you to use a ±90 degree rotation matrix to
handle the rotation.

Since a point is a strict functional subset of a vector, implement
position using points (vectors). By doing this you can perform simple
vector addition against both the position and the direction (velocity).