Fixed Math, Added Opposite, aligned constructors.

Added getOpposite and isOpposite methods, As well as reviewing and fixing the math for the secondary ordinal directions, but I'm still not convinced they should even be in the API.
Why do this with a static initialiser? Why not just pass the value for *opposite* in to the ctor?