Euclid is a .NET library for calculating position and rotation in three-dimensional Euclidean spaces. It depends on .NET Standard 2.0.

Get started

Maroontress.Euclid is available as the NuGet-logo NuGet package.

Examples

Position and XYZ tuple

You can use the Position class and its extension methods to manipulate coordinates in three-dimensional space. Instances of the Position class are immutable objects, so the operations that return a Position object create a new instance as follows:

// 'p' represents (x, y, z) = (1, 2, 3).
var p = new Position(1, 2, 3);
// 'q' represents (x, y, z) = (4, 5, 6).
var q = new Position(4, 5, 6);
var r = p.Add(q);

// p == (1, 2, 3)
// q == (4, 5, 6)
// r == (5, 7, 9)

You can also use XYZ tuples with extension methods. Note that an XYZ tuple (structure) is not immutable. The extension methods do not change its value but return a new instance, as do the methods of the Position class as follows:

// 'p' represents (x, y, z) = (1, 2, 3).
var p = (1.0f, 2.0f, 3.0f);
// 'q' represents (x, y, z) = (4, 5, 6).
var q = (4.0f, 5.0f, 6.0f);
var r = p.Add(q);

// p == (1, 2, 3)
// q == (4, 5, 6)
// r == (5, 7, 9)

Rotation

The Matrix33 class can be used as a rotation matrix to handle rotation in three-dimensional space. Note that the Matrix33 class itself can represent 3 × 3 square matrices.

You can create an instance with three column vectors as follows:

var x = new Position(1, 1, 1).Normalize();
var y = new Position(-1, 0, 1).Normalize();
var z = x.CrossProduct(y);

// R = (X Y Z)
var r = new Matrix33(x, y, z);

Each column vector is a projection of a unit vector along the X, Y, and Z axes.

You can project positions with the rotation matrix as follows:

var m = new Matrix33(x, y, z);
var p = new Position(1, 1, 1);
var q = m.Map(p);

Instances of the Matrix33 class are immutable objects, so the operations that return objects of the Matrix33 class create new instances as follows:

var t = new Matrix33(x1, y1, z1);
var u = new Matrix33(x2, y2, z2);

// V = TU
var v = t.Mul(u);

Posture

Each instance of Posture class contains a pair of a position and a rotation matrix, which represents translation and rotation relative to the origin.

You can create a Posture instance with Position and Matrix33 objects as follows:

var p = new Position(...);
var r = new Matrix33(...);
var pose = new Posture(p, r);

The Posture object allows you to transform positions from a parent coordinate system to the child coordinate system, or vice versa.

Coordinate system

The instance of CoordinateSystem class represents a singly-linked list where each node contains a Posture object. The link of each coordinate system stands for its parent.

The World object is the head node of the list. Its parent is itself.

var sunPosture = new Posture(...);
var earthPosture = new Posture(...);
var moonPosture = new Posture(...);

var world = CoordinateSystem.World;
var sun = world.NewChild(sunPosture);
var earth = sun.NewChild(earthPosture);
var moon = earth.NewChild(moonPosture);

The CoordinateSystem object allows you to transform positions from the world coordinate system to the local coordinate system, or vice versa.

Documents

How to contribute

Please send us pull requests or issues from the GitHub icon GitHub repository.