Gan_Quaternion q1, q2, q3; /* declare three quaternions */ /* fill q1 the "quick" way and scale it to unit length */ gan_quat_fill_q ( &q1, 0.5, -0.2, 0.3, 0.3 ); gan_quat_unit_i ( &q1 ); /* fill q2 the "slow" way and scale it to unit length */ q2 = gan_quat_fill_s ( -0.4, 0.7, 0.1, 0.9 ); q2 = gan_quat_unit_s ( &q2 ); /* add two quaternions */ gan_quat_add_q ( &q1, &q2, &q3 ); /* subtract two quaternions */ gan_quat_sub_q ( &q1, &q2, &q3 ); /* multiply a quaternion by a scalar */ gan_quat_scale_q ( &q1, 2.0, &q3 ); /* q3 = 2*q1, OR */ q3 = gan_quat_scale_s ( &q1, 2.0 ); /* q3 = 2*q1, OR */ gan_quat_scale_i ( &q1, 2.0 ); /* replace q1 = 2*q1 in-place */ /* divide a quaternion by a scalar */ gan_quat_divide_q ( &q1, 2.0, &q3 ); /* q3 = q1/2, OR */ q3 = gan_quat_divide_s ( &q1, 2.0 ); /* q3 = q1/2, OR */ gan_quat_divide_i ( &q1, 2.0 ); /* replace q1 = q1/2 in-place */ /* print squared length of quaternion */ printf ( "quaternion squared length |q|^2=%f\n", gan_quat_sqrlen_q(&q3) ); /* macro version, OR */ printf ( "quaternion squared length |q|^2=%f\n", gan_quat_sqrlen_s(&q3) ); /* function version */
Error detection: The routines gan_quat_divide_[qi]() and gan_quat_unit_[qi]() return NULL upon division by zero error, invoking the Gandalf error handler, whereas the equivalent ..._s() routines abort the program on error.