mirror of
https://github.com/n5ac/mmvari.git
synced 2025-12-06 04:12:03 +01:00
189 lines
4.4 KiB
C++
189 lines
4.4 KiB
C++
//Copyright+LGPL
|
||
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
// Copyright 2000-2013 Makoto Mori, Nobuyuki Oba
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
// This file is part of MMVARI.
|
||
|
||
// MMVARI is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
|
||
// as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||
|
||
// MMVARI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||
|
||
// You should have received a copy of the GNU Lesser General Public License along with MMTTY. If not, see
|
||
// <http://www.gnu.org/licenses/>.
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
||
|
||
|
||
//---------------------------------------------------------------------------
|
||
#ifndef CLXH
|
||
#define CLXH
|
||
//---------------------------------------------------------------------------
|
||
///----------------------------------------------------------------
|
||
/// •¡‘f<E28098>”‰‰ŽZƒNƒ‰ƒX
|
||
class CLX {
|
||
public:
|
||
double r;
|
||
double j;
|
||
inline CLX(void){};
|
||
inline CLX(const double R){
|
||
r = R;
|
||
j = 0;
|
||
};
|
||
inline CLX(const double R, const double J){
|
||
r = R;
|
||
j = J;
|
||
};
|
||
inline CLX(CLX &ref){
|
||
r = ref.r;
|
||
j = ref.j;
|
||
};
|
||
inline void Add(const CLX &ref){
|
||
r += ref.r;
|
||
j += ref.j;
|
||
};
|
||
inline void Add(const double &R){
|
||
r += R;
|
||
};
|
||
inline void Sub(const CLX &ref){
|
||
r -= ref.r;
|
||
j -= ref.j;
|
||
};
|
||
inline void Sub(const double &R){
|
||
r -= R;
|
||
};
|
||
inline double Abs(void){
|
||
return sqrt(r * r + j * j);
|
||
};
|
||
inline double vAbs(void){
|
||
return r * r + j * j;
|
||
};
|
||
inline void Mul(CLX &z, const CLX &ref){
|
||
z.r = r * ref.r - j * ref.j;
|
||
z.j = r * ref.j + j * ref.r;
|
||
}
|
||
inline void Mul(const CLX &ref){
|
||
CLX z;
|
||
z.r = r * ref.r - j * ref.j;
|
||
z.j = r * ref.j + j * ref.r;
|
||
r = z.r; j = z.j;
|
||
};
|
||
void Div(const CLX &ref);
|
||
inline void Mul(const double &R){
|
||
r *= R; j *= R;
|
||
}
|
||
inline void Div(const double &R){
|
||
r /= R; j /= R;
|
||
}
|
||
CLX Sqrt(void);
|
||
inline void PhDiff(CLX &z, const CLX &ref){
|
||
z.r = r * ref.r + j * ref.j;
|
||
z.j = j * ref.r - r * ref.j;
|
||
|
||
};
|
||
inline double Phase(void){
|
||
if( r && j ){
|
||
return atan2(j, r);
|
||
}
|
||
else {
|
||
return 0;
|
||
}
|
||
};
|
||
inline CLX Ccor(CLX x, CLX y){
|
||
CLX z;
|
||
|
||
z.r = x.r * y.r + x.j * y.j;
|
||
z.j = x.r * y.j - x.j * y.r;
|
||
return z;
|
||
}
|
||
inline BOOL IsSame(const CLX &ref){
|
||
return ((r == ref.r) && (j == ref.j));
|
||
};
|
||
inline CLX& operator=(const CLX &ref){
|
||
if( this != &ref ){
|
||
r = ref.r;
|
||
j = ref.j;
|
||
}
|
||
return *this;
|
||
};
|
||
inline CLX& operator+=(const CLX &ref){
|
||
Add(ref);
|
||
return *this;
|
||
};
|
||
inline CLX& operator+=(const double R){
|
||
Add(R);
|
||
return *this;
|
||
};
|
||
inline CLX& operator-=(const CLX &ref){
|
||
Sub(ref);
|
||
return *this;
|
||
};
|
||
inline CLX& operator-=(const double R){
|
||
Sub(R);
|
||
return *this;
|
||
};
|
||
inline CLX& operator*=(const CLX &ref){
|
||
Mul(ref);
|
||
return *this;
|
||
};
|
||
inline CLX& operator*=(const double R){
|
||
Mul(R);
|
||
return *this;
|
||
};
|
||
inline CLX& operator/=(const CLX &ref){
|
||
Div(ref);
|
||
return *this;
|
||
};
|
||
inline CLX& operator/=(const double R){
|
||
Div(R);
|
||
return *this;
|
||
};
|
||
inline CLX operator+(const CLX &ref) const {
|
||
CLX a(r, j);
|
||
a+=ref;
|
||
return a;
|
||
};
|
||
inline CLX operator+(const double R) const {
|
||
CLX a(r, j);
|
||
a+=R;
|
||
return a;
|
||
};
|
||
inline CLX operator-(const CLX &ref) const {
|
||
CLX a(r, j);
|
||
a-=ref;
|
||
return a;
|
||
};
|
||
inline CLX operator-(const double R) const {
|
||
CLX a(r, j);
|
||
a-=R;
|
||
return a;
|
||
};
|
||
inline CLX operator*(const CLX &ref) const {
|
||
CLX a(r, j);
|
||
a*=ref;
|
||
return a;
|
||
};
|
||
inline CLX operator*(const double R) const {
|
||
CLX a(r, j);
|
||
a*=R;
|
||
return a;
|
||
};
|
||
inline CLX operator/(const CLX &ref) const {
|
||
CLX a(r, j);
|
||
a/=ref;
|
||
return a;
|
||
};
|
||
inline CLX operator/(const double R) const {
|
||
CLX a(r, j);
|
||
a/=R;
|
||
return a;
|
||
};
|
||
friend CLX operator+(const double R, const CLX &ref);
|
||
friend CLX operator-(const double R, const CLX &ref);
|
||
friend CLX operator*(const double R, const CLX &ref);
|
||
friend CLX operator/(const double R, const CLX &ref);
|
||
};
|
||
#endif
|