2013-05-19 01:04:03 +08:00
|
|
|
#[test]
|
|
|
|
use core::num::{Zero, One};
|
|
|
|
#[test]
|
|
|
|
use core::rand::{random};
|
|
|
|
#[test]
|
|
|
|
use core::vec::{all, all2};
|
|
|
|
#[test]
|
2013-05-21 23:25:01 +08:00
|
|
|
use core::cmp::ApproxEq;
|
2013-05-19 01:04:03 +08:00
|
|
|
#[test]
|
|
|
|
use dim3::vec3::Vec3;
|
|
|
|
#[test]
|
|
|
|
use dim2::vec2::Vec2;
|
|
|
|
#[test]
|
|
|
|
use dim1::vec1::Vec1;
|
|
|
|
#[test]
|
|
|
|
use ndim::nvec::NVec;
|
|
|
|
#[test]
|
|
|
|
use traits::dim::d7;
|
|
|
|
#[test]
|
|
|
|
use traits::basis::Basis;
|
2013-05-19 05:56:03 +08:00
|
|
|
#[test]
|
|
|
|
use traits::cross::Cross;
|
|
|
|
#[test]
|
|
|
|
use traits::dot::Dot;
|
|
|
|
#[test]
|
|
|
|
use traits::norm::Norm;
|
|
|
|
|
2013-05-19 01:04:03 +08:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_cross_vec3()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v1 : Vec3<f64> = random();
|
|
|
|
let v2 : Vec3<f64> = random();
|
|
|
|
let v3 : Vec3<f64> = v1.cross(&v2);
|
|
|
|
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(v3.dot(&v2).approx_eq(&Zero::zero()));
|
|
|
|
assert!(v3.dot(&v1).approx_eq(&Zero::zero()));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_dot_nvec()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v1 : NVec<d7, f64> = random();
|
|
|
|
let v2 : NVec<d7, f64> = random();
|
|
|
|
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(v1.dot(&v2).approx_eq(&v2.dot(&v1)));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_commut_dot_vec3()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v1 : Vec3<f64> = random();
|
|
|
|
let v2 : Vec3<f64> = random();
|
|
|
|
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(v1.dot(&v2).approx_eq(&v2.dot(&v1)));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_commut_dot_vec2()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v1 : Vec2<f64> = random();
|
|
|
|
let v2 : Vec2<f64> = random();
|
|
|
|
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(v1.dot(&v2).approx_eq(&v2.dot(&v1)));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_commut_dot_vec1()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v1 : Vec1<f64> = random();
|
|
|
|
let v2 : Vec1<f64> = random();
|
|
|
|
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(v1.dot(&v2).approx_eq(&v2.dot(&v1)));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_basis_vec1()
|
|
|
|
{
|
2013-05-19 01:07:38 +08:00
|
|
|
let basis = Basis::canonical_basis::<Vec1<f64>>();
|
2013-05-19 01:04:03 +08:00
|
|
|
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all2(basis, basis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(basis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_basis_vec2()
|
|
|
|
{
|
2013-05-19 01:07:38 +08:00
|
|
|
let basis = Basis::canonical_basis::<Vec2<f64>>();
|
2013-05-19 01:04:03 +08:00
|
|
|
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all2(basis, basis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(basis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_basis_vec3()
|
|
|
|
{
|
2013-05-19 01:07:38 +08:00
|
|
|
let basis = Basis::canonical_basis::<Vec3<f64>>();
|
2013-05-19 01:04:03 +08:00
|
|
|
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all2(basis, basis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(basis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_basis_nvec()
|
|
|
|
{
|
2013-05-19 01:07:38 +08:00
|
|
|
let basis = Basis::canonical_basis::<NVec<d7, f64>>();
|
2013-05-19 01:04:03 +08:00
|
|
|
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all2(basis, basis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:07:38 +08:00
|
|
|
// check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(basis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_subspace_basis_vec1()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v : Vec1<f64> = random();
|
|
|
|
let v1 = v.normalized();
|
|
|
|
let subbasis = v1.orthogonal_subspace_basis();
|
|
|
|
|
|
|
|
// check vectors are orthogonal to v1
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(subbasis, |e| v1.dot(e).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all2(subbasis, subbasis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(subbasis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_subspace_basis_vec2()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v : Vec2<f64> = random();
|
|
|
|
let v1 = v.normalized();
|
|
|
|
let subbasis = v1.orthogonal_subspace_basis();
|
|
|
|
|
|
|
|
// check vectors are orthogonal to v1
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(subbasis, |e| v1.dot(e).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all2(subbasis, subbasis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(subbasis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_subspace_basis_vec3()
|
|
|
|
{
|
|
|
|
for uint::range(0u, 10000u) |_|
|
|
|
|
{
|
|
|
|
let v : Vec3<f64> = random();
|
|
|
|
let v1 = v.normalized();
|
|
|
|
let subbasis = v1.orthogonal_subspace_basis();
|
|
|
|
|
|
|
|
// check vectors are orthogonal to v1
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(subbasis, |e| v1.dot(e).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all2(subbasis, subbasis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
assert!(all(subbasis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ICE
|
|
|
|
//
|
|
|
|
// #[test]
|
|
|
|
// fn test_subspace_basis_vecn()
|
|
|
|
// {
|
|
|
|
// for uint::range(0u, 10000u) |_|
|
|
|
|
// {
|
|
|
|
// let v : NVec<d7, f64> = random();
|
|
|
|
// let v1 = v.normalized();
|
|
|
|
// let subbasis = v1.orthogonal_subspace_basis();
|
|
|
|
//
|
|
|
|
// // check vectors are orthogonal to v1
|
2013-05-21 23:25:01 +08:00
|
|
|
// assert!(all(subbasis, |e| v1.dot(e).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// // check vectors form an ortogonal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
// assert!(all2(subbasis, subbasis, |e1, e2| e1 == e2 || e1.dot(e2).approx_eq(&Zero::zero())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// // check vectors form an orthonormal basis
|
2013-05-21 23:25:01 +08:00
|
|
|
// assert!(all(subbasis, |e| e.norm().approx_eq(&One::one())));
|
2013-05-19 01:04:03 +08:00
|
|
|
// }
|
|
|
|
// }
|