- && !isnan (coordinate_a_ [Y_AXIS])
- && !isinf (coordinate_a_[X_AXIS])
- && !isnan (coordinate_a_[Y_AXIS]);
+ && !isnan (coordinate_a_ [Y_AXIS])
+ && !isinf (coordinate_a_[X_AXIS])
+ && !isinf (coordinate_a_[Y_AXIS]);
+}
+
+Offset
+Offset::direction () const
+{
+ Offset d = *this;
+ if (isinf (d[X_AXIS]))
+ {
+ if (!isinf (d[Y_AXIS]))
+ return Offset ((d[X_AXIS] > 0.0 ? 1.0 : -1.0), 0.0);
+ }
+ else if (isinf (d[Y_AXIS]))
+ return Offset (0.0, (d[Y_AXIS] > 0.0 ? 1.0 : -1.0));
+ else if (d[X_AXIS] == 0.0 && d[Y_AXIS] == 0.0)
+ return d;
+ // The other cases propagate or produce NaN as appropriate.
+
+ d /= length ();
+ return d;
+}
+
+Offset
+Offset::swapped () const
+{
+ return Offset (coordinate_a_[Y_AXIS], coordinate_a_[X_AXIS]);