Copyright | (C) 2012-2013 Edward Kmett, |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | experimental |
Portability | non-portable |
Safe Haskell | Trustworthy |
Language | Haskell98 |
Plücker coordinates for lines in 3d homogeneous space.
- data Plucker a = Plucker !a !a !a !a !a !a
- squaredError :: (Eq a, Num a) => Plucker a -> a
- isotropic :: Epsilon a => Plucker a -> Bool
- (><) :: Num a => Plucker a -> Plucker a -> a
- plucker :: Num a => V4 a -> V4 a -> Plucker a
- plucker3D :: Num a => V3 a -> V3 a -> Plucker a
- parallel :: Epsilon a => Plucker a -> Plucker a -> Bool
- intersects :: (Epsilon a, Ord a) => Plucker a -> Plucker a -> Bool
- data LinePass
- passes :: (Epsilon a, Num a, Ord a) => Plucker a -> Plucker a -> LinePass
- quadranceToOrigin :: Fractional a => Plucker a -> a
- closestToOrigin :: Fractional a => Plucker a -> V3 a
- isLine :: Epsilon a => Plucker a -> Bool
- data Coincides a where
- p01 :: Lens' (Plucker a) a
- p02 :: Lens' (Plucker a) a
- p03 :: Lens' (Plucker a) a
- p10 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a)
- p12 :: Lens' (Plucker a) a
- p13 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a)
- p20 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a)
- p21 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a)
- p23 :: Lens' (Plucker a) a
- p30 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a)
- p31 :: Lens' (Plucker a) a
- p32 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a)
- e01 :: E Plucker
- e02 :: E Plucker
- e03 :: E Plucker
- e12 :: E Plucker
- e31 :: E Plucker
- e23 :: E Plucker
Documentation
Plücker coordinates for lines in a 3-dimensional space.
Plucker !a !a !a !a !a !a |
squaredError :: (Eq a, Num a) => Plucker a -> a Source
Valid Plücker coordinates p
will have squaredError
p ==
0
That said, floating point makes a mockery of this claim, so you may want to use nearZero
.
isotropic :: Epsilon a => Plucker a -> Bool Source
Checks if the line is near-isotropic (isotropic vectors in this quadratic space represent lines in real 3d space).
(><) :: Num a => Plucker a -> Plucker a -> a infixl 5 Source
This isn't th actual metric because this bilinear form gives rise to an isotropic quadratic space
plucker :: Num a => V4 a -> V4 a -> Plucker a Source
Given a pair of points represented by homogeneous coordinates generate Plücker coordinates for the line through them, directed from the second towards the first.
plucker3D :: Num a => V3 a -> V3 a -> Plucker a Source
Given a pair of 3D points, generate Plücker coordinates for the line through them, directed from the second towards the first.
Operations on lines
intersects :: (Epsilon a, Ord a) => Plucker a -> Plucker a -> Bool Source
Checks if two lines intersect (or nearly intersect).
Describe how two lines pass each other.
Coplanar | The lines are coplanar (parallel or intersecting). |
Clockwise | The lines pass each other clockwise (right-handed screw) |
Counterclockwise | The lines pass each other counterclockwise (left-handed screw). |
passes :: (Epsilon a, Num a, Ord a) => Plucker a -> Plucker a -> LinePass Source
Check how two lines pass each other. passes l1 l2
describes
l2
when looking down l1
.
quadranceToOrigin :: Fractional a => Plucker a -> a Source
The minimum squared distance of a line from the origin.
closestToOrigin :: Fractional a => Plucker a -> V3 a Source
The point where a line is closest to the origin.
isLine :: Epsilon a => Plucker a -> Bool Source
Not all 6-dimensional points correspond to a line in 3D. This predicate tests that a Plücker coordinate lies on the Grassmann manifold, and does indeed represent a 3D line.
When lines are represented as Plücker coordinates, we have the
ability to check for both directed and undirected
equality. Undirected equality between Line
s (or a Line
and a
Ray
) checks that the two lines coincide in 3D space. Directed
equality, between two Ray
s, checks that two lines coincide in 3D,
and have the same direction. To accomodate these two notions of
equality, we use an Eq
instance on the Coincides
data type.
For example, to check the directed equality between two lines,
p1
and p2
, we write, Ray p1 == Ray p2
.
Basis elements
p10 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) Source
These elements form an alternate basis for the Plücker space, or the Grassmanian manifold Gr(2,V4)
.
p10
::Num
a =>Lens'
(Plucker
a) ap20
::Num
a =>Lens'
(Plucker
a) ap30
::Num
a =>Lens'
(Plucker
a) ap32
::Num
a =>Lens'
(Plucker
a) ap13
::Num
a =>Lens'
(Plucker
a) ap21
::Num
a =>Lens'
(Plucker
a) a
p13 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) Source
These elements form an alternate basis for the Plücker space, or the Grassmanian manifold Gr(2,V4)
.
p10
::Num
a =>Lens'
(Plucker
a) ap20
::Num
a =>Lens'
(Plucker
a) ap30
::Num
a =>Lens'
(Plucker
a) ap32
::Num
a =>Lens'
(Plucker
a) ap13
::Num
a =>Lens'
(Plucker
a) ap21
::Num
a =>Lens'
(Plucker
a) a
p20 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) Source
These elements form an alternate basis for the Plücker space, or the Grassmanian manifold Gr(2,V4)
.
p10
::Num
a =>Lens'
(Plucker
a) ap20
::Num
a =>Lens'
(Plucker
a) ap30
::Num
a =>Lens'
(Plucker
a) ap32
::Num
a =>Lens'
(Plucker
a) ap13
::Num
a =>Lens'
(Plucker
a) ap21
::Num
a =>Lens'
(Plucker
a) a
p21 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) Source
These elements form an alternate basis for the Plücker space, or the Grassmanian manifold Gr(2,V4)
.
p10
::Num
a =>Lens'
(Plucker
a) ap20
::Num
a =>Lens'
(Plucker
a) ap30
::Num
a =>Lens'
(Plucker
a) ap32
::Num
a =>Lens'
(Plucker
a) ap13
::Num
a =>Lens'
(Plucker
a) ap21
::Num
a =>Lens'
(Plucker
a) a
p30 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) Source
These elements form an alternate basis for the Plücker space, or the Grassmanian manifold Gr(2,V4)
.
p10
::Num
a =>Lens'
(Plucker
a) ap20
::Num
a =>Lens'
(Plucker
a) ap30
::Num
a =>Lens'
(Plucker
a) ap32
::Num
a =>Lens'
(Plucker
a) ap13
::Num
a =>Lens'
(Plucker
a) ap21
::Num
a =>Lens'
(Plucker
a) a
p32 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) Source
These elements form an alternate basis for the Plücker space, or the Grassmanian manifold Gr(2,V4)
.
p10
::Num
a =>Lens'
(Plucker
a) ap20
::Num
a =>Lens'
(Plucker
a) ap30
::Num
a =>Lens'
(Plucker
a) ap32
::Num
a =>Lens'
(Plucker
a) ap13
::Num
a =>Lens'
(Plucker
a) ap21
::Num
a =>Lens'
(Plucker
a) a