Import fmit upstream version 0.97.6
[fmit.git] / libs / CppAddons / polar.h
1 // Copyright 2007 "Gilles Degottex"
2
3 // This file is part of "CppAddons"
4
5 // "CppAddons" is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation; either version 2.1 of the License, or
8 // (at your option) any later version.
9 //
10 // "CppAddons" is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19 #ifndef _polar_h_
20 #define _polar_h_
21
22 #include <cmath>
23 #include <complex>
24
25 #undef min
26 #undef max
27
28 namespace Math
29 {
30         template<typename Type>
31         struct polar
32         {
33                 Type mod;
34                 Type arg;
35
36                 polar(Type m, Type a) : mod(m), arg(a) {}
37
38                 polar(const std::complex<Type>& c){*this=c;}
39                 polar(){}
40
41                 polar<Type>& operator = (const std::complex<Type>& c){mod = sqrt(std::norm(c)); arg = std::arg(c); return *this;}
42         };
43
44         //! convert cartesian coordinates to polar coordinates
45 //      inline pair<double, double> cart2pol(double x, double y)
46 //      {
47 //              double m = sqrt(x*x+y*y);
48 //
49 //              if(m == 0.0)    return make_pair(m, 0.0);
50 //
51 //              double a = acos(x/m);
52 //
53 //              if(y < 0.0)             return make_pair(m, -a);
54 //
55 //              return make_pair(m, a);
56 //      }
57
58         template<typename Type> std::complex<Type> make_complex(const polar<Type>& p){return std::complex<Type>(p.mod*cos(p.arg), p.mod*sin(p.arg));}
59 }
60
61 #endif