use super::*;
#[doc = "# Examples"]
#[doc = "```"]
#[doc = include_str ! ("../../tests/point3d.rs")]
#[doc = "```"]
pub trait Projective3D<T>
where
Self: Sized,
T: Zero + One + Real,
{
fn transform(&self, m: &[&T; 16]) -> Self;
fn rotate(&self, _alpha: T, _beta: T, _gamma: T) -> Self {
todo!()
}
fn rotate_point(&self, _point: &[T; 3], _alpha: T, _beta: T, _gamma: T) -> Self {
todo!()
}
#[rustfmt::skip]
fn rotate_axis(&self, _p1: &[T; 3], _p2: &[T; 3], _alpha:T) -> Self {
todo!()
}
fn rotate_axis_x(&self, alpha: T) -> Self {
self.rotate_axis(&[T::zero(), T::zero(), T::zero()], &[T::one(), T::zero(), T::zero()], alpha)
}
fn rotate_axis_y(&self, alpha: T) -> Self {
self.rotate_axis(&[T::zero(), T::zero(), T::zero()], &[T::zero(), T::one(), T::zero()], alpha)
}
fn rotate_axis_z(&self, alpha: T) -> Self {
self.rotate_axis(&[T::zero(), T::zero(), T::zero()], &[T::zero(), T::zero(), T::one()], alpha)
}
#[rustfmt::skip]
fn translate(&self, x: &T, y: &T, z: &T) -> Self {
self.transform(&[
&T::one(), &T::zero(), &T::zero(), x,
&T::zero(), &T::one(), &T::zero(), y,
&T::zero(), &T::zero(), &T::one(), z,
&T::zero(), &T::zero(), &T::zero(), &T::one(),
])
}
fn translate_x(&self, x: &T) -> Self {
self.translate(x, &T::zero(), &T::zero())
}
fn translate_y(&self, y: &T) -> Self {
self.translate(&T::zero(), y, &T::zero())
}
fn translate_z(&self, y: &T) -> Self {
self.translate(&T::zero(), &T::zero(), y)
}
#[rustfmt::skip]
fn scale(&self, x: &T, y: &T, z: &T) -> Self {
self.transform(&[
x, &T::zero(), &T::zero(), &T::zero(),
&T::zero(), y, &T::zero(), &T::zero(),
&T::zero(), &T::zero(), z, &T::zero(),
&T::zero(), &T::zero(), &T::zero(), &T::one(),
])
}
fn scale_x(self, x: &T) -> Self {
self.scale(x, &T::one(), &T::one())
}
fn scale_y(self, y: &T) -> Self {
self.scale(&T::one(), y, &T::one())
}
fn scale_z(self, z: &T) -> Self {
self.scale(&T::one(), &T::one(), z)
}
}