From f1b42a129f0f9299a9e67eb0495131a37464c9cc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 2 Apr 2011 03:05:49 +0000 Subject: add angle wrapping functions: angle_wrap_rad(), angle_wrap_deg(). use with mathutils. --- source/blender/blenlib/BLI_math_rotation.h | 3 +++ source/blender/blenlib/intern/math_rotation.c | 16 ++++++++++++++++ source/blender/python/generic/mathutils_Matrix.c | 3 +-- source/blender/python/generic/mathutils_Quaternion.c | 4 ++-- 4 files changed, 22 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h index 0385ad5846f..ee8c3d5e10c 100644 --- a/source/blender/blenlib/BLI_math_rotation.h +++ b/source/blender/blenlib/BLI_math_rotation.h @@ -185,6 +185,9 @@ void vec_apply_track(float vec[3], short axis); float lens_to_angle(float lens); float angle_to_lens(float angle); +float angle_wrap_rad(float angle); +float angle_wrap_deg(float angle); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index 4e37de93ded..dfd715ccbf2 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -1675,3 +1675,19 @@ float angle_to_lens(float angle) { return 16.0f / tanf(angle * 0.5f); } + +/* 'mod_inline(-3,4)= 1', 'fmod(-3,4)= -3' */ +static float mod_inline(float a, float b) +{ + return a - (b * floorf(a / b)); +} + +float angle_wrap_rad(float angle) +{ + return mod_inline(angle + (float)M_PI, (float)M_PI*2.0f) - (float)M_PI; +} + +float angle_wrap_deg(float angle) +{ + return mod_inline(angle + 180.0f, 360.0f) - 180.0f; +} diff --git a/source/blender/python/generic/mathutils_Matrix.c b/source/blender/python/generic/mathutils_Matrix.c index 936c761bf90..41d9626db16 100644 --- a/source/blender/python/generic/mathutils_Matrix.c +++ b/source/blender/python/generic/mathutils_Matrix.c @@ -226,8 +226,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args) } } - /* clamp angle between -360 and 360 in radians */ - angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; + angle= angle_wrap_rad(angle); if(matSize != 2 && matSize != 3 && matSize != 4) { PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix"); diff --git a/source/blender/python/generic/mathutils_Quaternion.c b/source/blender/python/generic/mathutils_Quaternion.c index 43d3cbc62b0..be1fa6db035 100644 --- a/source/blender/python/generic/mathutils_Quaternion.c +++ b/source/blender/python/generic/mathutils_Quaternion.c @@ -861,7 +861,7 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN return -1; } - angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; + angle= angle_wrap_rad(angle); /* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */ if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) && @@ -955,7 +955,7 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw case 2: if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1) return NULL; - angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; /* clamp because of precision issues */ + angle= angle_wrap_rad(angle); /* clamp because of precision issues */ axis_angle_to_quat(quat, quat, angle); break; /* PyArg_ParseTuple assures no more then 2 */ -- cgit v1.2.3