Skip to content

LMath - Modern and lightweight cross-platform C++ 17 math and geometry library

License

Notifications You must be signed in to change notification settings

TheNicker/LMath

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LMath logo

Codacy Badge Build status Language grade: C/C++ Total alerts GitHub

LMath is a modern and lightweight cross-platform header only C++ 17 math and geometry library focusing on performance, safety and ease of use.

LMath is aiming to

  • Satisfy any use case with minimum code using templates.
  • Have many opted-in features that can be removed at precompile.
  • Gradually improve efficiency using its backend for better algorithms and targeting specific platforms.
  • Being backward compatible.

Highlights

  • Built from the grounds up using modern techniques for safety and convenience for an intuitive API.
  • Features are optional, reducing clutter and compilation time while solving large number of use cases.
  • High code reusability minimizing maintenance.
  • Compatible with existing systems for easy integration, e.g. use Cartesian notation or any user defined accessor notation.
  • Designed for 3D graphics.
  • Interface/ implementation separation, allows for instantiation specialization e.g. implementing SIMD instructions for matrix 4X4 multiplication for any data type while not changing the Interface.

Library overview

Class Description
Element Base class for all other classes used only for data manipulation
Vector Used for vector arithmetic logic
Quaternion A specialization of VectorBase<T,4> with several extra methods
Matrix Provides Matrix N X M of an arbitrary type
Bounds Arbitrary dimension bounding limits e.g. Line for 1D, rectangle for 2D or a box for 3D
LMathConfig Configuration file for changing the behvaiour of the library e.g. removing cartesian notation syntactic sugar

Vector and Quaternion examples

//Import LMath namespace
using namespace LMath;
//----------------------------------------------------
//Declare a set of helper class aliases.
using Vec3D = VectorBase<double, 3>;
using Vec2D = VectorBase<double, 2>;
using Quat = QuaternionBase<double>;
using Vec4D = VectorBase<double, 4>;
//----------------------------------------------------


// Construcut a vector with any argument permutation with smaller vectors or numbers.
Vec4D vec(Vec2D(1, 2), 3, 1);

/// Rotate the vector 30 degrees yaw and 25 degrees pitch
vec = Quat::FromEuler(Vec3D(25, 30, 0) * Constans::DegToRad) * vec;

//----------------------------------------------------

//Vector supports optional cartesian notation up to four dimensions (x,y,z,w)
Vec2D v2(1, 2);
bool equalsOne = v2.X() == 1; // O.K
//v2.Z() == 1; // compiler error, v2 has only X and Y components.


//----------------------------------------------------
//Any vector to any vector via explicit casting.
using Vec5I = VectorBase<int, 5>; //5 dimenstion integer vector.

//Conversion from 3D double vector to 5D integer vector integer to 3
Vec5I v5i = static_cast<Vec5I>(Vec3D(2.3, 1.1, 7.8));
std::cout << v5i.ToString();

//----------------------------------------------------
// Geometry operations
Vec3D vec3d(1, 2, 3);
Vec3D reflectionVector = vec3d.Reflect(Vec3D(0, 1, 0));
Vec3D cross = vec3d.Cross(reflectionVector);

Bounds examples

//BoundsBase is based upon VectorBase, same template rules applies.

//Declare a 2D rectangle type using float.
using RectF = BoundsBase<float, 2>;

//Declare a 3D bounding box type using double.
using BoundingBoxD = BoundsBase<double, 3>;

//declate a bounding box instance using two vectors (min and max).
BoundingBoxD bb = { {-1,-1,-1 },{5,5,5} };

//test for overlapping, should return true.
bool contains = bb.Contains({ { 0, 0, 0 }, { 1, 1, 1 } }) == BoundingBoxD::IntersectState::Overlap;

Getting involved

Visit our discord development forum

View or join our trello development board

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

LMath - Modern and lightweight cross-platform C++ 17 math and geometry library

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages