static void quaternion_inv(const struct quaternion *q, struct quaternion *q_inv) { float mag = quaternion_magnitude(q); quaternion_unit_inv(q, q_inv); q_inv->w /= mag * mag; q_inv->x /= mag * mag; q_inv->y /= mag * mag; q_inv->z /= mag * mag; }
/** * @ingroup quaternion * @brief Constrains the values to sane values. If this is done enough times during the course of program execution, it has the effect of keeping the values on the manifold. * */ HYPAPI quaternion * quaternion_normalize(quaternion *self) { float mag; mag = quaternion_magnitude(self); if (mag == 0.0f) { /* can't normalize a zero * avoid divide by zero */ return self; } self->x /= mag; self->y /= mag; self->z /= mag; self->w /= mag; return self; }