Move coordinate systems to Kinemat.Coordinates

This commit is contained in:
James Harton 2018-01-19 12:42:32 +13:00
parent f74836dfd3
commit e5b6b812d9
26 changed files with 90 additions and 81 deletions

View file

@ -1,5 +1,5 @@
defimpl Inspect, for: Kinemat.Cartesian do defimpl Inspect, for: Kinemat.Coordinates.Cartesian do
alias Kinemat.Cartesian alias Kinemat.Coordinates.Cartesian
import Inspect.Algebra import Inspect.Algebra
@spec inspect(Cartesian.t(), any) :: String.t() @spec inspect(Cartesian.t(), any) :: String.t()

View file

@ -1,5 +1,5 @@
defimpl Inspect, for: Kinemat.Cylindrical do defimpl Inspect, for: Kinemat.Coordinates.Cylindrical do
alias Kinemat.Cylindrical alias Kinemat.Coordinates.Cylindrical
import Inspect.Algebra import Inspect.Algebra
@spec inspect(Cylindrical.t(), any) :: String.t() @spec inspect(Cylindrical.t(), any) :: String.t()

View file

@ -1,4 +1,4 @@
defimpl Inspect, for: Kinemat.Spherical do defimpl Inspect, for: Kinemat.Coordinates.Spherical do
import Inspect.Algebra import Inspect.Algebra
@spec inspect(Angle.t(), any) :: String.t() @spec inspect(Angle.t(), any) :: String.t()

View file

@ -3,18 +3,17 @@ defmodule Kinemat do
quote do quote do
alias Kinemat.{ alias Kinemat.{
Point, Point,
Cartesian,
Cylindrical,
Spherical,
Orientation, Orientation,
Euler, Euler,
RotationMatrix, RotationMatrix,
Quaternion, Quaternion,
Sperical,
# Joint, Point, Prismatic, Radians, Revolute, Spherical, # Joint, Point, Prismatic, Radians, Revolute, Spherical,
Frame Frame
} }
import Angle.Sigil import Angle.Sigil
# import Kinemet.Sigil
end end
end end

View file

@ -1,4 +1,4 @@
defmodule Kinemat.Cartesian do defmodule Kinemat.Coordinates.Cartesian do
defstruct ~w(x y z)a defstruct ~w(x y z)a
alias __MODULE__ alias __MODULE__
@ -13,9 +13,8 @@ defmodule Kinemat.Cartesian do
## Examples ## Examples
iex> use Kinemat iex> Cartesian.init(3, 4, 5)
...> Cartesian.init(3, 4, 5) %Kinemat.Coordinates.Cartesian{x: 3, y: 4, z: 5}
%Kinemat.Cartesian{x: 3, y: 4, z: 5}
""" """
@spec init(number, number, number) :: t @spec init(number, number, number) :: t
def init(x, y, z) do def init(x, y, z) do
@ -27,8 +26,7 @@ defmodule Kinemat.Cartesian do
## Examples ## Examples
iex> use Kinemat iex> Cartesian.init(3, 4, 5)
...> Cartesian.init(3, 4, 5)
...> |> Cartesian.x() ...> |> Cartesian.x()
3 3
""" """
@ -40,8 +38,7 @@ defmodule Kinemat.Cartesian do
## Examples ## Examples
iex> use Kinemat iex> Cartesian.init(3, 4, 5)
...> Cartesian.init(3, 4, 5)
...> |> Cartesian.y() ...> |> Cartesian.y()
4 4
""" """
@ -53,8 +50,7 @@ defmodule Kinemat.Cartesian do
## Examples ## Examples
iex> use Kinemat iex> Cartesian.init(3, 4, 5)
...> Cartesian.init(3, 4, 5)
...> |> Cartesian.z() ...> |> Cartesian.z()
5 5
""" """

View file

@ -1,6 +1,7 @@
defmodule Kinemat.Cylindrical do defmodule Kinemat.Coordinates.Cylindrical do
defstruct ~w(radial azimuth vertical)a defstruct ~w(radial azimuth vertical)a
alias Kinemat.Cylindrical use Kinemat.Coordinates
alias __MODULE__
@moduledoc """ @moduledoc """
Describes a point in cylindrical coordinates. Describes a point in cylindrical coordinates.
@ -14,12 +15,12 @@ defmodule Kinemat.Cylindrical do
## Examples ## Examples
iex> Cylindrical.init(10, ~a(20)d, 30) iex> Cylindrical.init(10, ~a(20)d, 30)
%Kinemat.Cylindrical{radial: 10, %Cylindrical{radial: 10,
azimuth: ~a(20)d, azimuth: ~a(20)d,
vertical: 30} vertical: 30}
iex> Cylindrical.init(10, ~a(0.5)r, 30) iex> Cylindrical.init(10, ~a(0.5)r, 30)
%Kinemat.Cylindrical{radial: 10, %Cylindrical{radial: 10,
azimuth: ~a(0.5)r, azimuth: ~a(0.5)r,
vertical: 30} vertical: 30}
""" """

View file

@ -1,5 +1,5 @@
defmodule Kinemat.Spherical do defmodule Kinemat.Coordinates.Spherical do
alias Kinemat.Spherical alias __MODULE__
defstruct ~w(radial azimuth polar)a defstruct ~w(radial azimuth polar)a
@moduledoc """ @moduledoc """
@ -14,7 +14,7 @@ defmodule Kinemat.Spherical do
## Examples ## Examples
iex> Spherical.init(10, ~a(20)d, ~a(30)d) iex> Spherical.init(10, ~a(20)d, ~a(30)d)
%Kinemat.Spherical{radial: 10, %Kinemat.Coordinates.Spherical{radial: 10,
azimuth: ~a(20)d, azimuth: ~a(20)d,
polar: ~a(30)d} polar: ~a(30)d}
""" """

View file

@ -0,0 +1,11 @@
defmodule Kinemat.Coordinates do
@moduledoc """
Container module for Kinemat's coodinate representations.
"""
defmacro __using__(_opts) do
quote do
alias Kinemat.Coordinates.{Cartesian, Cylindrical, Spherical}
end
end
end

View file

@ -1,5 +1,6 @@
defmodule Kinemat.Frame do defmodule Kinemat.Frame do
use Kinemat use Kinemat
use Kinemat.Coordinates
defstruct ~w(point orientation)a defstruct ~w(point orientation)a
@moduledoc """ @moduledoc """

View file

@ -1,6 +0,0 @@
defmodule Kinemat.Helical do
@moduledoc """
Describes a helical joint.
FIXME Not yet done.
"""
end

View file

@ -17,8 +17,7 @@ defmodule Kinemat.HomogeneousTransformation do
Creating a homogeneous transformation from a nil rotation and nil offset Creating a homogeneous transformation from a nil rotation and nil offset
returns the identity matrix. returns the identity matrix.
iex> use Kinemat iex> point = Cartesian.init(0.0, 0.0, 0.0)
...> point = Cartesian.init(0.0, 0.0, 0.0)
...> orientation = Euler.init(:xyz, ~a(0), ~a(0), ~a(0)) ...> orientation = Euler.init(:xyz, ~a(0), ~a(0), ~a(0))
...> Frame.init(point, orientation) ...> Frame.init(point, orientation)
...> |> Kinemat.HomogeneousTransformation.to_homogeneous_transformation() ...> |> Kinemat.HomogeneousTransformation.to_homogeneous_transformation()

View file

@ -1,6 +1,6 @@
defimpl Kinemat.Point, for: Kinemat.Cartesian do defimpl Kinemat.Point, for: Kinemat.Coordinates.Cartesian do
import :math, only: [pow: 2, sqrt: 1, atan: 1, acos: 1] import :math, only: [pow: 2, sqrt: 1, atan: 1, acos: 1]
alias Kinemat.{Cartesian, Cylindrical, Spherical} use Kinemat.Coordinates
alias Angle.Radian alias Angle.Radian
@doc """ @doc """
@ -8,9 +8,9 @@ defimpl Kinemat.Point, for: Kinemat.Cartesian do
## Examples ## Examples
iex> Kinemat.Cartesian.init(1,2,3) iex> Cartesian.init(1,2,3)
...> |> Kinemat.Point.to_cartesian() ...> |> Kinemat.Point.to_cartesian()
%Kinemat.Cartesian{x: 1, y: 2, z: 3} %Cartesian{x: 1, y: 2, z: 3}
""" """
@spec to_cartesian(Cartesian.t()) :: Cartesian.t() @spec to_cartesian(Cartesian.t()) :: Cartesian.t()
def to_cartesian(%Cartesian{} = point), do: point def to_cartesian(%Cartesian{} = point), do: point
@ -20,9 +20,9 @@ defimpl Kinemat.Point, for: Kinemat.Cartesian do
## Examples ## Examples
iex> Kinemat.Cartesian.init(3, 4, 7) iex> Cartesian.init(3, 4, 7)
...> |> Kinemat.Point.to_cylindrical() ...> |> Kinemat.Point.to_cylindrical()
%Kinemat.Cylindrical{ %Cylindrical{
radial: 5.0, radial: 5.0,
azimuth: %Angle{r: 0.9272952180016122}, azimuth: %Angle{r: 0.9272952180016122},
vertical: 7} vertical: 7}
@ -39,9 +39,9 @@ defimpl Kinemat.Point, for: Kinemat.Cartesian do
## Examples ## Examples
iex> Kinemat.Cartesian.init(2,3,8) iex> Cartesian.init(2,3,8)
...> |> Kinemat.Point.to_spherical() ...> |> Kinemat.Point.to_spherical()
%Kinemat.Spherical{ %Spherical{
radial: 8.774964387392123, radial: 8.774964387392123,
azimuth: %Angle{r: 0.4234308319224211}, azimuth: %Angle{r: 0.4234308319224211},
polar: %Angle{r: 0.982793723247329}} polar: %Angle{r: 0.982793723247329}}

View file

@ -1,5 +1,5 @@
defimpl Kinemat.Point, for: Kinemat.Cylindrical do defimpl Kinemat.Point, for: Kinemat.Coordinates.Cylindrical do
alias Kinemat.{Cylindrical, Cartesian, Spherical} use Kinemat.Coordinates
alias Angle.Radian alias Angle.Radian
import :math, only: [atan: 1, pow: 2, sqrt: 1] import :math, only: [atan: 1, pow: 2, sqrt: 1]
import Kinemat.Trig, only: [sin: 1, cos: 1] import Kinemat.Trig, only: [sin: 1, cos: 1]
@ -15,7 +15,7 @@ defimpl Kinemat.Point, for: Kinemat.Cylindrical do
iex> Cylindrical.init(3, ~a(10)d, 9) iex> Cylindrical.init(3, ~a(10)d, 9)
...> |> Point.to_cylindrical() ...> |> Point.to_cylindrical()
%Kinemat.Cylindrical{ %Cylindrical{
azimuth: ~a(10)d, azimuth: ~a(10)d,
radial: 3, radial: 3,
vertical: 9} vertical: 9}
@ -30,7 +30,7 @@ defimpl Kinemat.Point, for: Kinemat.Cylindrical do
iex> Cylindrical.init(3, ~a(10)d, 9) iex> Cylindrical.init(3, ~a(10)d, 9)
...> |> Point.to_cartesian() ...> |> Point.to_cartesian()
%Kinemat.Cartesian{x: 2.954423259036624, y: 0.520944533000791, z: 9} %Cartesian{x: 2.954423259036624, y: 0.520944533000791, z: 9}
""" """
@spec to_cartesian(Cylindrical.t()) :: Cartesian.t() @spec to_cartesian(Cylindrical.t()) :: Cartesian.t()
def to_cartesian(%Cylindrical{radial: r, azimuth: theta, vertical: z}) do def to_cartesian(%Cylindrical{radial: r, azimuth: theta, vertical: z}) do
@ -44,9 +44,9 @@ defimpl Kinemat.Point, for: Kinemat.Cylindrical do
## Examples ## Examples
iex> Kinemat.Cylindrical.init(3, ~a(20)d, 4) iex> Cylindrical.init(3, ~a(20)d, 4)
...> |> Kinemat.Point.to_spherical() ...> |> Point.to_spherical()
%Kinemat.Spherical{ %Spherical{
azimuth: ~a(0.6435011087932844)r, azimuth: ~a(0.6435011087932844)r,
polar: ~a(20)d, polar: ~a(20)d,
radial: 5.0} radial: 5.0}

View file

@ -1,5 +1,5 @@
defimpl Kinemat.Point, for: Kinemat.Spherical do defimpl Kinemat.Point, for: Kinemat.Coordinates.Spherical do
alias Kinemat.{Spherical, Cylindrical, Cartesian} use Kinemat.Coordinates
import Kinemat.Trig, only: [sin: 1, cos: 1] import Kinemat.Trig, only: [sin: 1, cos: 1]
@moduledoc """ @moduledoc """
@ -11,9 +11,9 @@ defimpl Kinemat.Point, for: Kinemat.Spherical do
## Examples ## Examples
iex> Kinemat.Spherical.init(8, ~a(30)d, ~a(20)d) iex> Spherical.init(8, ~a(30)d, ~a(20)d)
...> |> Kinemat.Point.to_cylindrical() ...> |> Kinemat.Point.to_cylindrical()
%Kinemat.Cylindrical{ %Cylindrical{
azimuth: ~a(20)d, azimuth: ~a(20)d,
radial: 3.9999999999999996, radial: 3.9999999999999996,
vertical: 6.92820323027551} vertical: 6.92820323027551}
@ -33,9 +33,9 @@ defimpl Kinemat.Point, for: Kinemat.Spherical do
## Examples ## Examples
iex> Kinemat.Spherical.init(12, ~a(20)d, ~a(60)d) iex> Spherical.init(12, ~a(20)d, ~a(60)d)
...> |> Kinemat.Point.to_cartesian() ...> |> Kinemat.Point.to_cartesian()
%Kinemat.Cartesian{ %Cartesian{
x: 2.052120859954013, x: 2.052120859954013,
y: 3.554377592712286, y: 3.554377592712286,
z: 11.276311449430901} z: 11.276311449430901}
@ -53,9 +53,9 @@ defimpl Kinemat.Point, for: Kinemat.Spherical do
## Examples ## Examples
iex> Kinemat.Spherical.init(12, ~a(20)d, ~a(60)d) iex> Spherical.init(12, ~a(20)d, ~a(60)d)
...> |> Kinemat.Point.to_spherical() ...> |> Kinemat.Point.to_spherical()
%Kinemat.Spherical{ %Spherical{
azimuth: ~a(20)d, azimuth: ~a(20)d,
polar: ~a(60)d, polar: ~a(60)d,
radial: 12} radial: 12}

View file

@ -1,6 +0,0 @@
defmodule Kinemat.Prismatic do
@moduledoc """
Describes a kinematic joint.
FIXME Not yet done.
"""
end

View file

@ -0,0 +1,6 @@
defmodule KinematCoordinatesCartesianTest do
use ExUnit.Case
use Kinemat
use Kinemat.Coordinates
doctest Kinemat.Coordinates.Cartesian
end

View file

@ -0,0 +1,6 @@
defmodule KinematCoordinatesCylindricalTest do
use ExUnit.Case
use Kinemat
use Kinemat.Coordinates
doctest Kinemat.Coordinates.Cylindrical
end

View file

@ -0,0 +1,6 @@
defmodule KinematCoordinatesSphericalTest do
use ExUnit.Case
use Kinemat
use Kinemat.Coordinates
doctest Kinemat.Coordinates.Spherical
end

View file

@ -1,5 +0,0 @@
defmodule KinematCylindricalTest do
use ExUnit.Case
use Kinemat
doctest Kinemat.Cylindrical
end

View file

@ -1,5 +1,6 @@
defmodule KinematFrameTest do defmodule KinematFrameTest do
use ExUnit.Case use ExUnit.Case
use Kinemat use Kinemat
use Kinemat.Coordinates
doctest Kinemat.Frame doctest Kinemat.Frame
end end

View file

@ -1,5 +1,6 @@
defmodule KinematHomogeneousTransformationTest do defmodule KinematHomogeneousTransformationTest do
use ExUnit.Case use ExUnit.Case
use Kinemat use Kinemat
use Kinemat.Coordinates
doctest Kinemat.HomogeneousTransformation doctest Kinemat.HomogeneousTransformation
end end

View file

@ -1,5 +1,6 @@
defmodule Kinemat.Point.CartesianTest do defmodule Kinemat.Point.CartesianTest do
use ExUnit.Case use ExUnit.Case
use Kinemat use Kinemat
doctest Kinemat.Point.Kinemat.Cartesian use Kinemat.Coordinates
doctest Kinemat.Point.Kinemat.Coordinates.Cartesian
end end

View file

@ -1,5 +1,6 @@
defmodule Kinemat.Point.CylindricalTest do defmodule Kinemat.Point.CylindricalTest do
use ExUnit.Case use ExUnit.Case
use Kinemat use Kinemat
doctest Kinemat.Point.Kinemat.Cylindrical use Kinemat.Coordinates
doctest Kinemat.Point.Kinemat.Coordinates.Cylindrical
end end

View file

@ -1,5 +1,6 @@
defmodule Kinemat.Point.SphericalTest do defmodule Kinemat.Point.SphericalTest do
use ExUnit.Case use ExUnit.Case
use Kinemat use Kinemat
doctest Kinemat.Point.Kinemat.Spherical use Kinemat.Coordinates
doctest Kinemat.Point.Kinemat.Coordinates.Spherical
end end

View file

@ -1,5 +1,6 @@
defmodule KinematPointTest do defmodule KinematPointTest do
use Kinemat use Kinemat
use Kinemat.Coordinates
use ExUnit.Case use ExUnit.Case
defp pretty_much_equal(lhs, rhs) when is_number(lhs) and is_number(rhs) do defp pretty_much_equal(lhs, rhs) when is_number(lhs) and is_number(rhs) do

View file

@ -1,5 +0,0 @@
defmodule KinematSphericalTest do
use ExUnit.Case
use Kinemat
doctest Kinemat.Spherical
end