add angle wrapping functions: angle_wrap_rad(), angle_wrap_deg().
use with mathutils.
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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");
 | 
			
		||||
 
 | 
			
		||||
@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user