Finished the Vector definition.

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.
This commit is contained in:
Jason Travis Smith
2015-10-09 13:02:54 -04:00
parent e410e69e2f
commit 7ae702fd5c
13 changed files with 3158 additions and 198 deletions

97
tests/constants.rs Normal file
View File

@ -0,0 +1,97 @@
extern crate sigils;
use std::{f32, f64};
use sigils::Constants;
#[test]
fn constant_check_f32()
{
let val: f32 = Constants::SQRT_2;
assert_eq!(val, f32::consts::SQRT_2);
let val: f32 = Constants::SQRT_3;
assert_eq!(val, 1.73205080756887729352f32);
let val: f32 = Constants::INVERSE_SQRT_2;
assert_eq!(val, 1.0f32 / f32::consts::SQRT_2);
let val: f32 = Constants::INVERSE_SQRT_3;
assert_eq!(val, 1.0f32 / 1.73205080756887729352f32);
let val: f32 = Constants::E;
assert_eq!(val, f32::consts::E);
let val: f32 = Constants::LOG2_E;
assert_eq!(val, f32::consts::LOG2_E);
let val: f32 = Constants::LOG10_E;
assert_eq!(val, f32::consts::LOG10_E);
let val: f32 = Constants::LOGE_2;
assert_eq!(val, 2f32.ln());
let val: f32 = Constants::LOGE_10;
assert_eq!(val, 10f32.ln());
let val: f32 = Constants::TWO_PI;
assert_eq!(val, 2f32 * f32::consts::PI);
let val: f32 = Constants::PI;
assert_eq!(val, f32::consts::PI);
let val: f32 = Constants::HALF_PI;
assert_eq!(val, f32::consts::PI / 2f32);
let val: f32 = Constants::THIRD_PI;
assert_eq!(val, f32::consts::PI / 3f32);
let val: f32 = Constants::QUARTER_PI;
assert_eq!(val, f32::consts::PI / 4f32);
let val: f32 = Constants::SIXTH_PI;
assert_eq!(val, f32::consts::PI / 6f32);
let val: f32 = Constants::EIGHTH_PI;
assert_eq!(val, f32::consts::PI / 8f32);
let val: f32 = Constants::INVERSE_PI;
assert_eq!(val, 1.0f32 / f32::consts::PI);
let val: f32 = Constants::TWO_INVERSE_PI;
assert_eq!(val, 2.0f32 / f32::consts::PI);
let val: f32 = Constants::TWO_INVERSE_SQRT_PI;
assert_eq!(val, 2.0f32 / (f32::consts::PI).sqrt());
}
#[test]
fn constant_check_f64()
{
let val: f64 = Constants::SQRT_2;
assert_eq!(val, f64::consts::SQRT_2);
let val: f64 = Constants::SQRT_3;
assert_eq!(val, 1.73205080756887729352f64);
let val: f64 = Constants::INVERSE_SQRT_2;
assert_eq!(val, 1.0f64 / f64::consts::SQRT_2);
let val: f64 = Constants::INVERSE_SQRT_3;
assert_eq!(val, 1.0f64 / 1.73205080756887729352f64);
let val: f64 = Constants::E;
assert_eq!(val, f64::consts::E);
let val: f64 = Constants::LOG2_E;
assert_eq!(val, f64::consts::LOG2_E);
let val: f64 = Constants::LOG10_E;
assert_eq!(val, f64::consts::LOG10_E);
let val: f64 = Constants::LOGE_2;
assert_eq!(val, 2f64.ln());
let val: f64 = Constants::LOGE_10;
assert_eq!(val, 10f64.ln());
let val: f64 = Constants::TWO_PI;
assert_eq!(val, 2f64 * f64::consts::PI);
let val: f64 = Constants::PI;
assert_eq!(val, f64::consts::PI);
let val: f64 = Constants::HALF_PI;
assert_eq!(val, f64::consts::PI / 2f64);
let val: f64 = Constants::THIRD_PI;
assert_eq!(val, f64::consts::PI / 3f64);
let val: f64 = Constants::QUARTER_PI;
assert_eq!(val, f64::consts::PI / 4f64);
let val: f64 = Constants::SIXTH_PI;
assert_eq!(val, f64::consts::PI / 6f64);
let val: f64 = Constants::EIGHTH_PI;
assert_eq!(val, f64::consts::PI / 8f64);
let val: f64 = Constants::INVERSE_PI;
assert_eq!(val, 1.0f64 / f64::consts::PI);
let val: f64 = Constants::TWO_INVERSE_PI;
assert_eq!(val, 2.0f64 / f64::consts::PI);
let val: f64 = Constants::TWO_INVERSE_SQRT_PI;
assert_eq!(val, 2.0f64 / (f64::consts::PI).sqrt());
}

View File

@ -1,3 +1,5 @@
extern crate sigils;
mod constants;
mod vector;

View File

@ -1,5 +1,6 @@
extern crate sigils;
use std::ops::{Add, Sub, Mul, Div, Rem};
use sigils::vector::*;
@ -10,3 +11,348 @@ fn vector_creation()
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);
}