The function does a rotation about the specified axis by p_radians. Specify the required axis p_axis as a capital X, y or Z in single quotes.
This is similar to the function rotate_2D_with_sine_and_cosine() -- see that function for explaination.
This function differs from rotate_2D_with_sine_and_cosine() in that is does the sine and cosine function calls itself rather than having those values passed-in as parameters.
You may have to adapt the calculations to suit your coordinate system -- to make rotations around certain axes clockwise or anticlockwise as appropriate.
typedef struct
{
float x;
float y;
float z;
} vector_3D;
void rotate_vector( vector_3D *p_vector_ptr, char p_axis, float p_radians )
{
//
double x, y, z;
switch( p_axis )
{
case 'X':
z = (double) p_vector_ptr->y;
z *= sin( (double) p_radians );
z += ( (double) p_vector_ptr->z ) * cos( (double) p_radians );
y = (double) p_vector_ptr->y;
y *= cos( (double) p_radians );
y += ( (double) p_vector_ptr->z ) * sin( (double) p_radians );
p_vector_ptr->y = (float) y;
p_vector_ptr->z = (float) z;
break;
case 'Y':
x = (double) p_vector_ptr->z;
x = 0.0 - x;
x *= sin( (double) p_radians );
x += ( (double) p_vector_ptr->x ) * cos( (double) p_radians );
z = (double) p_vector_ptr->z;
z *= cos( (double) p_radians );
z += ( (double) p_vector_ptr->x ) * sin( (double) p_radians );
p_vector_ptr->z = (float) z;
p_vector_ptr->x = (float) x;
break;
case 'Z':
x = (double) p_vector_ptr->y;
x *= sin( (double) p_radians );
x += ( (double) p_vector_ptr->x ) * cos( (double) p_radians );
y = (double) p_vector_ptr->y;
y *= cos( (double) p_radians );
y += ( (double) p_vector_ptr->x ) * sin( (double) p_radians );
p_vector_ptr->y = (float) y;
p_vector_ptr->x = (float) x;
break;
#if DIAGS
default:
err( 4597 );
#endif
}
}