Полезная математика

1. Приближенное значение синуса угла

Приближенное значение синуса

const float PI = 3.14159265358979323846264338327950288f;

const float PI_SQR = 9.86960440108935861883449099987615114f;

const float B = 4/PI;

const float C = -4/(PI_SQR);

float sin_approx( float x ){

    return B * x + C * x * abs(x);

}

2. Приближенное значение арккосинуса

Приближенное значение арккосинуса

float acos_approx( float x ){

    return sqrt(1-x)*(1.5707963267948966192313216916398f + x*(-0.213300989f + x*(0.077980478f + x*-0.02164095f)));

}

3. Приближенное значение квадратного корня (в действительности, степени -2)

Обратный корень квадратный

float InvSqrt (float x){ 

  union{  

    int32_t i;  

    float   f; 

  } conv; 

  conv.f = x; 

  conv.i = 0x5f3759df - (conv.i >> 1); 

  return 0.5f * conv.f * (3.0f - x * conv.f * conv.f);

4. Преобразование кватерниона положения в углы Эйлера

Кватернион в углы Эйлера

void quat_2_euler( float q[4], float e[3] ){

   float sqw = q[0]*q[0];

   float sqx = q[1]*q[1];

   float sqy = q[2]*q[2];

   float sqz = q[3]*q[3];

   e[2] = atan2f(2.f * (q[1]*q[2] + q[3]*q[0]), sqx - sqy - sqz + sqw);

   e[1] = asinf(-2.f * (q[1]*q[3] - q[2]*q[0]));

   e[0] = atan2f(2.f * (q[2]*q[3] + q[1]*q[0]), -sqx - sqy + sqz + sqw);

}