rustool 0.3.20

Personal toolbox for my Rust projects
Documentation
use itertools::multizip;
use tool::{direct_angle, List, Vector, Vectors};

#[test]
fn compute_distances() {
    let vectors = Vectors::from_column_slice(&[1.0, 0.0, 0.0, 0.0, 1.0, 1.0]);
    let expected_distances = List::from_column_slice(&[1.0, 2.0f64.sqrt()]);

    let distances = tool::magnitudes(&vectors);

    for (distance, expected_distance) in multizip((distances.iter(), expected_distances.iter())) {
        assert!(relative_eq!(
            distance,
            expected_distance,
            epsilon = f64::EPSILON
        ));
    }
}

#[test]
fn compute_directions() {
    let vectors = Vectors::from_column_slice(&[1.0, 0.0, 0.0, 0.0, 1.0, 1.0]);
    let expected_directions =
        Vectors::from_column_slice(&[1.0, 0.0, 0.0, 0.0, 1.0 / 2.0f64.sqrt(), 1.0 / 2.0f64.sqrt()]);

    let directions = tool::units(&vectors);

    for (direction_projection, expected_direction_projection) in
        multizip((directions.iter(), expected_directions.iter()))
    {
        assert!(relative_eq!(
            direction_projection,
            expected_direction_projection,
            epsilon = f64::EPSILON
        ));
    }
}

#[test]
fn dotproduct() {
    let vectors_1 = Vectors::from_column_slice(&[1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0]);
    let vectors_2 = Vectors::from_column_slice(&[1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0]);
    let expected_dot_products = List::from_column_slice(&[1.0, 1.0, 0.0]);
    let dot_products = tool::dot_products(&vectors_1, &vectors_2);

    for (dot_product, expected_dot_product) in
        multizip((dot_products.iter(), expected_dot_products.iter()))
    {
        assert!(relative_eq!(
            dot_product,
            expected_dot_product,
            epsilon = f64::EPSILON
        ));
    }
}

#[test]
fn projection_vector() {
    let vector_1 = Vector::new(2.0, 2.0, 0.0);
    let vector_2 = Vector::new(0.0, 1.0, 0.0);
    let expected_vector = Vector::new(0.0, 2.0, 0.0);
    let vector = tool::projection_vector(&vector_1, &vector_2);

    for (component, expected_component) in multizip((vector.iter(), expected_vector.iter())) {
        assert!(relative_eq!(
            component,
            expected_component,
            epsilon = f64::EPSILON
        ));
    }
}

#[test]
fn projection_plane() {
    let vector_1 = Vector::new(1.0, 1.0, 1.0);
    let vector_2 = Vector::new(0.0, 0.0, 1.0);
    let expected_vector = Vector::new(1.0, 1.0, 0.0);
    let vector = tool::projection_plane(&vector_1, &vector_2);

    for (component, expected_component) in multizip((vector.iter(), expected_vector.iter())) {
        assert!(relative_eq!(
            component,
            expected_component,
            epsilon = f64::EPSILON
        ));
    }
}

#[test]
fn test_direct_angle_positive() {
    let v1 = Vector::new(1.0, 0.0, 0.0);
    let v2 = Vector::new(1.0, 1.0, 0.0);
    let up = Vector::new(0.0, 0.0, 1.0);
    let ang = direct_angle(&v1, &v2, &up);
    assert!(relative_eq!(
        ang,
        0.7853981633974484,
        epsilon = f64::EPSILON
    ));
}

#[test]
fn test_direct_angle_negative() {
    let v1 = Vector::new(1.0, 0.0, 0.0);
    let v2 = Vector::new(1.0, -1.0, 0.0);
    let up = Vector::new(0.0, 0.0, 1.0);
    let ang = direct_angle(&v1, &v2, &up);
    assert!(relative_eq!(ang, 5.497787143782138, epsilon = f64::EPSILON));
}