2013-07-11 01:43:45 +08:00
|
|
|
use std::num::{Zero, One};
|
2013-06-29 08:34:45 +08:00
|
|
|
use traits::basis::Basis;
|
|
|
|
use traits::cross::Cross;
|
|
|
|
use traits::division_ring::DivisionRing;
|
|
|
|
use traits::norm::Norm;
|
2013-07-04 22:23:08 +08:00
|
|
|
use traits::sample::UniformSphereSample;
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
use vec::{Vec1, Vec2, Vec3};
|
2013-07-08 04:34:18 +08:00
|
|
|
|
2013-06-29 08:34:45 +08:00
|
|
|
impl<N: Mul<N, N> + Sub<N, N>> Cross<Vec1<N>> for Vec2<N>
|
|
|
|
{
|
|
|
|
#[inline]
|
|
|
|
fn cross(&self, other : &Vec2<N>) -> Vec1<N>
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
{ Vec1::new(self.x * other.y - self.y * other.x) }
|
2013-06-29 08:34:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<N: Mul<N, N> + Sub<N, N>> Cross<Vec3<N>> for Vec3<N>
|
|
|
|
{
|
|
|
|
#[inline]
|
|
|
|
fn cross(&self, other : &Vec3<N>) -> Vec3<N>
|
|
|
|
{
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
Vec3::new(self.y * other.z - self.z * other.y,
|
|
|
|
self.z * other.x - self.x * other.z,
|
|
|
|
self.x * other.y - self.y * other.x
|
2013-06-29 08:34:45 +08:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<N: One> Basis for Vec1<N>
|
|
|
|
{
|
2013-07-02 00:33:22 +08:00
|
|
|
#[inline(always)]
|
|
|
|
fn canonical_basis(f: &fn(Vec1<N>))
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
{ f(Vec1::new(One::one())) }
|
2013-06-29 08:34:45 +08:00
|
|
|
|
2013-07-02 00:33:22 +08:00
|
|
|
#[inline(always)]
|
|
|
|
fn orthonormal_subspace_basis(&self, _: &fn(Vec1<N>))
|
|
|
|
{ }
|
2013-06-29 08:34:45 +08:00
|
|
|
}
|
|
|
|
|
2013-07-04 22:23:08 +08:00
|
|
|
impl<N: Clone + One + Zero + Neg<N>> Basis for Vec2<N>
|
2013-06-29 08:34:45 +08:00
|
|
|
{
|
|
|
|
#[inline]
|
2013-07-02 00:33:22 +08:00
|
|
|
fn canonical_basis(f: &fn(Vec2<N>))
|
2013-06-29 08:34:45 +08:00
|
|
|
{
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
f(Vec2::new(One::one(), Zero::zero()));
|
|
|
|
f(Vec2::new(Zero::zero(), One::one()));
|
2013-06-29 08:34:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2013-07-02 00:33:22 +08:00
|
|
|
fn orthonormal_subspace_basis(&self, f: &fn(Vec2<N>))
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
{ f(Vec2::new(-self.y, self.x.clone())) }
|
2013-06-29 08:34:45 +08:00
|
|
|
}
|
|
|
|
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
impl<N: Clone + DivisionRing + Ord + Algebraic + Signed>
|
2013-06-29 08:34:45 +08:00
|
|
|
Basis for Vec3<N>
|
|
|
|
{
|
2013-07-02 00:33:22 +08:00
|
|
|
#[inline(always)]
|
|
|
|
fn canonical_basis(f: &fn(Vec3<N>))
|
2013-06-29 08:34:45 +08:00
|
|
|
{
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
f(Vec3::new(One::one(), Zero::zero(), Zero::zero()));
|
|
|
|
f(Vec3::new(Zero::zero(), One::one(), Zero::zero()));
|
|
|
|
f(Vec3::new(Zero::zero(), Zero::zero(), One::one()));
|
2013-06-29 08:34:45 +08:00
|
|
|
}
|
|
|
|
|
2013-07-02 00:33:22 +08:00
|
|
|
#[inline(always)]
|
|
|
|
fn orthonormal_subspace_basis(&self, f: &fn(Vec3<N>))
|
2013-06-29 08:34:45 +08:00
|
|
|
{
|
|
|
|
let a =
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
if self.x.clone().abs() > self.y.clone().abs()
|
|
|
|
{ Vec3::new(self.z.clone(), Zero::zero(), -self.x).normalized() }
|
2013-06-29 08:34:45 +08:00
|
|
|
else
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
{ Vec3::new(Zero::zero(), -self.z, self.y.clone()).normalized() };
|
2013-06-29 08:34:45 +08:00
|
|
|
|
2013-07-02 00:33:22 +08:00
|
|
|
f(a.cross(self));
|
|
|
|
f(a);
|
2013-06-29 08:34:45 +08:00
|
|
|
}
|
|
|
|
}
|
2013-07-04 22:23:08 +08:00
|
|
|
|
|
|
|
// FIXME: this bad: this fixes definitly the number of samples…
|
|
|
|
static SAMPLES_2_F64: [Vec2<f64>, ..21] = [
|
Removed occurences of copy/Copy + improved api.
Now, access to vector components are x, y, z, w, a, b, ... instead of at[i].
The method at(i) has the same (read only) effect as the old at[i].
Now, access to matrix components are m11, m12, ... instead of mij[offset(i, j)]...
The method at((i, j)) has the same effect as the old mij[offset(i, j)].
Automatic implementation of all traits the compiler supports has been added on the #[deriving]
clause for both matrices and vectors.
2013-07-20 21:07:49 +08:00
|
|
|
Vec2 { x: 1.0, y: 0.0 },
|
|
|
|
Vec2 { x: 0.95557281, y: 0.29475517 },
|
|
|
|
Vec2 { x: 0.82623877, y: 0.56332006 },
|
|
|
|
Vec2 { x: 0.6234898, y: 0.78183148 },
|
|
|
|
Vec2 { x: 0.36534102, y: 0.93087375 },
|
|
|
|
Vec2 { x: 0.07473009, y: 0.9972038 },
|
|
|
|
Vec2 { x: -0.22252093, y: 0.97492791 },
|
|
|
|
Vec2 { x: -0.5, y: 0.8660254 },
|
|
|
|
Vec2 { x: -0.73305187, y: 0.68017274 },
|
|
|
|
Vec2 { x: -0.90096887, y: 0.43388374 },
|
|
|
|
Vec2 { x: -0.98883083, y: 0.14904227 },
|
|
|
|
Vec2 { x: -0.98883083, y: -0.14904227 },
|
|
|
|
Vec2 { x: -0.90096887, y: -0.43388374 },
|
|
|
|
Vec2 { x: -0.73305187, y: -0.68017274 },
|
|
|
|
Vec2 { x: -0.5, y: -0.8660254 },
|
|
|
|
Vec2 { x: -0.22252093, y: -0.97492791 },
|
|
|
|
Vec2 { x: 0.07473009, y: -0.9972038 },
|
|
|
|
Vec2 { x: 0.36534102, y: -0.93087375 },
|
|
|
|
Vec2 { x: 0.6234898, y: -0.78183148 },
|
|
|
|
Vec2 { x: 0.82623877, y: -0.56332006 },
|
|
|
|
Vec2 { x: 0.95557281, y: -0.29475517 },
|
2013-07-04 22:23:08 +08:00
|
|
|
];
|
|
|
|
|
2013-07-22 18:32:16 +08:00
|
|
|
// Those vectors come from bullet 3d
|
|
|
|
static SAMPLES_3_F64: [Vec3<f64>, ..42] = [
|
|
|
|
Vec3 { x: 0.000000 , y: -0.000000, z: -1.000000 },
|
|
|
|
Vec3 { x: 0.723608 , y: -0.525725, z: -0.447219 },
|
|
|
|
Vec3 { x: -0.276388, y: -0.850649, z: -0.447219 },
|
|
|
|
Vec3 { x: -0.894426, y: -0.000000, z: -0.447216 },
|
|
|
|
Vec3 { x: -0.276388, y: 0.850649 , z: -0.447220 },
|
|
|
|
Vec3 { x: 0.723608 , y: 0.525725 , z: -0.447219 },
|
|
|
|
Vec3 { x: 0.276388 , y: -0.850649, z: 0.447220 },
|
|
|
|
Vec3 { x: -0.723608, y: -0.525725, z: 0.447219 },
|
|
|
|
Vec3 { x: -0.723608, y: 0.525725 , z: 0.447219 },
|
|
|
|
Vec3 { x: 0.276388 , y: 0.850649 , z: 0.447219 },
|
|
|
|
Vec3 { x: 0.894426 , y: 0.000000 , z: 0.447216 },
|
|
|
|
Vec3 { x: -0.000000, y: 0.000000 , z: 1.000000 },
|
|
|
|
Vec3 { x: 0.425323 , y: -0.309011, z: -0.850654 },
|
|
|
|
Vec3 { x: -0.162456, y: -0.499995, z: -0.850654 },
|
|
|
|
Vec3 { x: 0.262869 , y: -0.809012, z: -0.525738 },
|
|
|
|
Vec3 { x: 0.425323 , y: 0.309011 , z: -0.850654 },
|
|
|
|
Vec3 { x: 0.850648 , y: -0.000000, z: -0.525736 },
|
|
|
|
Vec3 { x: -0.525730, y: -0.000000, z: -0.850652 },
|
|
|
|
Vec3 { x: -0.688190, y: -0.499997, z: -0.525736 },
|
|
|
|
Vec3 { x: -0.162456, y: 0.499995 , z: -0.850654 },
|
|
|
|
Vec3 { x: -0.688190, y: 0.499997 , z: -0.525736 },
|
|
|
|
Vec3 { x: 0.262869 , y: 0.809012 , z: -0.525738 },
|
|
|
|
Vec3 { x: 0.951058 , y: 0.309013 , z: 0.000000 },
|
|
|
|
Vec3 { x: 0.951058 , y: -0.309013, z: 0.000000 },
|
|
|
|
Vec3 { x: 0.587786 , y: -0.809017, z: 0.000000 },
|
|
|
|
Vec3 { x: 0.000000 , y: -1.000000, z: 0.000000 },
|
|
|
|
Vec3 { x: -0.587786, y: -0.809017, z: 0.000000 },
|
|
|
|
Vec3 { x: -0.951058, y: -0.309013, z: -0.000000 },
|
|
|
|
Vec3 { x: -0.951058, y: 0.309013 , z: -0.000000 },
|
|
|
|
Vec3 { x: -0.587786, y: 0.809017 , z: -0.000000 },
|
|
|
|
Vec3 { x: -0.000000, y: 1.000000 , z: -0.000000 },
|
|
|
|
Vec3 { x: 0.587786 , y: 0.809017 , z: -0.000000 },
|
|
|
|
Vec3 { x: 0.688190 , y: -0.499997, z: 0.525736 },
|
|
|
|
Vec3 { x: -0.262869, y: -0.809012, z: 0.525738 },
|
|
|
|
Vec3 { x: -0.850648, y: 0.000000 , z: 0.525736 },
|
|
|
|
Vec3 { x: -0.262869, y: 0.809012 , z: 0.525738 },
|
|
|
|
Vec3 { x: 0.688190 , y: 0.499997 , z: 0.525736 },
|
|
|
|
Vec3 { x: 0.525730 , y: 0.000000 , z: 0.850652 },
|
|
|
|
Vec3 { x: 0.162456 , y: -0.499995, z: 0.850654 },
|
|
|
|
Vec3 { x: -0.425323, y: -0.309011, z: 0.850654 },
|
|
|
|
Vec3 { x: -0.425323, y: 0.309011 , z: 0.850654 },
|
|
|
|
Vec3 { x: 0.162456 , y: 0.499995 , z: 0.850654 }
|
|
|
|
];
|
|
|
|
|
2013-07-04 22:23:08 +08:00
|
|
|
impl UniformSphereSample for Vec2<f64>
|
|
|
|
{
|
|
|
|
pub fn sample(f: &fn(&'static Vec2<f64>))
|
|
|
|
{
|
|
|
|
for SAMPLES_2_F64.iter().advance |sample|
|
|
|
|
{ f(sample) }
|
|
|
|
}
|
|
|
|
}
|
2013-07-06 06:54:42 +08:00
|
|
|
|
|
|
|
impl UniformSphereSample for Vec3<f64>
|
|
|
|
{
|
2013-07-22 18:32:16 +08:00
|
|
|
pub fn sample(f: &fn(&'static Vec3<f64>))
|
2013-07-06 06:54:42 +08:00
|
|
|
{
|
2013-07-22 18:32:16 +08:00
|
|
|
for SAMPLES_3_F64.iter().advance |sample|
|
|
|
|
{ f(sample) }
|
2013-07-06 06:54:42 +08:00
|
|
|
}
|
|
|
|
}
|