924d8269d8
This adds the Pnt{1,2,3,4,5,6} structures. This adds the traits: − AnyPnt − FloatPnt − PntExt − FloatPntExt − Orig (to return the zero point) − PntAsVec − VecAsPnt This adds operator overloading: − Pnt + Vec − Pnt - Vec − Pnt * Scalar − Pnt / Scalar − Pnt + Scalar − Pnt - Scalar − Iso * Pnt − Rot * Pnt − Pnt * Iso − Pnt * Rot This changes some behavior: − Iso multiplication with a Vec does not translate the vector any more. − ToHomogeneous adds a 0.0 at the end of a Vec and a 1.0 at the end of a Pnt. − FromHomogeneous performs w-normalization on a Pnt, but not on a Vec. − The Translate<Vec> trait is never implemented (i-e. a Vec is not to be translated). cc #25 |
||
---|---|---|
benches | ||
src | ||
tests | ||
.gitignore | ||
.travis.yml | ||
Cargo.toml | ||
LICENSE | ||
Makefile | ||
README.md |
README.md
nalgebra
nalgebra is a linear algebra library written for Rust targeting:
- general-purpose linear algebra (still misses a lot of features…).
- real time computer graphics.
- real time computer physics.
An on-line version of this documentation is available here.
Using nalgebra
All the functionalities of nalgebra are grouped in one place: the na
module.
This module re-exports everything and includes free functions for all traits methods doing
out-of-place modifications.
- You can import the whole prelude using:
use nalgebra::na::*;
The preferred way to use nalgebra is to import types and traits explicitly, and call
free-functions using the na::
prefix:
extern crate nalgebra;
use nalgebra::na::{Vec3, Rot3, Rotation};
use nalgebra::na;
fn main() {
let a = Vec3::new(1.0f64, 1.0, 1.0);
let mut b = Rot3::new(na::zero());
b.append_rotation(&a);
assert!(na::approx_eq(&na::rotation(&b), &a));
}
Features
nalgebra is meant to be a general-purpose linear algebra library (but is very far from that…), and keeps an optimized set of tools for computational graphics and physics. Those features include:
- Vectors with static sizes:
Vec0
,Vec1
,Vec2
,Vec3
,Vec4
,Vec5
,Vec6
. - Square matrices with static sizes:
Mat1
,Mat2
,Mat3
,Mat4
,Mat5
,Mat6
. - Rotation matrices:
Rot2
,Rot3
,Rot4
. - Isometries:
Iso2
,Iso3
,Iso4
. - Dynamically sized vector:
DVec
. - Dynamically sized (square or rectangular) matrix:
DMat
. - A few methods for data analysis:
Cov
,Mean
. - Some matrix factorization algorithms: QR decomposition, ...
- Almost one trait per functionality: useful for generic programming.
- Operator overloading using the double trait dispatch trick. For example, the following works:
extern crate nalgebra;
use nalgebra::na::{Vec3, Mat3};
use nalgebra::na;
fn main() {
let v: Vec3<f64> = na::zero();
let m: Mat3<f64> = na::one();
let _ = m * v; // matrix-vector multiplication.
let _ = v * m; // vector-matrix multiplication.
let _ = m * m; // matrix-matrix multiplication.
let _ = v * 2.0; // vector-scalar multiplication.
}
Compilation
You will need the last nightly build of the rust compiler and the official package manager: cargo.
Simply add the following to your Cargo.toml
file:
[dependencies.nalgebra]
git = "https://github.com/sebcrozet/nalgebra"
nalgebra in use
Here are some projects using nalgebra. Feel free to add your project to this list if you happen to use nalgebra!