Уменшение количества внутренних методов за счёт методов получения матрицы поворота для веросора; исправления в методах проверки матрицы поворота; добавление методов вычисления поворота (turn3) по матрице поворота 3x3
This commit is contained in:
parent
abf99a7126
commit
54c762da14
9 changed files with 448 additions and 351 deletions
|
|
@ -968,293 +968,20 @@ inline int bgc_fp64_quaternion_turn_vector_back(BGC_FP64_Vector3* const turned_v
|
|||
return BGC_SUCCESS;
|
||||
}
|
||||
|
||||
// ========= Get Versor Rotation Matrix ========= //
|
||||
|
||||
inline void _bgc_fp32_versor_get_rotation_matrix(BGC_FP32_Matrix3x3* const matrix, const BGC_FP32_Quaternion* const versor)
|
||||
{
|
||||
const float ss = versor->s * versor->s;
|
||||
const float xx = versor->x * versor->x;
|
||||
const float yy = versor->y * versor->y;
|
||||
const float zz = versor->z * versor->z;
|
||||
|
||||
const float sx = versor->s * versor->x;
|
||||
const float sy = versor->s * versor->y;
|
||||
const float sz = versor->s * versor->z;
|
||||
|
||||
const float xy = versor->x * versor->y;
|
||||
const float xz = versor->x * versor->z;
|
||||
|
||||
const float yz = versor->y * versor->z;
|
||||
|
||||
matrix->r1c1 = ((ss + xx) - (yy + zz));
|
||||
matrix->r2c2 = ((ss + yy) - (xx + zz));
|
||||
matrix->r3c3 = ((ss + zz) - (xx + yy));
|
||||
|
||||
matrix->r1c2 = 2.0f * (xy - sz);
|
||||
matrix->r2c3 = 2.0f * (yz - sx);
|
||||
matrix->r3c1 = 2.0f * (xz - sy);
|
||||
|
||||
matrix->r2c1 = 2.0f * (xy + sz);
|
||||
matrix->r3c2 = 2.0f * (yz + sx);
|
||||
matrix->r1c3 = 2.0f * (xz + sy);
|
||||
}
|
||||
|
||||
inline void _bgc_fp64_versor_get_rotation_matrix(BGC_FP64_Matrix3x3* const matrix, const BGC_FP64_Quaternion* const versor)
|
||||
{
|
||||
const double ss = versor->s * versor->s;
|
||||
const double xx = versor->x * versor->x;
|
||||
const double yy = versor->y * versor->y;
|
||||
const double zz = versor->z * versor->z;
|
||||
|
||||
const double sx = versor->s * versor->x;
|
||||
const double sy = versor->s * versor->y;
|
||||
const double sz = versor->s * versor->z;
|
||||
|
||||
const double xy = versor->x * versor->y;
|
||||
const double xz = versor->x * versor->z;
|
||||
|
||||
const double yz = versor->y * versor->z;
|
||||
|
||||
matrix->r1c1 = ((ss + xx) - (yy + zz));
|
||||
matrix->r2c2 = ((ss + yy) - (xx + zz));
|
||||
matrix->r3c3 = ((ss + zz) - (xx + yy));
|
||||
|
||||
matrix->r1c2 = 2.0 * (xy - sz);
|
||||
matrix->r2c3 = 2.0 * (yz - sx);
|
||||
matrix->r3c1 = 2.0 * (xz - sy);
|
||||
|
||||
matrix->r2c1 = 2.0 * (xy + sz);
|
||||
matrix->r3c2 = 2.0 * (yz + sx);
|
||||
matrix->r1c3 = 2.0 * (xz + sy);
|
||||
}
|
||||
|
||||
// ========= Get Versor Reverse Matrix ========== //
|
||||
|
||||
inline void _bgc_fp32_versor_get_reverse_matrix(BGC_FP32_Matrix3x3* const matrix, const BGC_FP32_Quaternion* const versor)
|
||||
{
|
||||
const float ss = versor->s * versor->s;
|
||||
const float xx = versor->x * versor->x;
|
||||
const float yy = versor->y * versor->y;
|
||||
const float zz = versor->z * versor->z;
|
||||
|
||||
const float sx = versor->s * versor->x;
|
||||
const float sy = versor->s * versor->y;
|
||||
const float sz = versor->s * versor->z;
|
||||
|
||||
const float xy = versor->x * versor->y;
|
||||
const float xz = versor->x * versor->z;
|
||||
|
||||
const float yz = versor->y * versor->z;
|
||||
|
||||
matrix->r1c1 = ((ss + xx) - (yy + zz));
|
||||
matrix->r2c2 = ((ss + yy) - (xx + zz));
|
||||
matrix->r3c3 = ((ss + zz) - (xx + yy));
|
||||
|
||||
matrix->r1c2 = 2.0f * (xy + sz);
|
||||
matrix->r2c3 = 2.0f * (yz + sx);
|
||||
matrix->r3c1 = 2.0f * (xz + sy);
|
||||
|
||||
matrix->r2c1 = 2.0f * (xy - sz);
|
||||
matrix->r3c2 = 2.0f * (yz - sx);
|
||||
matrix->r1c3 = 2.0f * (xz - sy);
|
||||
}
|
||||
|
||||
inline void _bgc_fp64_versor_get_reverse_matrix(BGC_FP64_Matrix3x3* const matrix, const BGC_FP64_Quaternion* const versor)
|
||||
{
|
||||
const double ss = versor->s * versor->s;
|
||||
const double xx = versor->x * versor->x;
|
||||
const double yy = versor->y * versor->y;
|
||||
const double zz = versor->z * versor->z;
|
||||
|
||||
const double sx = versor->s * versor->x;
|
||||
const double sy = versor->s * versor->y;
|
||||
const double sz = versor->s * versor->z;
|
||||
|
||||
const double xy = versor->x * versor->y;
|
||||
const double xz = versor->x * versor->z;
|
||||
|
||||
const double yz = versor->y * versor->z;
|
||||
|
||||
matrix->r1c1 = ((ss + xx) - (yy + zz));
|
||||
matrix->r2c2 = ((ss + yy) - (xx + zz));
|
||||
matrix->r3c3 = ((ss + zz) - (xx + yy));
|
||||
|
||||
matrix->r1c2 = 2.0 * (xy + sz);
|
||||
matrix->r2c3 = 2.0 * (yz + sx);
|
||||
matrix->r3c1 = 2.0 * (xz + sy);
|
||||
|
||||
matrix->r2c1 = 2.0 * (xy - sz);
|
||||
matrix->r3c2 = 2.0 * (yz - sx);
|
||||
matrix->r1c3 = 2.0 * (xz - sy);
|
||||
}
|
||||
|
||||
// ============ Get Rotation Matrix ============= //
|
||||
|
||||
inline int bgc_fp32_quaternion_get_rotation_matrix(BGC_FP32_Matrix3x3* const rotation, const BGC_FP32_Quaternion* const quaternion)
|
||||
{
|
||||
const float ss = quaternion->s * quaternion->s;
|
||||
const float xx = quaternion->x * quaternion->x;
|
||||
const float yy = quaternion->y * quaternion->y;
|
||||
const float zz = quaternion->z * quaternion->z;
|
||||
int bgc_fp32_quaternion_get_rotation_matrix(BGC_FP32_Matrix3x3* const rotation, const BGC_FP32_Quaternion* const quaternion);
|
||||
int bgc_fp64_quaternion_get_rotation_matrix(BGC_FP64_Matrix3x3* const rotation, const BGC_FP64_Quaternion* const quaternion);
|
||||
|
||||
const float square_modulus = (ss + xx) + (yy + zz);
|
||||
// ============ Set Rotation Matrix ============= //
|
||||
|
||||
if (square_modulus <= BGC_FP32_SQUARE_EPSILON || isnan(square_modulus))
|
||||
{
|
||||
bgc_fp32_matrix3x3_make_identity(rotation);
|
||||
return BGC_FAILURE;
|
||||
}
|
||||
|
||||
const float corrector1 = 1.0f / square_modulus;
|
||||
|
||||
const float sx = quaternion->s * quaternion->x;
|
||||
const float sy = quaternion->s * quaternion->y;
|
||||
const float sz = quaternion->s * quaternion->z;
|
||||
const float xy = quaternion->x * quaternion->y;
|
||||
const float xz = quaternion->x * quaternion->z;
|
||||
const float yz = quaternion->y * quaternion->z;
|
||||
|
||||
const float corrector2 = 2.0f * corrector1;
|
||||
|
||||
rotation->r1c1 = corrector1 * ((ss + xx) - (yy + zz));
|
||||
rotation->r2c2 = corrector1 * ((ss + yy) - (xx + zz));
|
||||
rotation->r3c3 = corrector1 * ((ss + zz) - (xx + yy));
|
||||
|
||||
rotation->r1c2 = corrector2 * (xy - sz);
|
||||
rotation->r2c3 = corrector2 * (yz - sx);
|
||||
rotation->r3c1 = corrector2 * (xz - sy);
|
||||
|
||||
rotation->r2c1 = corrector2 * (xy + sz);
|
||||
rotation->r3c2 = corrector2 * (yz + sx);
|
||||
rotation->r1c3 = corrector2 * (xz + sy);
|
||||
|
||||
return BGC_SUCCESS;
|
||||
}
|
||||
|
||||
inline int bgc_fp64_quaternion_get_rotation_matrix(BGC_FP64_Matrix3x3* const rotation, const BGC_FP64_Quaternion* const quaternion)
|
||||
{
|
||||
const double ss = quaternion->s * quaternion->s;
|
||||
const double xx = quaternion->x * quaternion->x;
|
||||
const double yy = quaternion->y * quaternion->y;
|
||||
const double zz = quaternion->z * quaternion->z;
|
||||
|
||||
const double square_modulus = (ss + xx) + (yy + zz);
|
||||
|
||||
if (square_modulus <= BGC_FP64_SQUARE_EPSILON || isnan(square_modulus))
|
||||
{
|
||||
bgc_fp64_matrix3x3_make_identity(rotation);
|
||||
return BGC_FAILURE;
|
||||
}
|
||||
|
||||
const double corrector1 = 1.0f / square_modulus;
|
||||
|
||||
const double sx = quaternion->s * quaternion->x;
|
||||
const double sy = quaternion->s * quaternion->y;
|
||||
const double sz = quaternion->s * quaternion->z;
|
||||
const double xy = quaternion->x * quaternion->y;
|
||||
const double xz = quaternion->x * quaternion->z;
|
||||
const double yz = quaternion->y * quaternion->z;
|
||||
|
||||
const double corrector2 = 2.0f * corrector1;
|
||||
|
||||
rotation->r1c1 = corrector1 * ((ss + xx) - (yy + zz));
|
||||
rotation->r2c2 = corrector1 * ((ss + yy) - (xx + zz));
|
||||
rotation->r3c3 = corrector1 * ((ss + zz) - (xx + yy));
|
||||
|
||||
rotation->r1c2 = corrector2 * (xy - sz);
|
||||
rotation->r2c3 = corrector2 * (yz - sx);
|
||||
rotation->r3c1 = corrector2 * (xz - sy);
|
||||
|
||||
rotation->r2c1 = corrector2 * (xy + sz);
|
||||
rotation->r3c2 = corrector2 * (yz + sx);
|
||||
rotation->r1c3 = corrector2 * (xz + sy);
|
||||
|
||||
return BGC_SUCCESS;
|
||||
}
|
||||
int bgc_fp32_quaternion_set_rotation_matrix(BGC_FP32_Quaternion* const quaternion, const BGC_FP32_Matrix3x3* const matrix);
|
||||
int bgc_fp64_quaternion_set_rotation_matrix(BGC_FP64_Quaternion* const quaternion, const BGC_FP64_Matrix3x3* const matrix);
|
||||
|
||||
// ============= Get Reverse Matrix ============= //
|
||||
|
||||
inline int bgc_fp32_quaternion_get_reverse_matrix(BGC_FP32_Matrix3x3* const reverse, const BGC_FP32_Quaternion* const quaternion)
|
||||
{
|
||||
const float ss = quaternion->s * quaternion->s;
|
||||
const float xx = quaternion->x * quaternion->x;
|
||||
const float yy = quaternion->y * quaternion->y;
|
||||
const float zz = quaternion->z * quaternion->z;
|
||||
|
||||
const float square_modulus = (ss + xx) + (yy + zz);
|
||||
|
||||
if (square_modulus <= BGC_FP32_SQUARE_EPSILON || isnan(square_modulus))
|
||||
{
|
||||
bgc_fp32_matrix3x3_make_identity(reverse);
|
||||
return BGC_FAILURE;
|
||||
}
|
||||
|
||||
const float corrector1 = 1.0f / square_modulus;
|
||||
|
||||
const float sx = quaternion->s * quaternion->x;
|
||||
const float sy = quaternion->s * quaternion->y;
|
||||
const float sz = quaternion->s * quaternion->z;
|
||||
const float xy = quaternion->x * quaternion->y;
|
||||
const float xz = quaternion->x * quaternion->z;
|
||||
const float yz = quaternion->y * quaternion->z;
|
||||
|
||||
const float corrector2 = 2.0f * corrector1;
|
||||
|
||||
reverse->r1c1 = corrector1 * ((ss + xx) - (yy + zz));
|
||||
reverse->r2c2 = corrector1 * ((ss + yy) - (xx + zz));
|
||||
reverse->r3c3 = corrector1 * ((ss + zz) - (xx + yy));
|
||||
|
||||
reverse->r1c2 = corrector2 * (xy + sz);
|
||||
reverse->r2c3 = corrector2 * (yz + sx);
|
||||
reverse->r3c1 = corrector2 * (xz + sy);
|
||||
|
||||
reverse->r2c1 = corrector2 * (xy - sz);
|
||||
reverse->r3c2 = corrector2 * (yz - sx);
|
||||
reverse->r1c3 = corrector2 * (xz - sy);
|
||||
|
||||
return BGC_SUCCESS;
|
||||
}
|
||||
|
||||
inline int bgc_fp64_quaternion_get_reverse_matrix(BGC_FP64_Matrix3x3* const reverse, const BGC_FP64_Quaternion* const quaternion)
|
||||
{
|
||||
const double ss = quaternion->s * quaternion->s;
|
||||
const double xx = quaternion->x * quaternion->x;
|
||||
const double yy = quaternion->y * quaternion->y;
|
||||
const double zz = quaternion->z * quaternion->z;
|
||||
|
||||
const double square_modulus = (ss + xx) + (yy + zz);
|
||||
|
||||
if (square_modulus <= BGC_FP64_SQUARE_EPSILON || isnan(square_modulus))
|
||||
{
|
||||
bgc_fp64_matrix3x3_make_identity(reverse);
|
||||
return BGC_FAILURE;
|
||||
}
|
||||
|
||||
const double corrector1 = 1.0f / square_modulus;
|
||||
|
||||
const double sx = quaternion->s * quaternion->x;
|
||||
const double sy = quaternion->s * quaternion->y;
|
||||
const double sz = quaternion->s * quaternion->z;
|
||||
const double xy = quaternion->x * quaternion->y;
|
||||
const double xz = quaternion->x * quaternion->z;
|
||||
const double yz = quaternion->y * quaternion->z;
|
||||
|
||||
const double corrector2 = 2.0f * corrector1;
|
||||
|
||||
reverse->r1c1 = corrector1 * ((ss + xx) - (yy + zz));
|
||||
reverse->r2c2 = corrector1 * ((ss + yy) - (xx + zz));
|
||||
reverse->r3c3 = corrector1 * ((ss + zz) - (xx + yy));
|
||||
|
||||
reverse->r1c2 = corrector2 * (xy + sz);
|
||||
reverse->r2c3 = corrector2 * (yz + sx);
|
||||
reverse->r3c1 = corrector2 * (xz + sy);
|
||||
|
||||
reverse->r2c1 = corrector2 * (xy - sz);
|
||||
reverse->r3c2 = corrector2 * (yz - sx);
|
||||
reverse->r1c3 = corrector2 * (xz - sy);
|
||||
|
||||
return BGC_SUCCESS;
|
||||
}
|
||||
int bgc_fp32_quaternion_get_reverse_matrix(BGC_FP32_Matrix3x3* const reverse, const BGC_FP32_Quaternion* const quaternion);
|
||||
int bgc_fp64_quaternion_get_reverse_matrix(BGC_FP64_Matrix3x3* const reverse, const BGC_FP64_Quaternion* const quaternion);
|
||||
|
||||
// ============= Get Both Matrixes ============== //
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue