matrices: implement Matrix4x4::shearing
This commit is contained in:
parent
b8df830460
commit
83799a02a9
@ -1,9 +1,6 @@
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::ops::{Index, IndexMut, Mul};
|
use std::ops::{Index, IndexMut, Mul};
|
||||||
|
|
||||||
// Implement a PartialEq that does approx_eq internally.
|
|
||||||
//use float_cmp::{ApproxEq, F32Margin};
|
|
||||||
|
|
||||||
use crate::tuples::Tuple;
|
use crate::tuples::Tuple;
|
||||||
|
|
||||||
/// Value considered close enough for PartialEq implementations.
|
/// Value considered close enough for PartialEq implementations.
|
||||||
@ -402,6 +399,50 @@ impl Matrix4x4 {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/// Create a transform matrix that will shear (skew) points.
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use rtchallenge::{matrices::Matrix4x4, tuples::Tuple};
|
||||||
|
///
|
||||||
|
/// // A shearing transform moves x in proportion to y.
|
||||||
|
/// let transform = Matrix4x4::shearing(1.,0.,0.,0.,0.,0.);
|
||||||
|
/// let p = Tuple::point(2.,3.,4.);
|
||||||
|
/// assert_eq!(transform * p, Tuple::point(5.,3.,4.));
|
||||||
|
///
|
||||||
|
/// // A shearing transform moves x in proportion to z.
|
||||||
|
/// let transform = Matrix4x4::shearing(0.,1.,0.,0.,0.,0.);
|
||||||
|
/// let p = Tuple::point(2.,3.,4.);
|
||||||
|
/// assert_eq!(transform * p, Tuple::point(6.,3.,4.));
|
||||||
|
///
|
||||||
|
/// // A shearing transform moves y in proportion to x.
|
||||||
|
/// let transform = Matrix4x4::shearing(0.,0.,1.,0.,0.,0.);
|
||||||
|
/// let p = Tuple::point(2.,3.,4.);
|
||||||
|
/// assert_eq!(transform * p, Tuple::point(2.,5.,4.));
|
||||||
|
///
|
||||||
|
/// // A shearing transform moves y in proportion to z.
|
||||||
|
/// let transform = Matrix4x4::shearing(0.,0.,0.,1.,0.,0.);
|
||||||
|
/// let p = Tuple::point(2.,3.,4.);
|
||||||
|
/// assert_eq!(transform * p, Tuple::point(2.,7.,4.));
|
||||||
|
///
|
||||||
|
/// // A shearing transform moves z in proportion to x.
|
||||||
|
/// let transform = Matrix4x4::shearing(0.,0.,0.,0.,1.,0.);
|
||||||
|
/// let p = Tuple::point(2.,3.,4.);
|
||||||
|
/// assert_eq!(transform * p, Tuple::point(2.,3.,6.));
|
||||||
|
///
|
||||||
|
/// // A shearing transform moves z in proportion to y.
|
||||||
|
/// let transform = Matrix4x4::shearing(0.,0.,0.,0.,0.,1.);
|
||||||
|
/// let p = Tuple::point(2.,3.,4.);
|
||||||
|
/// assert_eq!(transform * p, Tuple::point(2.,3.,7.));
|
||||||
|
|
||||||
|
pub fn shearing(xy: f32, xz: f32, yx: f32, yz: f32, zx: f32, zy: f32) -> Matrix4x4 {
|
||||||
|
Matrix4x4::new(
|
||||||
|
[1., xy, xz, 0.],
|
||||||
|
[yx, 1., yz, 0.],
|
||||||
|
[zx, zy, 1., 0.],
|
||||||
|
[0., 0., 0., 1.],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a new matrix that is the inverse of self. If self is A, inverse returns A<sup>-1</sup>, where
|
/// Returns a new matrix that is the inverse of self. If self is A, inverse returns A<sup>-1</sup>, where
|
||||||
/// AA<sup>-1</sup> = I.
|
/// AA<sup>-1</sup> = I.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user