2015-01-08 04:11:09 +08:00
|
|
|
#![macro_use]
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! origin_impl(
|
2015-01-10 04:55:15 +08:00
|
|
|
($t: ident, $($compN: ident),+) => (
|
2016-04-17 23:26:58 +08:00
|
|
|
impl<N: Zero> Origin for $t<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2016-04-17 23:26:58 +08:00
|
|
|
fn origin() -> $t<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
$t {
|
2015-01-10 04:55:15 +08:00
|
|
|
$($compN: ::zero() ),+
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
2016-04-17 23:26:58 +08:00
|
|
|
fn is_origin(&self) -> bool {
|
2015-01-10 04:55:15 +08:00
|
|
|
$(self.$compN.is_zero() )&&+
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! point_sub_impl(
|
2014-11-26 21:17:34 +08:00
|
|
|
($t: ident, $tv: ident) => (
|
2015-01-05 02:03:28 +08:00
|
|
|
impl<N: Copy + Sub<N, Output = N>> Sub<$t<N>> for $t<N> {
|
|
|
|
type Output = $tv<N>;
|
|
|
|
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2014-12-18 06:28:32 +08:00
|
|
|
fn sub(self, right: $t<N>) -> $tv<N> {
|
2016-04-17 23:26:58 +08:00
|
|
|
*self.as_vector() - *right.as_vector()
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! point_add_vec_impl(
|
2015-01-10 04:55:15 +08:00
|
|
|
($t: ident, $tv: ident, $($compN: ident),+) => (
|
2015-01-05 02:03:28 +08:00
|
|
|
impl<N: Copy + Add<N, Output = N>> Add<$tv<N>> for $t<N> {
|
|
|
|
type Output = $t<N>;
|
|
|
|
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2014-12-18 06:28:32 +08:00
|
|
|
fn add(self, right: $tv<N>) -> $t<N> {
|
2015-01-10 04:55:15 +08:00
|
|
|
$t::new($(self.$compN + right.$compN),+)
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
2016-04-17 18:57:54 +08:00
|
|
|
|
|
|
|
impl<N: Copy + AddAssign<N>> AddAssign<$tv<N>> for $t<N> {
|
|
|
|
#[inline]
|
|
|
|
fn add_assign(&mut self, right: $tv<N>) {
|
|
|
|
$( self.$compN += right.$compN; )+
|
|
|
|
}
|
|
|
|
}
|
2014-10-10 17:23:52 +08:00
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! point_sub_vec_impl(
|
2015-01-10 04:55:15 +08:00
|
|
|
($t: ident, $tv: ident, $($compN: ident),+) => (
|
2015-01-05 02:03:28 +08:00
|
|
|
impl<N: Copy + Sub<N, Output = N>> Sub<$tv<N>> for $t<N> {
|
|
|
|
type Output = $t<N>;
|
|
|
|
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2014-12-18 06:28:32 +08:00
|
|
|
fn sub(self, right: $tv<N>) -> $t<N> {
|
2015-01-10 04:55:15 +08:00
|
|
|
$t::new($(self.$compN - right.$compN),+)
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
}
|
2016-04-17 18:57:54 +08:00
|
|
|
|
|
|
|
impl<N: Copy + SubAssign<N>> SubAssign<$tv<N>> for $t<N> {
|
|
|
|
#[inline]
|
|
|
|
fn sub_assign(&mut self, right: $tv<N>) {
|
|
|
|
$( self.$compN -= right.$compN; )+
|
|
|
|
}
|
|
|
|
}
|
2014-10-10 17:23:52 +08:00
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! point_as_vec_impl(
|
2015-01-10 04:55:15 +08:00
|
|
|
($t: ident, $tv: 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]
|
2016-04-17 23:26:58 +08:00
|
|
|
pub fn to_vector(self) -> $tv<N> {
|
2014-10-10 18:19:37 +08:00
|
|
|
$tv::new(
|
2015-01-10 04:55:15 +08:00
|
|
|
$(self.$compN),+
|
2014-10-10 18:19:37 +08:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
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]
|
2016-04-17 23:26:58 +08:00
|
|
|
pub fn as_vector<'a>(&'a self) -> &'a $tv<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
unsafe {
|
|
|
|
mem::transmute(self)
|
|
|
|
}
|
|
|
|
}
|
2014-10-11 02:56:40 +08:00
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn set_coords(&mut self, v: $tv<N>) {
|
2015-01-10 04:55:15 +08:00
|
|
|
$(self.$compN = v.$compN;)+
|
2014-10-11 02:56:40 +08:00
|
|
|
}
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
impl<N> PointAsVector for $t<N> {
|
|
|
|
type Vector = $tv<N>;
|
2016-04-17 15:23:37 +08:00
|
|
|
|
2014-10-10 18:19:37 +08:00
|
|
|
#[inline]
|
2016-04-17 23:26:58 +08:00
|
|
|
fn to_vector(self) -> $tv<N> {
|
|
|
|
self.to_vector()
|
2014-10-10 18:19:37 +08:00
|
|
|
}
|
|
|
|
|
2014-10-10 17:23:52 +08:00
|
|
|
#[inline]
|
2016-04-17 23:26:58 +08:00
|
|
|
fn as_vector<'a>(&'a self) -> &'a $tv<N> {
|
|
|
|
self.as_vector()
|
2014-10-10 17:23:52 +08:00
|
|
|
}
|
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
|
|
|
}
|
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! point_to_homogeneous_impl(
|
2015-01-10 04:55:15 +08:00
|
|
|
($t: ident, $t2: ident, $extra: ident, $($compN: ident),+) => (
|
2014-12-18 06:28:32 +08:00
|
|
|
impl<N: Copy + One + Zero> ToHomogeneous<$t2<N>> for $t<N> {
|
2014-11-22 00:00:39 +08:00
|
|
|
fn to_homogeneous(&self) -> $t2<N> {
|
2016-04-17 23:26:58 +08:00
|
|
|
let mut res: $t2<N> = Origin::origin();
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2015-01-10 04:55:15 +08:00
|
|
|
$( res.$compN = self.$compN; )+
|
2014-11-16 21:04:15 +08:00
|
|
|
res.$extra = ::one();
|
2014-10-10 17:23:52 +08:00
|
|
|
|
|
|
|
res
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! point_from_homogeneous_impl(
|
2015-01-10 04:55:15 +08:00
|
|
|
($t: ident, $t2: ident, $extra: ident, $($compN: ident),+) => (
|
2015-01-05 02:03:28 +08:00
|
|
|
impl<N: Copy + Div<N, Output = N> + One + Zero> FromHomogeneous<$t2<N>> for $t<N> {
|
2014-10-10 17:23:52 +08:00
|
|
|
fn from(v: &$t2<N>) -> $t<N> {
|
2016-04-17 23:26:58 +08:00
|
|
|
let mut res: $t<N> = Origin::origin();
|
2014-10-10 17:23:52 +08:00
|
|
|
|
2015-01-10 04:55:15 +08:00
|
|
|
$( res.$compN = v.$compN / v.$extra; )+
|
2014-10-10 17:23:52 +08:00
|
|
|
|
|
|
|
res
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2014-10-26 22:04:47 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! num_float_point_impl(
|
2014-11-26 21:17:34 +08:00
|
|
|
($t: ident, $tv: ident) => (
|
2016-04-17 23:26:58 +08:00
|
|
|
impl<N> NumPoint<N> for $t<N>
|
2014-11-26 21:17:34 +08:00
|
|
|
where N: BaseNum {
|
2014-10-26 22:04:47 +08:00
|
|
|
}
|
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
impl<N> FloatPoint<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
|
|
|
}
|
|
|
|
)
|
2014-12-19 22:33:01 +08:00
|
|
|
);
|
2015-01-10 08:36:13 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! arbitrary_point_impl(
|
2015-01-10 08:36:13 +08:00
|
|
|
($t: ident, $($compN: ident),*) => (
|
|
|
|
#[cfg(feature="arbitrary")]
|
|
|
|
impl<N: Arbitrary> Arbitrary for $t<N> {
|
|
|
|
#[inline]
|
|
|
|
fn arbitrary<G: Gen>(g: &mut G) -> $t<N> {
|
|
|
|
$t {
|
|
|
|
$($compN: Arbitrary::arbitrary(g),)*
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|
2016-03-28 20:56:25 +08:00
|
|
|
|
2016-04-17 23:26:58 +08:00
|
|
|
macro_rules! point_display_impl(
|
2016-03-28 20:56:25 +08:00
|
|
|
($t: ident) => (
|
|
|
|
impl<N: fmt::Display> fmt::Display for $t<N> {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
// FIXME: differenciate them from vectors ?
|
|
|
|
try!(write!(f, "("));
|
|
|
|
|
|
|
|
let mut it = self.iter();
|
|
|
|
|
|
|
|
try!(write!(f, "{}", *it.next().unwrap()));
|
|
|
|
|
|
|
|
for comp in it {
|
|
|
|
try!(write!(f, ", {}", *comp));
|
|
|
|
}
|
|
|
|
|
|
|
|
write!(f, ")")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|