#math #graphics #geometry

nightly g3

Neat library for computer graphics based on geometric algebra

4 releases

Uses new Rust 2021

0.1.3 Jan 11, 2023
0.1.2 Dec 30, 2022
0.1.1 Dec 3, 2022
0.1.0 Oct 30, 2022

#518 in Math

Download history 20/week @ 2022-10-28 3/week @ 2022-11-04 1/week @ 2022-11-11 3/week @ 2022-11-18 1/week @ 2022-11-25 27/week @ 2022-12-02 5/week @ 2022-12-09 2/week @ 2022-12-16 2/week @ 2022-12-23 28/week @ 2022-12-30 27/week @ 2023-01-06 10/week @ 2023-01-13 3/week @ 2023-01-20

68 downloads per month

ISC license

145KB
3K SLoC

g3

This is a neat library for 3D computer graphics based on geometric algebra for the Rust programing language. Specifically it implements the plane-based projective geometric-algebra aka. the Clifford Algebra with signature P(R*3,0,1). At first this may sound like a strange and esoteric idea to use in contrast to the linear algebra you might already be familiar with. However, one will find it to be a more intuitive and powerful formalism to describe operations for three-dimensional euclidean/flat space.

Let's break down what we mean by plane-based, projective and geometric-algebra in reverse order.

Geometric algebra

Of the history of mathematics it is often said that it where the Arabs or Indians that discovered the number zero. It might be hard for today's people with all their modern technology to fully appreciate the difficulties of solving quadratic equations using roman numerals. What was life like before GPS and mobile phones? Harder still to fathom that like the mathematicians of old, without the number zero, one is missing some numbers that can make life easier, and one is to take this quite literally.

Most know about Complex numbers as the non-real solution of equation x = √-1. Less known is the non-real solution for x = √1 called the Hyperbolic numbers and the non-real solution for x = √0 called the Dual numbers.

Together the complex numbers p, the hyperbolic numbers q and the dual numbers r describe a space Rp,q,r.

(Hyper)planes

Projections

The first thing to realise is that to represent all possible transformations of 3D space one needs an extra 4th dimension.

Elements

This library exports the following basic elements:

  • Plane: the basis vector from which all other elements are build
  • Line: the intersection of two planes
    There are two special cases for lines:
    • Branch, a line through the origin
    • Horizon, a line infinitely far away
  • Point: the intersection of three planes
  • Rotor: a rotation
  • Translator: a translation
  • Motor: a combination of a Rotor and a Translator

Geometric Operations

Meet Operation ^ (Exterior/Outer/Wedge Product)

Grade increasing The wedge product ^ (also known as the meet, exterior or outer) is bilinear, anti-symmetric, and extended to be associative. TODO

  • meet_plane_branch
  • meet_point_line anti_commute, a^b = -b^a associative (a^b)^c = a^(b^c) outer product with itself is 0, squares_to_zero, a ^ a = 0

Join Operator & (Regressive Product)

Grade decreasing a & b = !(!a ^ !b)

Contraction Operator | (Inner/Dot Product)

(De)similarity measure

Geometric Product *

ab = a|b + a^b

Sandwich Product a(b)

G3 is an oriented algebra where a plane has two sides, and reflecting a plane with itself result in switching those sides. a(a) = -1

A plane b perpendicular to a mirror a reflects to itself: -ab^(-a) = b a(b) = aba⁻¹

Dual Operator !

let a:Point = !plane(1.0, 0.0, 0.0, 0.0);
let p:Plane = !point(0.0, 1.0, 0.0)
let l:Line = !line(0.0, 1.0, 0.0, 0.0, 1.0, 0.0)

Get Started

TODO

https://enki.ws/ganja.js/examples/coffeeshop.html#ydDtaGu0a

Dependencies

~0–11MB
~197K SLoC