From 2826b5bc8e3f79973b4ab456a589236d277d7e15 Mon Sep 17 00:00:00 2001
From: Andreas Schenk <andreas_schenk@hms.harvard.edu>
Date: Wed, 7 Dec 2011 16:37:53 -0500
Subject: [PATCH] fixed bug in SignedAngle for parallel Vec2s / added export
 for SingedAngle

---
 modules/geom/pymod/export_vecmat2_op.cc |  2 ++
 modules/geom/src/vecmat2_op.cc          | 12 ++++++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/modules/geom/pymod/export_vecmat2_op.cc b/modules/geom/pymod/export_vecmat2_op.cc
index cf1f0ac0b..8f594681f 100644
--- a/modules/geom/pymod/export_vecmat2_op.cc
+++ b/modules/geom/pymod/export_vecmat2_op.cc
@@ -33,6 +33,7 @@ Real (*Mat2Det)(const Mat2& m)                                        = &Det;
 Mat2   (*Mat2Invert)(const Mat2& m)                                     = &Invert;
 Mat2   (*Mat2Transpose)(const Mat2& m)                                  = &Transpose;
 Real (*Vec2Angle)(const Vec2& v1, const Vec2& v2)                     = &Angle;
+Real (*Vec2SignedAngle)(const Vec2& v1, const Vec2& v2)                     = &SignedAngle;
 Vec2   (*Vec2Normalize)(const Vec2& v1)                                 = &Normalize;
 Vec2   (*Vec2Rotate)(const Vec2& v1,Real ang)                         = &Rotate;
 Vec2 (*Vec2Min)(const Vec2&, const Vec2&) = &Min;
@@ -53,6 +54,7 @@ void export_VecMat2_op()
   def("Invert",Mat2Invert);
   def("Transpose",Mat2Transpose);
   def("Angle",Vec2Angle);
+  def("SignedAngle",Vec2SignedAngle);
   def("Normalize",Vec2Normalize);
   def("Rotate",Vec2Rotate);
   def("Min",Vec2Min);
diff --git a/modules/geom/src/vecmat2_op.cc b/modules/geom/src/vecmat2_op.cc
index 69f2e8e8c..ea0a45213 100644
--- a/modules/geom/src/vecmat2_op.cc
+++ b/modules/geom/src/vecmat2_op.cc
@@ -55,11 +55,15 @@ Real Angle(const Vec2& v1, const Vec2& v2)
 
 Real SignedAngle(const Vec2& v1, const Vec2& v2)
 {
-  Vec3 vc;
-  vc=Cross(Vec3(v1),Vec3(v2));
-  if(Length(v1)==0.0 || Length(v2)==0.0 || Length(vc)==0.0)
+  if(Length(v1)==0.0 || Length(v2)==0.0){
     return 0.0;
-  return acos(Dot(v1,v2)/Length(v1)/Length(v2))*vc.z/std::fabs(vc.z);
+  }
+  Vec3 vc=Cross(Vec3(v1),Vec3(v2));
+  Real sign=1.0;
+  if(vc.z!=0.0){
+    sign=vc.z/std::fabs(vc.z);
+  }
+  return acos(Dot(v1,v2)/Length(v1)/Length(v2))*sign;
 }
 
 Vec2 Rotate(const Vec2& v,Real ang)
-- 
GitLab