1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
//! //! geomath is a general purpose maths framework that aims to provide efficient real-time tools for the //! following domains: //! //! * Linear algebra //! * Computational Geometry //! * Computer Graphics and Vision //! * Physics and Kinematics simulation //! * Numerical simulation //! //! It relies on a vast API that consists on various traits each specifying a math property. //! It provides most of the common abstraction used in the above domains : //! * 2D, 3D, 4D matrices, trajectories and points //! * 2D, 3D, 4D, 6D vectors //! //! The implementation benefits from many optimizations allowed when working with small dimensions : //! * Straight forward code //! * Hand-optimized operations //! * Fully stack allocated //! //! However, it still uncomplete and other features and improvements are planned, //! take a look at the [GitHub developement branch](https://github.com/samiBendou/geomath) for more details. //! //! # Get started //! If you already familiar with linear algebra libraries, you can easily get started since the //! API is really straight forward, //! basic vector space operations are implemented as operators and do not need any traits. //! Other operations can be imported with the prelude. //! //! ## Basic principles //! Some simple conventions have been choosed either to gain clarity or performance : //! * Vectors are columns matrices when operating with a matrix //! * Vectors cartesian coordinates are accessible using `vector.i` syntax with `i` the name of the coordinate //! * Matrices components can be accessed using `matrix.ij` where `i` is the row index and `j` the column index //! * Rows and columns are indexed with `x`, `y`, `z`, ... starting with `x` //! * Vectors of size N can be left multiplied by matrices of size N+1 //! //! **Note :** When left-multiplying a vector of size N with a matrix of size N+1 the vector is seen as an homogeneous //! vector (ie. vector of size N) with added component at 1. //! It's a way to perfrom efficient multiplications with transformation matrices. //! //! ### Example //! ``` //! use geomath::matrix; //! let m = matrix::consts::EYE_2; //! assert_eq!(m.xx, 1.); //! assert_eq!(m.xy, 0.); //! assert_eq!(m.yx, 0.); //! assert_eq!(m.yy, 1.); //! ``` //! //! ### Multiply assign //! The multiply assign operator between matrices and vectors reverses the order of the operands //! which means `u *= m` computes in fact `u = m * u`. This allows faster assign multiply implementation. //! //! ## The prelude //! As said above, the prelude contains the traits specifications, it is split in a root and 2 modules : //! ``` //! use geomath::prelude::*; // most of the traits //! use geomath::prelude::coordinates::*; // coordinates systems and transformations //! use geomath::prelude::transforms::*; // matrix transforms (translations, rotations, ...) //! ``` //! //! ## Constants //! Instead of providing static generators for unit vectors and identity matrices, these //! are hard coded as constants : //! ``` //! use geomath::vector; //! let u = vector::consts::EX_3; // unit vector in the positive x (1, 0, 0) //! let v = vector::consts::N_EZ_3; // unit vector in the negative z direction (0, 0, -1) //! let w = vector::consts::ZEROS_3; // zero vector of 3D space (0, 0, 0) //! ``` //! **Note :** All the modules have a `consts` submodule. //! //! However if you are more familiar with the generators, you can still do : //! ``` //! use geomath::prelude::Initializer; //! use geomath::vector::Vector3; //! let u = Vector3::zeros(); // zero vector of 3D space (0, 0, 0) //! let v = Vector3::ones(); // one vector of 3D space (1, 1, 1) //! ``` //! //! ## Short constructors //! To construct a vector a matrix, you can use short constructors : //! ``` //! use geomath::vector::vec3; //! use geomath::matrix::mat2; //! let u = vec3(2., 3., 5.); //! let m = mat2(1., 2., 3., 4.); // ordered by rows, from left to right //! ``` //! //! ## Metric space features //! The metric space fetuares for vectors and matrices can be either computed using methods or operators : //! ``` //! use geomath::vector; //! use geomath::prelude::*; //! let u = vector::consts::EX_3; //! let v = vector::consts::N_EZ_3; //! assert_eq!(u % v, u.distance(&v)); //! assert_eq!(u | v, u.dot(&v)); //! assert_eq!(!u, u.magnitude()); //! ``` /// Vector structures and documentation pub mod vector; /// Matrix structures and documentation pub mod matrix; /// Point structures and documentation pub mod point; /// Trajectory structures and documentation pub mod trajectory; /// Prelude traits and documentation pub mod prelude; /// Macros mentioned bellow pub mod macros;