summaryrefslogtreecommitdiff
path: root/flower
diff options
context:
space:
mode:
authorDavid Kastrup <dak@gnu.org>2015-06-29 10:48:29 +0200
committerDavid Kastrup <dak@gnu.org>2015-07-05 10:32:28 +0200
commitf3f291c3c4411f9e73b59bfff94af0be60b43934 (patch)
tree442c37d58f16006bcfd31fc14ec5aa5916ee80e6 /flower
parent8a2ae29c1aa70e9bdd90ec62e1371cfa114bf0e5 (diff)
Robustify Offset::direction and Offset::length
Diffstat (limited to 'flower')
-rw-r--r--flower/offset.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/flower/offset.cc b/flower/offset.cc
index 0554e6b2e9..7cb2677481 100644
--- a/flower/offset.cc
+++ b/flower/offset.cc
@@ -90,8 +90,7 @@ Offset::angle_degrees () const
Real
Offset::length () const
{
- return sqrt (sqr (coordinate_a_[X_AXIS])
- + sqr (coordinate_a_[Y_AXIS]));
+ return hypot (coordinate_a_[X_AXIS], coordinate_a_[Y_AXIS]);
}
bool
@@ -107,6 +106,17 @@ 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;
}