Struct vek::mat::repr_c::row_major::mat3::Mat3 [] [src]

#[repr(C)]
pub struct Mat3<T> { pub rows: CVec3<Vec3<T>>, }

3x3 matrix.

Fields

Methods

impl<T> Mat3<T>
[src]

[src]

The identity matrix, which is also the default value for square matrices.

assert_eq!(Mat4::<f32>::default(), Mat4::<f32>::identity());

[src]

The matrix with all elements set to zero.

[src]

Returns a memberwise-converted copy of this matrix, using NumCast.

let m = Mat4::<f32>::identity();
let m: Mat4<i32> = m.numcast().unwrap();
assert_eq!(m, Mat4::identity());

[src]

Initializes a new matrix with elements of the diagonal set to val and the other to zero.

In a way, this is the same as single-argument matrix constructors in GLSL and GLM.

assert_eq!(Mat4::broadcast_diagonal(0), Mat4::zero());
assert_eq!(Mat4::broadcast_diagonal(1), Mat4::identity());
assert_eq!(Mat4::broadcast_diagonal(2), Mat4::new(
    2,0,0,0,
    0,2,0,0,
    0,0,2,0,
    0,0,0,2,
));

[src]

Initializes a matrix by its diagonal, setting other elements to zero.

[src]

Gets the matrix's diagonal into a vector.

assert_eq!(Mat4::<u32>::zero().diagonal(), Vec4::zero());
assert_eq!(Mat4::<u32>::identity().diagonal(), Vec4::one());

let mut m = Mat4::zero();
m[(0, 0)] = 1;
m[(1, 1)] = 2;
m[(2, 2)] = 3;
m[(3, 3)] = 4;
assert_eq!(m.diagonal(), Vec4::new(1, 2, 3, 4));
assert_eq!(m.diagonal(), Vec4::iota() + 1);

[src]

The sum of the diagonal's elements.

assert_eq!(Mat4::<u32>::zero().trace(), 0);
assert_eq!(Mat4::<u32>::identity().trace(), 4);

[src]

Multiply elements of this matrix with another's.


let m = Mat4::new(
    0, 1, 2, 3,
    1, 2, 3, 4,
    2, 3, 4, 5,
    3, 4, 5, 6,
);
let r = Mat4::new(
    0, 1, 4, 9,
    1, 4, 9, 16,
    4, 9, 16, 25,
    9, 16, 25, 36,
);
assert_eq!(m.mul_memberwise(m), r);

[src]

Convenience for getting the number of rows of this matrix.

[src]

Convenience for getting the number of columns of this matrix.

[src]

Are all elements of this matrix tightly packed together in memory ?

This might not be the case for matrices in the repr_simd module (it depends on the target architecture).

impl<T> Mat3<T>
[src]

[src]

Returns a row-wise-converted copy of this matrix, using the given conversion closure.

use vek::mat::repr_c::row_major::Mat4;

let m = Mat4::<f32>::new(
    0.25, 1.25, 5.56, 8.66,
    8.53, 2.92, 3.86, 9.36,
    1.02, 0.28, 5.52, 6.06,
    6.20, 7.01, 4.90, 5.26
);
let m = m.map_rows(|row| row.map(|x| x.round() as i32));
assert_eq!(m, Mat4::new(
    0, 1, 6, 9,
    9, 3, 4, 9,
    1, 0, 6, 6,
    6, 7, 5, 5
));

[src]

Converts this matrix into a fixed-size array of elements.

use vek::mat::repr_c::row_major::Mat4;

let m = Mat4::<u32>::new(
     0,  1,  2,  3,
     4,  5,  6,  7,
     8,  9, 10, 11,
    12, 13, 14, 15
);
let array = [
     0,  1,  2,  3,
     4,  5,  6,  7,
     8,  9, 10, 11,
    12, 13, 14, 15
];
assert_eq!(m.into_row_array(), array);

[src]

Converts a fixed-size array of elements into a matrix.

use vek::mat::repr_c::row_major::Mat4;

let m = Mat4::<u32>::new(
     0,  1,  2,  3,
     4,  5,  6,  7,
     8,  9, 10, 11,
    12, 13, 14, 15
);
let array = [
     0,  1,  2,  3,
     4,  5,  6,  7,
     8,  9, 10, 11,
    12, 13, 14, 15
];
assert_eq!(m, Mat4::from_row_array(array));

[src]

Converts this matrix into a fixed-size array of elements.

use vek::mat::repr_c::row_major::Mat4;

let m = Mat4::<u32>::new(
     0,  1,  2,  3,
     4,  5,  6,  7,
     8,  9, 10, 11,
    12, 13, 14, 15
);
let array = [
    0, 4, 8, 12,
    1, 5, 9, 13,
    2, 6, 10, 14,
    3, 7, 11, 15
];
assert_eq!(m.into_col_array(), array);

[src]

Converts a fixed-size array of elements into a matrix.

use vek::mat::repr_c::row_major::Mat4;

let m = Mat4::<u32>::new(
     0,  1,  2,  3,
     4,  5,  6,  7,
     8,  9, 10, 11,
    12, 13, 14, 15
);
let array = [
    0, 4, 8, 12,
    1, 5, 9, 13,
    2, 6, 10, 14,
    3, 7, 11, 15
];
assert_eq!(m, Mat4::from_col_array(array));

[src]

Gets a const pointer to this matrix's elements.

Panics

Panics if the matrix's elements are not tightly packed in memory, which may be the case for matrices in the repr_simd module.
You may check this with the is_packed() method.

[src]

Gets a mut pointer to this matrix's elements.

Panics

Panics if the matrix's elements are not tightly packed in memory, which may be the case for matrices in the repr_simd module.
You may check this with the is_packed() method.

[src]

View this matrix as an immutable slice.

Panics

Panics if the matrix's elements are not tightly packed in memory, which may be the case for matrices in the repr_simd module.
You may check this with the is_packed() method.

[src]

View this matrix as a mutable slice.

Panics

Panics if the matrix's elements are not tightly packed in memory, which may be the case for matrices in the repr_simd module.
You may check this with the is_packed() method.

impl<T> Mat3<T>
[src]

[src]

Gets the transpose parameter to pass to OpenGL glUniformMatrix*() functions.

The return value is a plain bool which you may directly cast to a GLboolean.

This takes &self to prevent surprises when changing the type of matrix you plan to send.

GL_SHOULD_TRANSPOSE: bool = true

The transpose parameter to pass to OpenGL glUniformMatrix*() functions.

impl<T> Mat3<T>
[src]

[src]

Returns an element-wise-converted copy of this matrix, using the given conversion closure.

use vek::mat::repr_c::row_major::Mat4;

let m = Mat4::<f32>::new(
    0.25, 1.25, 5.56, 8.66,
    8.53, 2.92, 3.86, 9.36,
    1.02, 0.28, 5.52, 6.06,
    6.20, 7.01, 4.90, 5.26
);
let m = m.map(|x| x.round() as i32);
assert_eq!(m, Mat4::new(
    0, 1, 6, 9,
    9, 3, 4, 9,
    1, 0, 6, 6,
    6, 7, 5, 5
));

[src]

The matrix's transpose.

For orthogonal matrices, the transpose is the same as the inverse. All pure rotation matrices are orthogonal, and therefore can be inverted faster by simply computing their transpose.

use std::f32::consts::PI;

let m = Mat3::new(
    0, 1, 2,
    4, 5, 6,
    8, 9, 0
);
let t = Mat3::new(
    0, 4, 8,
    1, 5, 9,
    2, 6, 0 
);
assert_eq!(m.transposed(), t);
assert_eq!(m, m.transposed().transposed());

let m = Mat3::rotation_x(PI/7.);
assert_relative_eq!(m * m.transposed(), Mat3::identity());
assert_relative_eq!(m.transposed() * m, Mat3::identity());

[src]

Transpose this matrix.


let mut m = Mat3::new(
    0, 1, 2,
    4, 5, 6,
    8, 9, 0
);
let t = Mat3::new(
    0, 4, 8,
    1, 5, 9,
    2, 6, 0
);
m.transpose();
assert_eq!(m, t);

[src]

Get this matrix's determinant.

A matrix is invertible if its determinant is non-zero.

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

3D rotation matrix. axis is not required to be normalized.

use std::f32::consts::PI;

let angles = 32;
for i in 0..angles {
    let theta = PI * 2. * (i as f32) / (angles as f32);

    assert_relative_eq!(Mat3::rotation_x(theta), Mat3::from(Quaternion::rotation_x(theta)), epsilon = 0.000001);
    assert_relative_eq!(Mat3::rotation_y(theta), Mat3::from(Quaternion::rotation_y(theta)), epsilon = 0.000001);
    assert_relative_eq!(Mat3::rotation_z(theta), Mat3::from(Quaternion::rotation_z(theta)), epsilon = 0.000001);

    assert_relative_eq!(Mat3::rotation_x(theta), Mat3::rotation_3d(theta, Vec3::unit_x()));
    assert_relative_eq!(Mat3::rotation_y(theta), Mat3::rotation_3d(theta, Vec3::unit_y()));
    assert_relative_eq!(Mat3::rotation_z(theta), Mat3::rotation_3d(theta, Vec3::unit_z()));

    assert_relative_eq!(Mat3::rotation_x(theta), Mat3::from(Mat4::rotation_3d(theta, Vec3::unit_x())));
    assert_relative_eq!(Mat3::rotation_y(theta), Mat3::from(Mat4::rotation_3d(theta, Vec3::unit_y())));
    assert_relative_eq!(Mat3::rotation_z(theta), Mat3::from(Mat4::rotation_3d(theta, Vec3::unit_z())));

    assert_relative_eq!(Mat4::rotation_x(theta), Mat4::from(Mat3::rotation_3d(theta, Vec3::unit_x())));
    assert_relative_eq!(Mat4::rotation_y(theta), Mat4::from(Mat3::rotation_3d(theta, Vec3::unit_y())));
    assert_relative_eq!(Mat4::rotation_z(theta), Mat4::from(Mat3::rotation_3d(theta, Vec3::unit_z())));

    // See what rotating unit vectors do for most angles between 0 and 2*PI.
    // It's helpful to picture this as a right-handed coordinate system.

    let v = Vec3::unit_y();
    let m = Mat3::rotation_x(theta);
    assert_relative_eq!(m * v, Vec3::new(0., theta.cos(), theta.sin()));

    let v = Vec3::unit_z();
    let m = Mat3::rotation_y(theta);
    assert_relative_eq!(m * v, Vec3::new(theta.sin(), 0., theta.cos()));

    let v = Vec3::unit_x();
    let m = Mat3::rotation_z(theta);
    assert_relative_eq!(m * v, Vec3::new(theta.cos(), theta.sin(), 0.));
}

[src]

Creates a matrix that would rotate a from direction to to.


let (from, to) = (Vec3::<f32>::unit_x(), Vec3::<f32>::unit_z());
let m = Mat3::<f32>::rotation_from_to_3d(from, to);
assert_relative_eq!(m * from, to);

let (from, to) = (Vec3::<f32>::unit_x(), -Vec3::<f32>::unit_x());
let m = Mat3::<f32>::rotation_from_to_3d(from, to);
assert_relative_eq!(m * from, to);

impl<T> Mat3<T>
[src]

[src]

Creates a new 3x3 matrix from elements in a layout-agnostic way.

The parameters are named mij where i is the row index and j the column index. Their order is always the same regardless of the matrix's layout.

Trait Implementations

impl<T: Debug> Debug for Mat3<T>
[src]

[src]

Formats the value using the given formatter.

impl<T: Clone> Clone for Mat3<T>
[src]

[src]

Returns a copy of the value. Read more

1.0.0
[src]

Performs copy-assignment from source. Read more

impl<T: Copy> Copy for Mat3<T>
[src]

impl<T: Hash> Hash for Mat3<T>
[src]

[src]

Feeds this value into the given [Hasher]. Read more

1.3.0
[src]

Feeds a slice of this type into the given [Hasher]. Read more

impl<T: Eq> Eq for Mat3<T>
[src]

impl<T: PartialEq> PartialEq for Mat3<T>
[src]

[src]

This method tests for self and other values to be equal, and is used by ==. Read more

[src]

This method tests for !=.

impl<T: Zero + One> Default for Mat3<T>
[src]

The default value for a square matrix is the identity.

assert_eq!(Mat4::<f32>::default(), Mat4::<f32>::identity());

[src]

Returns the "default value" for a type. Read more

impl<T: Zero + PartialEq> Zero for Mat3<T>
[src]

[src]

Returns the additive identity element of Self, 0. Read more

[src]

Returns true if self is equal to the additive identity.

impl<T: Zero + One + Copy + MulAdd<T, T, Output = T>> One for Mat3<T>
[src]

[src]

Returns the multiplicative identity element of Self, 1. Read more

impl<T> Mul<T> for Mat3<T> where
    T: Copy + Zero + Add<Output = T> + Mul<Output = T>, 
[src]

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T> MulAssign for Mat3<T> where
    T: Copy + Zero + Add<Output = T> + Mul<Output = T> + MulAdd<T, T, Output = T>, 
[src]

[src]

Performs the *= operation.

impl<T> MulAssign<T> for Mat3<T> where
    T: Copy + Zero + Add<Output = T> + Mul<Output = T>, 
[src]

[src]

Performs the *= operation.

impl<T> Add for Mat3<T> where
    T: Add<Output = T>, 
[src]

The resulting type after applying the + operator.

[src]

Performs the + operation.

impl<T> Sub for Mat3<T> where
    T: Sub<Output = T>, 
[src]

The resulting type after applying the - operator.

[src]

Performs the - operation.

impl<T> Div for Mat3<T> where
    T: Div<Output = T>, 
[src]

The resulting type after applying the / operator.

[src]

Performs the / operation.

impl<T> Rem for Mat3<T> where
    T: Rem<Output = T>, 
[src]

The resulting type after applying the % operator.

[src]

Performs the % operation.

impl<T> Neg for Mat3<T> where
    T: Neg<Output = T>, 
[src]

The resulting type after applying the - operator.

[src]

Performs the unary - operation.

impl<T> Add<T> for Mat3<T> where
    T: Copy + Add<Output = T>, 
[src]

The resulting type after applying the + operator.

[src]

Performs the + operation.

impl<T> Sub<T> for Mat3<T> where
    T: Copy + Sub<Output = T>, 
[src]

The resulting type after applying the - operator.

[src]

Performs the - operation.

impl<T> Div<T> for Mat3<T> where
    T: Copy + Div<Output = T>, 
[src]

The resulting type after applying the / operator.

[src]

Performs the / operation.

impl<T> Rem<T> for Mat3<T> where
    T: Copy + Rem<Output = T>, 
[src]

The resulting type after applying the % operator.

[src]

Performs the % operation.

impl<T: Add<Output = T> + Copy> AddAssign for Mat3<T>
[src]

[src]

Performs the += operation.

impl<T: Add<Output = T> + Copy> AddAssign<T> for Mat3<T>
[src]

[src]

Performs the += operation.

impl<T: Sub<Output = T> + Copy> SubAssign for Mat3<T>
[src]

[src]

Performs the -= operation.

impl<T: Sub<Output = T> + Copy> SubAssign<T> for Mat3<T>
[src]

[src]

Performs the -= operation.

impl<T: Div<Output = T> + Copy> DivAssign for Mat3<T>
[src]

[src]

Performs the /= operation.

impl<T: Div<Output = T> + Copy> DivAssign<T> for Mat3<T>
[src]

[src]

Performs the /= operation.

impl<T: Rem<Output = T> + Copy> RemAssign for Mat3<T>
[src]

[src]

Performs the %= operation.

impl<T: Rem<Output = T> + Copy> RemAssign<T> for Mat3<T>
[src]

[src]

Performs the %= operation.

impl<T: ApproxEq> ApproxEq for Mat3<T> where
    T::Epsilon: Copy
[src]

Used for specifying relative comparisons.

[src]

The default tolerance to use when testing values that are close together. Read more

[src]

The default relative tolerance for testing values that are far-apart. Read more

[src]

The default ULPs to tolerate when testing values that are far-apart. Read more

[src]

A test for equality that uses a relative comparison if the values are far apart.

[src]

A test for equality that uses units in the last place (ULP) if the values are far apart.

[src]

The inverse of ApproxEq::relative_eq.

[src]

The inverse of ApproxEq::ulps_eq.

impl<T: Display> Display for Mat3<T>
[src]

Displays this matrix using the following format:

(i being the number of rows and j the number of columns)

( m00 ... m0j
  ... ... ...
  mi0 ... mij )

Note that elements are not comma-separated.
This format doesn't depend on the matrix's storage layout.

[src]

Formats the value using the given formatter. Read more

impl<T> Index<(usize, usize)> for Mat3<T>
[src]

Index this matrix in a layout-agnostic way with an (i, j) (row index, column index) tuple.

Matrices cannot be indexed by Vec2s because that would be likely to cause confusion: should x be the row index (because it's the first element) or the column index (because it's a horizontal position) ?

The returned type after indexing.

[src]

Performs the indexing (container[index]) operation.

impl<T> IndexMut<(usize, usize)> for Mat3<T>
[src]

[src]

Performs the mutable indexing (container[index]) operation.

impl<T: MulAdd<T, T, Output = T> + Mul<Output = T> + Copy> Mul<Vec3<T>> for Mat3<T>
[src]

Multiplies a row-major matrix with a column vector, giving a column vector.

use vek::mat::row_major::Mat4;
use vek::vec::Vec4;

let m = Mat4::new(
    0, 1, 2, 3,
    4, 5, 6, 7,
    8, 9, 0, 1,
    2, 3, 4, 5
);
let v = Vec4::new(0, 1, 2, 3);
let r = Vec4::new(14, 38, 12, 26);
assert_eq!(m * v, r);

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T: MulAdd<T, T, Output = T> + Mul<Output = T> + Copy> Mul for Mat3<T>
[src]

Multiplies a row-major matrix with another.

use vek::mat::row_major::Mat4;

let m = Mat4::<u32>::new(
    0, 1, 2, 3,
    4, 5, 6, 7,
    8, 9, 0, 1,
    2, 3, 4, 5
);
let r = Mat4::<u32>::new(
    26, 32, 18, 24,
    82, 104, 66, 88,
    38, 56, 74, 92,
    54, 68, 42, 56
);
assert_eq!(m * m, r);
assert_eq!(m, m * Mat4::<u32>::identity());
assert_eq!(m, Mat4::<u32>::identity() * m);

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T: MulAdd<T, T, Output = T> + Mul<Output = T> + Copy> Mul<Transpose<T>> for Mat3<T>
[src]

Multiplies a row-major matrix with a column-major matrix, producing a column-major matrix.

use vek::mat::row_major::Mat4 as Rows4;
use vek::mat::column_major::Mat4 as Cols4;

let m = Rows4::<u32>::new(
    0, 1, 2, 3,
    4, 5, 6, 7,
    8, 9, 0, 1,
    2, 3, 4, 5
);
let b = Cols4::from(m);
let r = Cols4::<u32>::new(
    26, 32, 18, 24,
    82, 104, 66, 88,
    38, 56, 74, 92,
    54, 68, 42, 56
);
assert_eq!(m * b, r);
assert_eq!(m * Cols4::<u32>::identity(), m.into());
assert_eq!(Rows4::<u32>::identity() * b, m.into());

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T> From<Transpose<T>> for Mat3<T>
[src]

[src]

Performs the conversion.

impl<T> From<Mat4<T>> for Mat3<T>
[src]

[src]

Performs the conversion.

impl<T> From<Mat2<T>> for Mat3<T> where
    T: Zero + One
[src]

[src]

Performs the conversion.

impl<T> From<Quaternion<T>> for Mat3<T> where
    T: Copy + Zero + One + Mul<Output = T> + Add<Output = T> + Sub<Output = T>, 
[src]

[src]

Performs the conversion.