lina 0.2.2

Linear algebra library with a focus on 3D applications like games (i.e. low-dimensional vectors and matrices)
Documentation
use crate::{Point, Point3f, Vec2, Vec3, Vec3f, point2, point3, vec2, vec3, Vector};

#[test]
fn add_point_vec() {
    assert_eq!(point2(1, 2) + vec2(3, 5), point2(4, 7));
    assert_eq!(point3(1, 2, 3) + vec3(3, 5, 7), point3(4, 7, 10));

    let mut x = point2(1.0, 2.0);
    x += vec2(3.0, 5.0);
    assert_eq!(x, point2(4.0, 7.0));

    let mut x = point3(1.0, 2.0, 3.0);
    x += vec3(3.0, 5.0, 7.0);
    assert_eq!(x, point3(4.0, 7.0, 10.0));
}

#[test]
fn add_vec_vec() {
    assert_eq!(vec2(1, 2) + vec2(3, 5), vec2(4, 7));
    assert_eq!(vec3(1, 2, 3) + vec3(3, 5, 7), vec3(4, 7, 10));

    let mut x = vec2(1.0, 2.0);
    x += vec2(3.0, 5.0);
    assert_eq!(x, vec2(4.0, 7.0));

    let mut x = vec3(1.0, 2.0, 3.0);
    x += vec3(3.0, 5.0, 7.0);
    assert_eq!(x, vec3(4.0, 7.0, 10.0));
}

#[test]
fn sub_point_vec() {
    assert_eq!(point2(4, 7) - vec2(3, 5), point2(1, 2));
    assert_eq!(point3(4, 7, 10) - vec3(3, 5, 7), point3(1, 2, 3));

    let mut x = point2(4.0, 7.0);
    x -= vec2(3.0, 5.0);
    assert_eq!(x, point2(1.0, 2.0));

    let mut x = point3(4.0, 7.0, 10.0);
    x -= vec3(3.0, 5.0, 7.0);
    assert_eq!(x, point3(1.0, 2.0, 3.0));
}

#[test]
fn sub_vec_vec() {
    assert_eq!(vec2(4, 7) - vec2(3, 5), vec2(1, 2));
    assert_eq!(vec3(4, 7, 10) - vec3(3, 5, 7), vec3(1, 2, 3));

    let mut x = vec2(4.0, 7.0);
    x -= vec2(3.0, 5.0);
    assert_eq!(x, vec2(1.0, 2.0));

    let mut x = vec3(4.0, 7.0, 10.0);
    x -= vec3(3.0, 5.0, 7.0);
    assert_eq!(x, vec3(1.0, 2.0, 3.0));
}

#[test]
fn sub_point_point() {
    assert_eq!(point2(4, 7) - point2(3, 5), vec2(1, 2));
    assert_eq!(point3(4, 7, 10) - point3(3, 5, 7), vec3(1, 2, 3));
}

#[test]
fn mul() {
    assert_eq!(vec2(1, 2) * 3, vec2(3, 6));
    assert_eq!(vec3(1, 2, 3) * 3, vec3(3, 6, 9));

    assert_eq!(3.0 * vec2(1.0, 2.0), vec2(3.0, 6.0));
    assert_eq!(3 * vec2(1, 2), vec2(3, 6));
    assert_eq!(3 * vec3(1, 2, 3), vec3(3, 6, 9));

    let mut x = vec3(0.1, 0.2, 0.3);
    x *= 10.0;
    assert_eq!(x, vec3(1.0, 2.0, 3.0));
}

#[test]
fn div() {
    assert_eq!(vec2(3, 6) / 3, vec2(1, 2));
    assert_eq!(vec3(3, 6, 9) / 3, vec3(1, 2, 3));

    let mut x = vec3(1.0, 2.0, 3.0);
    x /= 10.0;
    assert_eq!(x, vec3(0.1, 0.2, 0.3));
}

#[test]
fn neg() {
    assert_eq!(-vec2(9.0, -4.3), vec2(-9.0, 4.3));
}

#[test]
fn centroid() {
    assert_eq!(Point3f::centroid([]), None::<Point3f>);
    assert_eq!(Point::centroid([point2(3.5, 1.0)]), Some(point2(3.5, 1.0)));
    assert_eq!(Point::centroid([point2(0.0, 0.0), point2(4.0, 8.0)]), Some(point2(2.0, 4.0)));
    assert_eq!(
        Point::centroid([point2(-1.0, 9.0), point2(2.0, 0.0), point2(8.0, 3.0)]),
        Some(point2(3.0, 4.0)),
    );
}

#[test]
fn vector_iter_sum() {
    assert_eq!(<Vec<Vec3f>>::new().into_iter().sum::<Vec3f>(), vec3(0.0, 0.0, 0.0));
    assert_eq!(vec![vec3(3, 4, 5)].into_iter().sum::<Vec3<i32>>(), vec3(3, 4, 5));
    assert_eq!(vec![vec2(1, 3), vec2(5, 2)].into_iter().sum::<Vec2<i32>>(), vec2(6, 5));
}

#[test]
fn truncate() {
    assert_eq!(<Point<_, 2>>::from([1, 2]).truncate(), Point::from([1]));
    assert_eq!(<Point<_, 3>>::from([1, 2, 3]).truncate(), Point::from([1, 2]));
    assert_eq!(<Point<_, 4>>::from([1, 2, 3, 4]).truncate(), Point::from([1, 2, 3]));

    assert_eq!(<Vector<_, 2>>::from([1, 2]).truncate(), Vector::from([1]));
    assert_eq!(<Vector<_, 3>>::from([1, 2, 3]).truncate(), Vector::from([1, 2]));
    assert_eq!(<Vector<_, 4>>::from([1, 2, 3, 4]).truncate(), Vector::from([1, 2, 3]));
}

#[test]
fn extend() {
    assert_eq!(<Point<_, 1>>::from([1]).extend(2), Point::from([1, 2]));
    assert_eq!(<Point<_, 2>>::from([1, 2]).extend(3), Point::from([1, 2, 3]));
    assert_eq!(<Point<_, 3>>::from([1, 2, 3]).extend(4), Point::from([1, 2, 3, 4]));

    assert_eq!(<Vector<_, 1>>::from([1]).extend(2), Vector::from([1, 2]));
    assert_eq!(<Vector<_, 2>>::from([1, 2]).extend(3), Vector::from([1, 2, 3]));
    assert_eq!(<Vector<_, 3>>::from([1, 2, 3]).extend(4), Vector::from([1, 2, 3, 4]));
}