oxide_math 0.0.1

Math library for Oxide
Documentation
#[cfg(test)]
mod test {
    use crate::quaternion::*;
    use crate::vector::*;
    use crate::vector3::Vector3;

    #[test]
    fn test_set_identity() {
        let id = make_identity();
        let mut q = Quaternion {
            x: 3.0,
            y: 2.0,
            z: 1.0,
            w: 0.0,
        };
        q.set_identity();
        assert_eq!(id, q);
    }

    #[test]
    fn test_make_identity() {
        let id = make_identity();
        let idq: Quaternion = Quaternion {
            x: 0.0,
            y: 0.0,
            z: 0.0,
            w: 1.0,
        };
        assert_eq!(id, idq);
    }

    #[test]
    fn test_get_scalar_part() {
        let q = Quaternion {
            x: 2.0,
            y: 1.0,
            z: 0.0,
            w: 3.0,
        };
        assert_approx_eq!(q.get_scalar_part(), 3.0);
    }

    #[test]
    fn test_get_vector_part() {
        let id = make_identity();
        let zero_vector = Vector3 {
            x: 0.0,
            y: 0.0,
            z: 0.0,
        };
        assert_eq!(id.get_vector_part(), zero_vector);
    }

    #[test]
    fn test_add() {
        let a: Quaternion = Quaternion {
            x: 0.0,
            y: 0.0,
            z: 0.0,
            w: 1.0,
        };
        let b: Quaternion = Quaternion {
            x: 1.0,
            y: 1.0,
            z: 1.0,
            w: 0.0,
        };
        assert_eq!(
            a + b,
            Quaternion {
                x: 1.0,
                y: 1.0,
                z: 1.0,
                w: 1.0,
            }
        );
    }

    #[test]
    fn test_scale() {
        let q: Quaternion = Quaternion {
            x: 2.0,
            y: 3.0,
            z: 4.0,
            w: 1.0,
        };
        let t = 2.0f32;
        let result: Quaternion = Quaternion {
            x: 4.0,
            y: 6.0,
            z: 8.0,
            w: 2.0,
        };
        assert_eq!(q.scale(t), result);
    }

    #[test]
    fn test_mul() {
        let a = Quaternion {
            x: 2.0,
            y: -1.0,
            z: -3.0,
            w: 1.0,
        };
        let b = Quaternion {
            x: 3.0,
            y: -2.0,
            z: 4.0,
            w: -1.0,
        };
        let result = Quaternion {
            x: -9.0,
            y: -18.0,
            z: 6.0,
            w: 3.0,
        };
        assert_eq!(a * b, result);
    }

    #[test]
    fn test_dot() {
        let a = Quaternion {
            x: 2.0,
            y: -1.0,
            z: -3.0,
            w: 1.0,
        };
        let b = Quaternion {
            x: 3.0,
            y: -2.0,
            z: 4.0,
            w: -1.0,
        };
        assert_approx_eq!(dot(a, b), -1.0 + -4.0)
    }

    #[test]
    fn test_inverse() {
        let q = Quaternion {
            x: -3.0,
            y: 2.0,
            z: -6.0,
            w: 2.0,
        };
        let a = inverse(q);
        assert_approx_eq!(a.x, -3.0 / (53.0f32.sqrt()));
        assert_approx_eq!(a.y, 2.0 / (53.0f32.sqrt()));
        assert_approx_eq!(a.z, -6.0 / (53.0f32.sqrt()));
        assert_approx_eq!(a.w, 2.0 / (53.0f32.sqrt()));
    }

    #[test]
    fn test_conj() {
        let q = Quaternion {
            x: 2.0,
            y: 3.0,
            z: 4.0,
            w: 1.0,
        };
        let t = Quaternion {
            x: -2.0,
            y: -3.0,
            z: -4.0,
            w: 1.0,
        };
        assert_eq!(conjugate(q), t);
    }

    #[test]
    fn test_from_euler_angle() {
        let q = from_euler_angles(
            ::std::f32::consts::FRAC_PI_6,
            ::std::f32::consts::FRAC_PI_3,
            ::std::f32::consts::FRAC_PI_2,
        );
        assert_approx_eq!(q.x, -0.1830127);
        assert_approx_eq!(q.y, 0.5);
        assert_approx_eq!(q.z, 0.5);
        assert_approx_eq!(q.w, 0.6830127);
    }

    #[test]
    fn test_from_axis_angle() {
        let axis = Vector3 {
            x: 3.0,
            y: 2.0,
            z: 1.0,
        };
        let q = from_axis_angle(axis.normalize(), ::std::f32::consts::FRAC_PI_3);
        assert_approx_eq!(q.x, 0.4008919);
        assert_approx_eq!(q.y, 0.2672612);
        assert_approx_eq!(q.z, 0.1336306);
        assert_approx_eq!(q.w, 0.8660254);
    }

    #[test]
    fn test_get_axis_angle() {
        let q = Quaternion {
            x: 0.4008919,
            y: 0.2672612,
            z: 0.1336306,
            w: 0.8660254,
        };
        let (axis, angle) = get_axis_angle(q);
        assert_approx_eq!(axis.x, 3.0 / (14.0f32).sqrt());
        assert_approx_eq!(axis.y, (2.0 / 7.0f32).sqrt());
        assert_approx_eq!(axis.z, 1.0 / (14.0f32).sqrt());
        assert_approx_eq!(angle, ::std::f32::consts::FRAC_PI_3);
    }

    #[test]
    fn test_get_axis_angle_over_pi() {
        let q = Quaternion {
            x: 0.4008919,
            y: 0.2672612,
            z: 0.1336306,
            w: -0.1,
        };
        let (axis, angle) = get_axis_angle(q);
        assert_approx_eq!(axis.x, -(3.0 / (14.0f32).sqrt()));
        assert_approx_eq!(axis.y, -((2.0 / 7.0f32).sqrt()));
        assert_approx_eq!(axis.z, -(1.0 / (14.0f32).sqrt()));
        assert_approx_eq!(angle, 2.941257);
    }

    #[test]
    fn test_rotate_vector() {
        let q = from_axis_angle(
            Vector3 {
                x: 0.0,
                y: 1.0,
                z: 0.0,
            },
            ::std::f32::consts::FRAC_PI_2,
        );
        let rotated = rotate(q, ::std::f32::consts::FRAC_PI_2);
        let result = from_axis_angle(
            Vector3 {
                x: 0.0,
                y: 1.0,
                z: 0.0,
            },
            ::std::f32::consts::PI,
        );
        assert_approx_eq!(rotated.x, result.x);
        assert_approx_eq!(rotated.y, result.y);
        assert_approx_eq!(rotated.z, result.z);
    }
}