Bugfix: quaternion angle calculation in python used the acos function.

This gives nan if the input is e.g. 1.00000001 due to rounding errors,
better is to use saacos (safe acos) that checks for the range first.
This commit is contained in:
2008-01-29 09:44:26 +00:00
parent 24aa536f54
commit 31a1590db0
2 changed files with 5 additions and 8 deletions

View File

@@ -1,5 +1,5 @@
/*
* $Id: Mathutils.c 11502 2007-08-06 14:27:08Z khughes $
* $Id$
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -500,10 +500,7 @@ PyObject *M_Mathutils_AngleBetweenVecs(PyObject * self, PyObject * args)
}
dot /= (sqrt(test_v1) * sqrt(test_v2));
if (dot < -1.0f || dot > 1.0f) {
CLAMP(dot,-1.0f,1.0f);
}
angleRads = (double)acos(dot);
angleRads = (double)saacos(dot);
return PyFloat_FromDouble(angleRads * (180/ Py_PI));

View File

@@ -1,5 +1,5 @@
/*
* $Id: quat.c 12314 2007-10-20 20:24:09Z campbellbarton $
* $Id$
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -184,13 +184,13 @@ static PyObject *Quaternion_getattr(QuaternionObject * self, char *name)
}
if(STREQ(name, "angle")) {
mag = self->quat[0];
mag = 2 * (acos(mag));
mag = 2 * (saacos(mag));
mag *= (180 / Py_PI);
return PyFloat_FromDouble(mag);
}
if(STREQ(name, "axis")) {
mag = self->quat[0] * (Py_PI / 180);
mag = 2 * (acos(mag));
mag = 2 * (saacos(mag));
mag = sin(mag / 2);
for(x = 0; x < 3; x++) {
vec[x] = (float)(self->quat[x + 1] / mag);