#ifndef RC_QUATERNION_H
#define RC_QUATERNION_H
#ifdef __cplusplus
extern "C" {
#endif
#include <rc/math/vector.h>
#include <rc/math/matrix.h>
double rc_quaternion_norm(rc_vector_t q);
double rc_quaternion_norm_array(double q[4]);
int rc_normalize_quaternion(rc_vector_t* q);
int rc_normalize_quaternion_array(double q[4]);
int rc_quaternion_to_tb(rc_vector_t q, rc_vector_t* tb);
int rc_quaternion_to_tb_array(double q[4], double tb[3]);
int rc_quaternion_from_tb(rc_vector_t tb, rc_vector_t* q);
int rc_quaternion_from_tb_array(double tb[3], double q[4]);
int rc_quaternion_conjugate(rc_vector_t q, rc_vector_t* c);
int rc_quaternion_conjugate_inplace(rc_vector_t* q);
int rc_quaternion_conjugate_array(double q[4], double c[4]);
int rc_quaternion_conjugate_array_inplace(double q[4]);
int rc_quaternion_imaginary_part(rc_vector_t q, rc_vector_t* img);
int rc_quaternion_multiply(rc_vector_t a, rc_vector_t b, rc_vector_t* c);
int rc_quaternion_multiply_array(double a[4], double b[4], double c[4]);
int rc_quaternion_rotate(rc_vector_t* p, rc_vector_t q);
int rc_quaternion_rotate_array(double p[4], double q[4]);
int rc_quaternion_rotate_vector(rc_vector_t* v, rc_vector_t q);
int rc_quaternion_rotate_vector_array(double v[3], double q[4]);
int rc_quaternion_to_rotation_matrix(rc_vector_t q, rc_matrix_t* m);
#ifdef __cplusplus
}
#endif
#endif