Vectors
================================================================================
.. currentmodule:: ost.geom

The :class:`Vec2`, :class:`Vec3`, :class:`Vec4` classes implement vectors in 2, 
3 and four dimensions. They support basic arithmetic via overloaded operators. 
Essentially, the following basic operations are available:

 * adding and subtracting two vectors
 * negation
 * multiplying and dividing by scalar value

This is shown in the following example:

.. code-block:: python
   
   vec_a=geom.Vec2(1, 0)
   vec_b=geom.Vec2(0, 1)
   print(vec_a, vec_b)
   print(vec_a+vec_b)
   print(vec_a*3-vec_b)

The standard vector operations are implemented as :ref:`free standing functions 
<vector-functions>`:


.. code-block:: python
   
  vec_a=geom.Vec3(1, 0, 0)
  vec_b=geom.Vec3(0, 1, 0)
  
  print(geom.Dot(vec_a, vec_b))
  print(geom.Cross(vec_a, vec_b))
  
  print(geom.Normalize(geom.Vec3(1, 1, 0)))
  
  print(geom.Length(geom.Vec3(1, 1, 1)))


Vector Classes
--------------------------------------------------------------------------------
.. class:: Vec2([x=0.0, y=0.0, z=0.0])
           Vec2(vec)
           
   Real-valued vector in 2 dimensions.
   
   :param   x: x coordinate
   :type    x: float or int   
   :param   y: y coordinate
   :type    y: float or int
   :param vec: the coordinates are set to the coordinates of vec. If vec is a
               :class:`Vec2`, the coordinates are copied directly, If vec is a
               :class:`Vec3`, the x and y coordinates are set to the
               coordinates of vec and z is silently swallowed. If vec is of
               type :class:`Vec4`, x and y are divided by the homogenous
               coordinate w, raising a DivideByZeroException when w is zero.
   :type  vec: Vec2, Vec3 or Vec4
   
   .. attribute:: x

    The x-coordinate of the vector.

    :type: float

   .. attribute:: y

     The y-coordinate of the vector.
.. class:: Vec3([x=0.0, y=0.0, z=0.0])
           Vec3(vec)
    
    Real-valued vector in 3 dimensions.
        
    :param   x: x coordinate
    :param   y: y coordinate
    :param   z: z coordinate
    :param vec: the coordinates are set to the coordinates of vec. If vec is a
                :class:`Vec3`, the coordinates are copied directly, If vec is a
                :class:`Vec2`, the x and y coordinates are set to the
                coordinates of vec and z is initialized to zero. If vec is of
                type :class:`Vec4`, x, y and z are divided by homogenous
                coordinate w, raising a DivideByZeroException when w is zero.
    :type  vec: Vec2, Vec3 or Vec4
    
    .. attribute:: x
    
     The x-coordinate of the vector.
    
     :type: float or int
     
    .. attribute:: y
      
      The y-coordinate of the vector.
    
      :type: float or int
      
    .. attribute:: z
    
      The z-coordinate of the vector.
      
      :type: float or int

.. class:: Vec4([x=0.0, y=0.0, z=0.0, w=1.0])
           Vec4(vec)

    Real-valued vector in 4 dimensions.

    :param   x: x coordinate
    :type    x: float or int
    :param   y: y coordinate
    :type    y: float or int
    :param   z: z coordinate
    :type    z: float or int       
    :param   w: w (homogenous) coordinate
    :type    w: float or int       
    :param vec: the coordinates are set to the coordinates of vec. If vec is a
                :class:`Vec4`, the coordinates are copied directly, If vec is a
                :class:`Vec2`, the x and y coordinates are set to the
                coordinates of vec and z and w are initialized to 0 and 1,
                respectively. If vec is of type :class:`Vec4`, x, y and z are
                divided by homogenous coordinate w, raising a
                DivideByZeroException when w is zero.

    .. attribute:: x

     The x-coordinate of the vector.

     :type: float or int

    .. attribute:: y

      The y-coordinate of the vector.

      :type: float or int

    .. attribute:: z

      The z-coordinate of the vector.

      :type: float or int
  
    .. attribute:: w

      The homogenous coordinate.

      :type: float or int


.. _vector-functions:

Functions Operating on Vectors     
--------------------------------------------------------------------------------

.. function:: Cross(vec_a, vec_b)

   Cross product of `vec_a` and `vec_b`

   :type vec_a: Vec3
   :type vec_b: Vec3

.. function:: Dot(vec_a, vec_b)

   Dot (scalar) product of `vec_a` and `vec_b`

   :param vec_a: first vector
   :type  vec_a: Vec3
   :param vec_b: second vector
   :type  vec_b: Vec3

.. function:: Length(vec)

   Length of vector

   :param vec:
   :type  vec: Vec2, Vec3 or Vec4

.. function:: Length2(vec)

  Returns the squared length of `vec`

  :param vec:
  :type  vec: Vec2, Vec3 or Vec4

.. function:: Normalize(vec)

   Returns a normalized version of `vec`

   :param vec:  Vector to be normalized
   :type  vec: Vec2, Vec3 or Vec4