simple-vec3-0.6: Three-dimensional vectors of doubles with basic operations

Data.Vec3

Contents

Description

Vec3 class and implementations.

The package provides two different implementations for Vec3 type class, which differ in storage scheme. Benchmarks are included for both. You most likely want to use CVec3 which is based on contiguous storage scheme and offers the best performance.

Synopsis

# Examples

>>> let v1 = (-1, 0.0,  0.2) :: TVec3
>>> let v2 = ( 1, 2.3,  5.0) :: TVec3
>>> let v3 = ( 1,   1, -0.2) :: TVec3


>>> v1 <+> v2
(0.0,2.3,5.2)


Dot product:

>>> v1 .* v2
0.0


Multiply by a scalar:

>>> v1 .^ 5
(-5.0,0.0,1.0)


Cross product:

>>> v1 >< v3
(-0.2,0.0,-1.0)


Matrix-vector product:

>>> diag 2 mxv v2
(2.0,4.6,10.0)


class Vec3 v where Source #

Three-dimensional vector, with an associated matrix type.

Minimal complete definition

Associated Types

data Matrix v Source #

Associated type for 3×3 matrix.

Methods

origin :: v Source #

Origin point (0, 0, 0).

fromXYZ :: (Double, Double, Double) -> v Source #

Construct a new vector from components.

toXYZ :: v -> (Double, Double, Double) Source #

Deconstruct a vector into components.

zipWith :: (Double -> Double -> Double) -> v -> v -> v Source #

Zip two vectors elementwise.

(<+>) :: v -> v -> v infixl 7 Source #

(<->) :: v -> v -> v infixl 7 Source #

Subtract two vectors.

(><) :: v -> v -> v infixl 8 Source #

Cross product.

(.^) :: v -> Double -> v infixl 9 Source #

Scale a vector.

(.*) :: v -> v -> Double infixl 8 Source #

Dot product.

norm :: v -> Double Source #

Euclidean norm of a vector.

normalize :: v -> v Source #

Produce unit vector with the same direction as the original one.

distance :: v -> v -> Double Source #

Distance between two points.

invert :: v -> v Source #

Invert the direction of a vector.

fromRows :: (v, v, v) -> Matrix v Source #

Construct a new matrix from rows.

toRows :: Matrix v -> (v, v, v) Source #

Deconstruct a matrix into rows.

dotM :: v -> v -> Matrix v -> Double Source #

Generic vector dot product.

Multiply the transpose of the first vector by the given matrix, then multiply the result by the second vector.

                    [ a11  a12  a13 ]   [ v2x ]
[               ]   [     ]
[ v1x  v1y  v1z ] . [ a21  a22  a23 ] . [ v2y ] = s
[               ]   [     ]
[ a31  a32  a33 ]   [ v2z ]


mxv :: Matrix v -> v -> v Source #

Multiply a matrix and a vector.

[ a11  a12  a13 ]   [ v2x ]   [ rx ]
[               ]   [     ]   [    ]
[ a21  a22  a23 ] . [ v2y ] = [ ry ]
[               ]   [     ]   [    ]
[ a31  a32  a33 ]   [ v2z ]   [ rz ]


Build a diagonal matrix from a number d.

[ d  0  0 ]
[         ]
[ 0  d  0 ]
[         ]
[ 0  0  d ]


vxv :: v -> v -> Matrix v Source #

Transpose a vector and multiply it by another vector, producing a matrix.

[ v1x ]                       [ r11  r12  r13 ]
[     ]                       [               ]
[ v1y ] . [ v2x  v2y  v2z ] = [ r21  r22  r23 ]
[     ]                       [               ]
[ v1z ]                       [ r31  r32  r33 ]


addM :: Matrix v -> Matrix v -> Matrix v Source #

Instances
 Source # Instance detailsDefined in Data.Vec3.Class Associated Typesdata Matrix TVec3 :: Type Source # MethodsfromXYZ :: (Double, Double, Double) -> TVec3 Source #toXYZ :: TVec3 -> (Double, Double, Double) Source #zipWith :: (Double -> Double -> Double) -> TVec3 -> TVec3 -> TVec3 Source # Source # Instance detailsDefined in Data.Vec3 Associated Typesdata Matrix CVec3 :: Type Source # MethodsfromXYZ :: (Double, Double, Double) -> CVec3 Source #toXYZ :: CVec3 -> (Double, Double, Double) Source #zipWith :: (Double -> Double -> Double) -> CVec3 -> CVec3 -> CVec3 Source #

# Implementations

data CVec3 Source #

Vec3 implementation with Unbox and Storable instances based on a single contiguous array storage scheme, suitable for use with Data.Vector.Unboxed and Data.Vector.Storable.

interface: [v1 x   y   z  ; v2 x   y   z  ...], length = N = M / 3
|   |   |       |   |   |
storage:   [  v1x v2y v2z ;   v2x v2y v2z ...], length = M


This implementation has the best performance.

Constructors

 CVec3 !Double !Double !Double
Instances
Vec3 implementation with Unbox instance based on default Unbox instance for tuples of arrays, which wraps a vector of tuples as a tuple of vectors.
interface:  [v1 (x, y, z); v2 (x, y, z) ...], length = N

You almost definitely want to use CVec3 instead as it has better performance.