/***************************************************************************
* Complex.C                                                                *
*                                                                          *
* Complex numbers, complex arithmetic, and functions of a complex          *
* variable.                                                                *
*                                                                          *
*   HISTORY                                                                *
*      Name    Date        Description                                     *
*                                                                          *
*      arvo    03/02/2000  Initial coding.                                 *
*                                                                          *
*--------------------------------------------------------------------------*
* Copyright (C) 2000, James Arvo                                           *
*                                                                          *
* This program is free software; you can redistribute it and/or modify it  *
* under the terms of the GNU General Public License as published by the    *
* Free Software Foundation.  See http://www.fsf.org/copyleft/gpl.html      *
*                                                                          *
* This program is distributed in the hope that it will be useful, but      *
* WITHOUT EXPRESS OR IMPLIED WARRANTY of merchantability or fitness for    *
* any particular purpose.  See the GNU General Public License for more     *
* details.                                                                 *
*                                                                          *
***************************************************************************/
#include <util/Complex.h>

const Complex Complex::i( 0.0, 1.0 );

ostream &operator<<( ostream &out, const Complex &z )
    {
    out << form( "(%f,%f) ", z.Real(), z.Imag() );
    return out;
    }

Complex cos( const Complex &z )
    {
    return Complex( 
      cos( z.Real() ) * cosh( z.Imag() ), 
     -sin( z.Real() ) * sinh( z.Imag() )
      );
    }

Complex sin( const Complex &z )
    {
    return Complex( 
      sin( z.Real() ) * cosh( z.Imag() ), 
      cos( z.Real() ) * sinh( z.Imag() )
      );
    }

Complex cosh( const Complex &z )
    {
    return Complex( 
      cosh( z.Real() ) * cos( z.Imag() ), 
      sinh( z.Real() ) * sin( z.Imag() )
      );
    }

Complex sinh( const Complex &z )
    {
    return Complex( 
      sinh( z.Real() ) * cos( z.Imag() ), 
      cosh( z.Real() ) * sin( z.Imag() )
      );
    }

Complex log( const Complex &z )
    {
    float r = sqrt( z.Real() * z.Real() + z.Imag() * z.Imag() );
    float t = acos( z.Real() / r );
    if( z.Imag() < 0.0 ) t = 2.0 * 3.1415926 - t;
    return Complex( log(r), t );
    }

