예제 #1
0
파일: matrix3.cpp 프로젝트: Maigo/gea
//note: euler conversion math based on notes from
// http://www.euclideanspace.com/maths/geometry/rotations/euler/index.htm
// rotation matrix is constructed according to:
// R = ([Ry(heading)][Rz(attitude)])[Rx(bank)]
void matrix3::from_euler(const float heading, const float attitude, const float bank) {
    float sin_heading, cos_heading, sin_attitude, cos_attitude, sin_bank, cos_bank;
    fsincos(heading, sin_heading, cos_heading);
    fsincos(attitude, sin_attitude, cos_attitude);
    fsincos(bank, sin_bank, cos_bank);

    m[0][0] =  cos_heading * cos_attitude; m[0][1] = sin_heading * sin_bank - cos_heading * sin_attitude * cos_bank; m[0][2] = cos_heading * sin_attitude * sin_bank + sin_heading * cos_bank;
    m[1][0] =  sin_attitude;               m[1][1] = cos_attitude * cos_bank;                                        m[1][2] =-cos_attitude * sin_bank;
    m[2][0] = -sin_heading * cos_attitude; m[2][1] = sin_heading * sin_attitude * cos_bank + cos_heading * sin_bank; m[2][2] =-sin_heading * sin_attitude * sin_bank + cos_heading * cos_bank;
}
예제 #2
0
파일: matrix3.cpp 프로젝트: Maigo/gea
void matrix3::from_rotation(const float angle, const vector3& axis) {
    float sin_angle, cos_angle;
    fsincos(angle, sin_angle, cos_angle);

    const vector3 axis2 = axis * axis;
    const float l2 = (axis2.x * axis2.x) + (axis2.y * axis2.y) + (axis2.z * axis2.z);
    const float l2_sqrt = sqrtf(l2);

    if (approx_ne(l2, 0.f)) {
        m[0][0] = (axis2.x + (axis2.y + axis2.z) * cos_angle) / l2;
        m[0][1] = (axis.x * axis.y * (1 - cos_angle) - axis.z * l2_sqrt * sin_angle) / l2;
        m[0][2] = (axis.x * axis.z * (1 - cos_angle) + axis.y * l2_sqrt * sin_angle) / l2;

        m[1][0] = (axis.x * axis.y * (1 - cos_angle) + axis.z * l2_sqrt * sin_angle) / l2;
        m[1][1] = (axis2.y + (axis2.x + axis2.z) * cos_angle) / l2;
        m[1][2] = (axis.y * axis.z * (1 - cos_angle) - axis.x * l2_sqrt * sin_angle) / l2;

        m[2][0] = (axis.x * axis.z * (1 - cos_angle) - axis.y * l2_sqrt * sin_angle) / l2;
        m[2][1] = (axis.y * axis.z * (1 - cos_angle) + axis.x * l2_sqrt * sin_angle) / l2;
        m[2][2] = (axis2.z + (axis2.x + axis2.y) * cos_angle) / l2;
    }
    else {
        (*this) = matrix3(mth::IDENTITY_INITIALIZATION);
    }
}
예제 #3
0
static void filter_shelf_coefs(unsigned long cutoff, float A, bool low, int32_t *c){
    int32_t sin, cos;
    int32_t b0, b1, a0, a1; /* s3.28 */
    const long g = integerGain(TXSqrtApprox(A)) << 4; /* 10^(db/40), s3.28 */
    
    sin = fsincos(cutoff/2, &cos);
    if (low) {
        const int32_t sin_div_g = DIV64(sin, g, 25);
        cos >>= 3;
        b0 = FRACMUL(sin, g) + cos;   /* 0.25 .. 4.10 */
        b1 = FRACMUL(sin, g) - cos;   /* -1 .. 3.98 */
        a0 = sin_div_g + cos;         /* 0.25 .. 4.10 */
        a1 = sin_div_g - cos;         /* -1 .. 3.98 */
    } else {
예제 #4
0
int fcos(floatx80 &a, float_status_t &status)
{
    return fsincos(a, 0, &a, status);
}