Transformations
Transformations is an Elixir library for translating, rotating, reflecting, scaling, shearing, projecting, orthogonalizing, and superimposing arrays of 3D homogeneous coordinates as well as for converting between rotation matrices, Euler angles, and quaternions. Also includes an Arcball control object and functions to decompose transformation matrices.
Installation
If available in Hex, the package can be installed
by adding transformations to your list of dependencies in mix.exs:
def deps do
[
{:transformations, "~> 0.1.0"}
]
endUsage
Create a matrix
matrix(mtx)
The following transformations are currently available:
transition(mtx, xt, yt, zt)
where xt, yt and zt are the x, y and z coordinates for the transform
scale(mtx, xs, ys, zs)
where xs, ys and zs are the scale factors along the x, y and z axes
rotatex(mtx, angle)
rotatey(mtx, angle)
rotatez(mtx, angle)
where angle refers to the angle of rotation along the specified axes
shearx(mtx, sy, sz)
sheary(mtx, sx, sz)
shearz(mtx, sx, sy)
where sx, sy and sz refer to the shear coefficients along each axis
mirrorx(mtx)
mirrors around the yz plane or the x-axis
mirrory(mtx)
mirrors around the xz plane or the y-axis
mirrorz(mtx)
mirrors around the xy plane or the z-axis
projectx(mtx)
projects down to the yz plane
projecty(mtx)
projects down to the xz plane
projectz(mtx)
projects down to the xy plane
Examples
Transformations can be applied to points as well as shapes. Points are specified as a 4 x 1 matrix while shapes are specified as a 4 x n matrix. Transformations are also 4 x 1 and 4 x n matrices respectively.
iex(1)> point = Transformations.matrix([[1],[1],[1],[1]])
#Matrex[4×1]
┌ ┐
│ 1.0 │
│ 1.0 │
│ 1.0 │
│ 1.0 │
└ ┘
iex(2)> point |> Transformations.scale(1,2,3)
#Matrex[4×1]
┌ ┐
│ 1.0 │
│ 2.0 │
│ 3.0 │
│ 1.0 │
└ ┘
iex(3)> point |> Transformations.scale(1,2,3) |> Transformations.transition(3,4,7)
#Matrex[4×1]
┌ ┐
│ 4.0 │
│ 6.0 │
│ 10.0 │
│ 1.0 │
└ ┘
iex(4)> shape = Transformations.matrix([
[0,1,1,0,0,1,1,0],
[0,0,0,0,1,1,1,1],
[0,0,1,1,0,0,1,1],
[1,1,1,1,1,1,1,1]
])
#Matrex[4×8]
┌ ┐
│ 0.0 1.0 1.0 0.0 0.0 1.0 1.0 0.0 │
│ 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 │
│ 0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 │
│ 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 │
└ ┘
iex(5)> shape |> Transformations.scale(1,2,3) |> Transformations.transition(3,4,7)
#Matrex[4×8]
┌ ┐
│ 3.0 4.0 4.0 3.0 3.0 4.0 4.0 3.0 │
│ 4.0 4.0 4.0 4.0 6.0 6.0 6.0 6.0 │
│ 7.0 7.0 10.0 10.0 7.0 7.0 10.0 10.0 │
│ 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 │
└ ┘
Generating documentation
mix docs