2014-10-10 17:23:52 +08:00
|
|
|
#![macro_escape]
|
|
|
|
|
|
|
|
macro_rules! orig_impl(
|
|
|
|
($t: ident, $comp0: ident $(,$compN: ident)*) => (
|
|
|
|
impl<N: Zero> Orig for $t<N> {
|
|
|
|
#[inline]
|
|
|
|
fn orig() -> $t<N> {
|
|
|
|
$t {
|
2014-11-16 21:04:15 +08:00
|
|
|
$comp0: ::zero()
|
|
|
|
$(, $compN: ::zero() )*
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn is_orig(&self) -> bool {
|
|
|
|
self.$comp0.is_zero() $(&& self.$compN.is_zero() )*
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
macro_rules! pnt_sub_impl(
|
2014-11-26 21:17:34 +08:00
|
|
|
($t: ident, $tv: ident) => (
|
|
|
|
impl<N: Sub<N, N>> Sub<$t<N>, $tv<N>> for $t<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2014-11-26 21:17:34 +08:00
|
|
|
fn sub(&self, right: &$t<N>) -> $tv<N> {
|
|
|
|
*self.as_vec() - *right.as_vec()
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
macro_rules! pnt_add_vec_impl(
|
2014-11-26 21:17:34 +08:00
|
|
|
($t: ident, $tv: ident, $comp0: ident $(,$compN: ident)*) => (
|
|
|
|
impl<N: Add<N, N>> Add<$tv<N>, $t<N>> for $t<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2014-11-26 21:17:34 +08:00
|
|
|
fn add(&self, right: &$tv<N>) -> $t<N> {
|
|
|
|
$t::new(self.$comp0 + right.$comp0 $(, self.$compN + right.$compN)*)
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
macro_rules! pnt_sub_vec_impl(
|
2014-11-26 21:17:34 +08:00
|
|
|
($t: ident, $tv: ident, $comp0: ident $(,$compN: ident)*) => (
|
|
|
|
impl<N: Sub<N, N>> Sub<$tv<N>, $t<N>> for $t<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2014-11-26 21:17:34 +08:00
|
|
|
fn sub(&self, right: &$tv<N>) -> $t<N> {
|
|
|
|
$t::new(self.$comp0 - right.$comp0 $(, self.$compN - right.$compN)*)
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
macro_rules! pnt_as_vec_impl(
|
2014-10-10 18:19:37 +08:00
|
|
|
($t: ident, $tv: ident, $comp0: ident $(,$compN: ident)*) => (
|
2014-10-10 17:23:52 +08:00
|
|
|
impl<N> $t<N> {
|
2014-10-12 16:35:56 +08:00
|
|
|
/// Converts this point to its associated vector.
|
2014-10-10 18:19:37 +08:00
|
|
|
#[inline]
|
|
|
|
pub fn to_vec(self) -> $tv<N> {
|
|
|
|
$tv::new(
|
|
|
|
self.$comp0
|
|
|
|
$(, self.$compN)*
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2014-10-12 16:35:56 +08:00
|
|
|
/// Converts a reference to this point to a reference to its associated vector.
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
|
|
|
pub fn as_vec<'a>(&'a self) -> &'a $tv<N> {
|
|
|
|
unsafe {
|
|
|
|
mem::transmute(self)
|
|
|
|
}
|
|
|
|
}
|
2014-10-11 02:56:40 +08:00
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn set_coords(&mut self, v: $tv<N>) {
|
|
|
|
self.$comp0 = v.$comp0;
|
|
|
|
$(self.$compN = v.$compN;)*
|
|
|
|
}
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<N> PntAsVec<$tv<N>> for $t<N> {
|
2014-10-10 18:19:37 +08:00
|
|
|
#[inline]
|
|
|
|
fn to_vec(self) -> $tv<N> {
|
|
|
|
self.to_vec()
|
|
|
|
}
|
|
|
|
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
|
|
|
fn as_vec<'a>(&'a self) -> &'a $tv<N> {
|
|
|
|
self.as_vec()
|
|
|
|
}
|
2014-10-11 02:56:40 +08:00
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn set_coords(&mut self, v: $tv<N>) {
|
|
|
|
self.set_coords(v)
|
|
|
|
}
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
macro_rules! pnt_to_homogeneous_impl(
|
|
|
|
($t: ident, $t2: ident, $extra: ident, $comp0: ident $(,$compN: ident)*) => (
|
|
|
|
impl<N: Clone + One + Zero> ToHomogeneous<$t2<N>> for $t<N> {
|
2014-11-22 00:00:39 +08:00
|
|
|
fn to_homogeneous(&self) -> $t2<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
let mut res: $t2<N> = Orig::orig();
|
|
|
|
|
2014-11-22 00:00:39 +08:00
|
|
|
res.$comp0 = self.$comp0.clone();
|
|
|
|
$( res.$compN = self.$compN.clone(); )*
|
2014-11-16 21:04:15 +08:00
|
|
|
res.$extra = ::one();
|
2014-10-10 17:23:52 +08:00
|
|
|
|
|
|
|
res
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
macro_rules! pnt_from_homogeneous_impl(
|
|
|
|
($t: ident, $t2: ident, $extra: ident, $comp0: ident $(,$compN: ident)*) => (
|
|
|
|
impl<N: Clone + Div<N, N> + One + Zero> FromHomogeneous<$t2<N>> for $t<N> {
|
|
|
|
fn from(v: &$t2<N>) -> $t<N> {
|
|
|
|
let mut res: $t<N> = Orig::orig();
|
|
|
|
|
|
|
|
res.$comp0 = v.$comp0.clone() / v.$extra;
|
|
|
|
$( res.$compN = v.$compN.clone() / v.$extra; )*
|
|
|
|
|
|
|
|
res
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
2014-10-26 22:04:47 +08:00
|
|
|
|
|
|
|
macro_rules! num_float_pnt_impl(
|
2014-11-26 21:17:34 +08:00
|
|
|
($t: ident, $tv: ident) => (
|
2014-10-26 22:04:47 +08:00
|
|
|
impl<N> NumPnt<N, $tv<N>> for $t<N>
|
2014-11-26 21:17:34 +08:00
|
|
|
where N: BaseNum {
|
2014-10-26 22:04:47 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<N> FloatPnt<N, $tv<N>> for $t<N>
|
2014-11-26 21:17:34 +08:00
|
|
|
where N: BaseFloat + ApproxEq<N> {
|
2014-10-26 22:04:47 +08:00
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|