Crates.io | g3 |
lib.rs | g3 |
version | 0.1.4 |
source | src |
created_at | 2022-10-30 02:57:23.49864 |
updated_at | 2023-02-26 23:06:02.90641 |
description | Neat library for computer graphics based on geometric algebra |
homepage | https://github.com/wrnrlr/g3 |
repository | https://github.com/wrnrlr/g3 |
max_upload_size | |
id | 701319 |
size | 230,110 |
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.
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.
The first thing to realise is that to represent all possible transformations of 3D space one needs an extra 4th dimension.
This library exports the following basic elements:
^
(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
&
(Regressive Product)Grade decreasing a & b = !(!a ^ !b)
|
(Inner/Dot Product)(De)similarity measure
*
ab = a|b + a^b
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⁻¹
!
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)
TODO
https://hamishtodd1.substack.com/p/a-clifford-algebra-encompassing-rotations https://enki.ws/ganja.js/examples/coffeeshop.html#ydDtaGu0a https://www.cs.jhu.edu/~misha/Fall09/Pinkall93.pdf https://enki.ws/ganja.js/examples/coffeeshop.html#0ZJ_tVsy9 https://twitter.com/EricLengyel/status/1627197102924369920/photo/1