Types which have an intrinsic notion of a "local origin", i.e. things which are not invariant under translation.
Class of types which have an intrinsic notion of a "local origin", i.e. things which are not invariant under translation, and which allow the origin to be moved.
One might wonder why not just use
Transformable instead of
having a separate class for
HasOrigin; indeed, for types which
are instances of both we should have the identity
moveOriginTo (origin .^+ v) === translate (negateV v)
The reason is that some things (e.g. vectors,
transformable but are translationally invariant, i.e. have no
Move the local origin to another point.
Note that this function is in some sense dual to
(for types which are also
Transformable); moving the origin
itself while leaving the object "fixed" is dual to fixing the
origin and translating the diagram.
|HasOrigin a => HasOrigin [a]|
|VectorSpace v => HasOrigin (Point v)|
|VectorSpace (V t) => HasOrigin (TransInv t)|
|HasLinearMap v => HasOrigin (Transformation v)|
|(InnerSpace v, AdditiveGroup (Scalar v), Fractional (Scalar v)) => HasOrigin (Bounds v)|
The local origin of a bounding function is the point with respect to which bounding queries are made, i.e. the point from which the input vectors are taken to originate.
|(AdditiveGroup (Scalar v), Fractional (Scalar v), InnerSpace v) => HasOrigin (NameMap v)|
|VectorSpace v => HasOrigin (Query v m)|
|(HasLinearMap v, InnerSpace v, OrderedField (Scalar v), Monoid m) => HasOrigin (AnnDiagram b v m)|
Every diagram has an intrinsic "local origin" which is the basis for all combining operations.
Translate the object by the translation that sends the origin to
the given point. Note that this is dual to
moveOriginTo, i.e. we
moveTo (origin .^+ v) === moveOriginTo (origin .^- v)
For types which are also
Transformable, this is essentially the
moveTo (origin .^+ v) === translate v