-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Fancy type-system stuff for AC-Vector -- -- Adds various type-system tricks to AC-Vector. (Requires several -- language extensions, including type families.) Added missing -- Vector Point constraint to HasSpace class. -- Consequently removed HasSpace Range instance. Added -- unions method to BoundingBox class. Added -- axis_range function. @package AC-Vector-Fancy @version 2.4.0 -- | Various facilities for dealing with vectors, vector spaces and -- coordinate axies generically. module Data.Vector.Fancy -- | This class deals with any type that has a spatial dimensionallity. -- This includes coordinate transforms, bounding boxes, and so on. -- -- Null instances are provided for all the vector types. (E.g., Point -- Vector3 = Vector3.) class Vector (Point x) => HasSpace x where { type family Point x :: *; } -- | The X-axis (first axis). data AxisX AxisX :: AxisX -- | The Y-axis (second axis). data AxisY AxisY :: AxisY -- | The Z-axis (third axis). data AxisZ AxisZ :: AxisZ -- | The W-axis (fourth axis). data AxisW AxisW :: AxisW -- | Class for generically reading/writing vector coordinates. class VectorAxis vector axis get_coord :: VectorAxis vector axis => axis -> vector -> Scalar set_coord :: VectorAxis vector axis => axis -> Scalar -> vector -> vector -- | This class enables you to take a vector with N dimensions and project -- it into an N+1 dimensional space (and also take the inverse projection -- to get back again). class (Vector v, Vector (ProjectTo v)) => Project v where { type family ProjectTo v :: *; } orthographic_down :: Project v => ProjectTo v -> (v, Scalar) orthographic_up :: Project v => (v, Scalar) -> ProjectTo v perspective_down :: Project v => ProjectTo v -> (v, Scalar) perspective_up :: Project v => (v, Scalar) -> ProjectTo v instance Show AxisW instance Show AxisZ instance Show AxisY instance Show AxisX instance Project Vector3 instance Project Vector2 instance Project Vector1 instance VectorAxis Vector4 AxisW instance VectorAxis Vector4 AxisZ instance VectorAxis Vector3 AxisZ instance VectorAxis Vector4 AxisY instance VectorAxis Vector3 AxisY instance VectorAxis Vector2 AxisY instance VectorAxis Vector4 AxisX instance VectorAxis Vector3 AxisX instance VectorAxis Vector2 AxisX instance VectorAxis Vector1 AxisX instance HasSpace Vector4 instance HasSpace Vector3 instance HasSpace Vector2 instance HasSpace Vector1 -- | Generically handle transforms, and things that are transformable. module Data.Vector.Transform.Fancy -- | Class for transforms. class HasSpace t => Transform t transformP :: Transform t => t -> Point t -> Point t translateT :: Transform t => Point t -> t scaleT :: Transform t => Point t -> t scaleT_ :: Transform t => Scalar -> t -- | Class for performing rotationes. (The rotations that exist vary with -- the number of spatial dimensions available.) class Transform t => Rotate t axis1 axis2 rotateT :: (Rotate t axis1 axis2, Angle a) => axis1 -> axis2 -> a Scalar -> t -- | Class for things that can be transformed. Includes instances for all -- the vector types. class HasSpace x => Transformable x transform :: (Transformable x, Transform t, (Point t) ~ (Point x)) => t -> x -> x instance Rotate Transform4 AxisZ AxisW instance Rotate Transform4 AxisY AxisW instance Rotate Transform4 AxisY AxisZ instance Rotate Transform4 AxisX AxisW instance Rotate Transform4 AxisX AxisZ instance Rotate Transform4 AxisX AxisY instance Rotate Transform3 AxisY AxisZ instance Rotate Transform3 AxisX AxisZ instance Rotate Transform3 AxisX AxisY instance Rotate Transform2 AxisX AxisY instance Transformable Vector4 instance Transformable Vector3 instance Transformable Vector2 instance Transformable Vector1 instance Transform Transform4 instance HasSpace Transform4 instance Transform Transform3 instance HasSpace Transform3 instance Transform Transform2 instance HasSpace Transform2 instance Transform Transform1 instance HasSpace Transform1 -- | Convinience module providing all transform functionallity in one -- place. -- -- Note that the transform constructors and fields are not exported from -- here, since the names clash. However, -- Data.Vector.Transform.Fancy provides methods for constructing -- transforms generically, so that shouldn't be an issue. module Data.Vector.Transform -- | The type of 1D linear transformations. Essentially, this is applying a -- linear function to a number. -- -- Note the Monoid instance, which gives you access to the -- identity transform (mempty) and the ability to combine a -- series of transforms into a single transform (mappend). data Transform1 :: * -- | The type of 2D linear transformations. -- -- Note the Monoid instance, which gives you access to the -- identity transform (mempty) and the ability to combine a -- series of transforms into a single transform (mappend). data Transform2 :: * -- | The type of 3D linear transformations. -- -- Note the Monoid instance, which gives you access to the -- identity transform (mempty) and the ability to combine a -- series of transforms into a single transform (mappend). data Transform3 :: * -- | The type of 4D linear transformations. -- -- Note the Monoid instance, which gives you access to the -- identity transform (mempty) and the ability to combine a -- series of transforms into a single transform (mappend). data Transform4 :: * -- | Convinience module providing all directly vector-related -- functionallity in one place. module Data.Vector -- | Classes for generically handling bounding boxes, and things that -- possess bounding boxes. module Data.BoundingBox.Fancy -- | Class for dealing with bounding boxes. class HasSpace b => BoundingBox b bound_corners :: BoundingBox b => Point b -> Point b -> b bound_points :: BoundingBox b => [Point b] -> b min_point :: BoundingBox b => b -> Point b max_point :: BoundingBox b => b -> Point b within_bounds :: BoundingBox b => Point b -> b -> Bool union :: BoundingBox b => b -> b -> b isect :: BoundingBox b => b -> b -> Maybe b unions :: BoundingBox b => [b] -> b -- | Get a Range representing the extent of a bounding box on a -- specified coordinate axis. axis_range :: (BoundingBox bbox, VectorAxis (Point bbox) axis) => axis -> bbox -> Range -- | Class representing things that possess a bounding box. class HasSpace x => HasBBox x get_bbox :: (HasBBox x, BoundingBox b, (Point b) ~ (Point x)) => x -> b instance BoundingBox BBox4 instance HasSpace BBox4 instance BoundingBox BBox3 instance HasSpace BBox3 instance BoundingBox BBox2 instance HasSpace BBox2 instance BoundingBox BBox1 instance HasSpace BBox1 -- | Convinience module providing all bounding box functionallity in one -- place. module Data.BoundingBox -- | The BBox1 type is basically a Range, but all the -- operations over it work with Vector1 (which is really -- Scalar). While it's called a bounding box, a -- 1-dimensional box is in truth a simple line interval, just like -- Range. data BBox1 :: * -- | A BBox2 is a 2D bounding box (aligned to the coordinate axies). data BBox2 :: * -- | A BBox3 is a 3D bounding box (aligned to the coordinate axies). data BBox3 :: * -- | A BBox4 is a 4D bounding box (aligned to the coordinate axies). data BBox4 :: *