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.
Oh of course, that makes sense, it just kind of feels wrong. I guess the only other way might be to have in the ctor:
```if (opposite != null) {
    this.opposite = opposite;
    opposite.opposite = this;
}```
Not sure that's any neater though :(