This complete what is needed for the definition of Vector2, Vector3, and Vector4. This required a trigonometry section, fleshing out the rest of the Number, ToNumber, and FromNumber section, correctly defining all the available function for the Real trait, and defining several constants.
359 lines
8.9 KiB
Rust
359 lines
8.9 KiB
Rust
extern crate sigils;
|
|
|
|
use std::ops::{Add, Sub, Mul, Div, Rem};
|
|
use sigils::vector::*;
|
|
|
|
|
|
#[test]
|
|
fn vector_creation()
|
|
{
|
|
let v: Vector3<f32> = Vector3::<f32>::from_value(1.0f32);
|
|
|
|
assert_eq!(v.x, 1.0f32);
|
|
}
|
|
|
|
#[test]
|
|
fn vector_add()
|
|
{
|
|
let v: Vector3<f32> = Vector3::<f32>::from_value(1.0f32);
|
|
|
|
let v_two: Vector3<f32> = Vector3::<f32>::from_value(4.0f32);
|
|
let scalar: f32 = 4.0f32;
|
|
|
|
let v_three = v.add(&v_two);
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v.add(v_two);
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v + &v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v + v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v + &v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v + v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v + 4.0f32;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v + 4.0f32;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v + scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v + scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v + &scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v + &scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
}
|
|
|
|
#[test]
|
|
fn vector_sub()
|
|
{
|
|
let v: Vector3<f32> = Vector3::<f32>::from_value(9.0f32);
|
|
|
|
let v_two: Vector3<f32> = Vector3::<f32>::from_value(4.0f32);
|
|
let scalar: f32 = 4.0f32;
|
|
|
|
let v_three = v.sub(&v_two);
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v.sub(v_two);
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v - &v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v - v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v - &v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v - v_two;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v - 4.0f32;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v - 4.0f32;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v - scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v - scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = &v - &scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
|
|
let v_three = v - &scalar;
|
|
assert_eq!(v_three.x, 5.0f32);
|
|
assert_eq!(v_three.y, 5.0f32);
|
|
assert_eq!(v_three.z, 5.0f32);
|
|
}
|
|
|
|
#[test]
|
|
fn vector_mul()
|
|
{
|
|
let v: Vector3<f32> = Vector3::<f32>::from_value(3.0f32);
|
|
|
|
let v_two: Vector3<f32> = Vector3::<f32>::from_value(5.0f32);
|
|
let scalar: f32 = 5.0f32;
|
|
|
|
let v_three = v.mul(&v_two);
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = v.mul(v_two);
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = v * &v_two;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = v * v_two;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = &v * &v_two;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = &v * v_two;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = &v * 5.0f32;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = v * 5.0f32;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = &v * scalar;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = v * scalar;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = &v * &scalar;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
|
|
let v_three = v * &scalar;
|
|
assert_eq!(v_three.x, 15.0f32);
|
|
assert_eq!(v_three.y, 15.0f32);
|
|
assert_eq!(v_three.z, 15.0f32);
|
|
}
|
|
|
|
#[test]
|
|
fn vector_div()
|
|
{
|
|
let v: Vector3<f32> = Vector3::<f32>::from_value(15.0f32);
|
|
|
|
let v_two: Vector3<f32> = Vector3::<f32>::from_value(5.0f32);
|
|
let scalar: f32 = 5.0f32;
|
|
|
|
let v_three = v.div(&v_two);
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v.div(v_two);
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v / &v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v / v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v / &v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v / v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v / 5.0f32;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v / 5.0f32;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v / scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v / scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v / &scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v / &scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
}
|
|
|
|
#[test]
|
|
fn vector_rem()
|
|
{
|
|
let v: Vector3<f32> = Vector3::<f32>::from_value(15.0f32);
|
|
|
|
let v_two: Vector3<f32> = Vector3::<f32>::from_value(6.0f32);
|
|
let scalar: f32 = 6.0f32;
|
|
|
|
let v_three = v.rem(&v_two);
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v.rem(v_two);
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v % &v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v % v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v % &v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v % v_two;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v % 6.0f32;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v % 6.0f32;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v % scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v % scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = &v % &scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
|
|
let v_three = v % &scalar;
|
|
assert_eq!(v_three.x, 3.0f32);
|
|
assert_eq!(v_three.y, 3.0f32);
|
|
assert_eq!(v_three.z, 3.0f32);
|
|
}
|