70 template<
typename T =
double>
71 class __declspec(dllexport) Complex :
public std::complex<T>
74 using cplx =
typename std::enable_if<std::is_same<double, T>::value || std::is_same<float, T>::value || std::is_same<long double, T>::value, T>::type;
77 Complex() : complex<T>() {}
78 Complex(T p) : complex<T>(p) { _Val[
_RE] = p; _Val[
_IM] = 0.0; }
79 Complex(T tRe, T tIm) : complex<T>(tRe, tIm) {}
80 Complex(
const Complex<T>& p) {
85 T mag2()
const {
return _Val[
_RE] * _Val[
_RE] + _Val[
_IM] * _Val[
_IM]; }
86 T mag()
const {
return sqrt(_Val[
_RE] * _Val[
_RE] + _Val[
_IM] * _Val[
_IM]); }
91 T theta = acos(_Val[
_RE] / r);
93 if (sin(theta) - _Val[
_IM] / r < 10e-6)
96 return 2.0*
PI - theta;
99 void euler(T& r, T& theta)
107 if (std::is_same<double, T>::value)
108 return atan2(_Val[
_IM], _Val[
_RE]);
109 else if (std::is_same<float, T>::value)
110 return atan2f((
float)_Val[
_IM], (
float)_Val[
_RE]);
114 Complex<T> p(_Val[
_RE], _Val[
_IM]);
115 if (std::is_same<double, T>::value) {
116 _Val[
_RE] = std::exp(p._Val[
_RE]) * cos(p._Val[
_IM]);
117 _Val[
_IM] = std::exp(p._Val[
_RE]) * sin(p._Val[
_IM]);
120 _Val[
_RE] = std::expf(p._Val[
_RE]) * cos(p._Val[
_IM]);
121 _Val[
_IM] = std::expf(p._Val[
_RE]) * sin(p._Val[
_IM]);
126 Complex<T> conj()
const {
return Complex<T>(_Val[
_RE], -_Val[
_IM]); }
128 Complex<T>& operator()(T re, T im) {
136 Complex<T>& operator= (
const Complex<T>& p) {
143 Complex<T>& operator = (
const T& p) {
150 Complex<T>
operator+ (
const Complex<T>& p) {
151 Complex<T> n(_Val[
_RE] + p._Val[
_RE], _Val[
_IM] + p._Val[
_IM]);
156 Complex<T>&
operator+= (
const Complex<T>& p) {
164 Complex<T> n(_Val[
_RE] + p, _Val[
_IM]);
175 Complex<T>
operator- (
const Complex<T>& p) {
176 Complex<T> n(_Val[
_RE] - p._Val[
_RE], _Val[
_IM] - p._Val[
_IM]);
181 Complex<T>&
operator-= (
const Complex<T>& p) {
189 Complex<T> n(_Val[
_RE] - p, _Val[
_IM]);
201 Complex<T> n(_Val[
_RE] *
k, _Val[
_IM] *
k);
213 Complex<T>& operator = (
const std::complex<T>& p) {
220 Complex<T>
operator* (
const Complex<T>& p) {
221 const T tRe = _Val[
_RE];
222 const T tIm = _Val[
_IM];
224 Complex<T> n(tRe * p._Val[
_RE] - tIm * p._Val[
_IM], tRe * p._Val[
_IM] + tIm * p._Val[
_RE]);
229 Complex<T>&
operator*= (
const Complex<T>& p) {
230 const T tRe = _Val[
_RE];
231 const T tIm = _Val[
_IM];
233 _Val[
_RE] = tRe * p._Val[
_RE] - tIm * p._Val[
_IM];
234 _Val[
_IM] = tRe * p._Val[
_IM] + tIm * p._Val[
_RE];
240 Complex<T> n(_Val[
_RE] / p, _Val[
_IM] / p);
253 complex<T> a(_Val[
_RE], _Val[
_IM]);
254 complex<T> b(p._Val[
_RE], p._Val[
_IM]);
256 complex<T> c = a / b;
258 Complex<T> n(c._Val[
_RE], c._Val[
_IM]);
264 complex<T> a(_Val[
_RE], _Val[
_IM]);
265 complex<T> b(p._Val[
_RE], p._Val[
_IM]);
274 T& operator [](
const int idx) {
275 return this->_Val[idx];
278 bool operator < (const Complex<T>& p) {
279 return (_Val[
_RE] < p._Val[
_RE]);
283 return (_Val[
_RE] > p._Val[
_RE]);
286 operator unsigned char() {
291 return int(_Val[
_RE]);
294 friend Complex<T>
operator+ (
const Complex<T>&p,
const T q) {
295 return Complex<T>(p._Val[
_RE] + q, p._Val[
_IM]);
298 friend Complex<T>
operator- (
const Complex<T>&p,
const T q) {
299 return Complex<T>(p._Val[
_RE] - q, p._Val[
_IM]);
302 friend Complex<T>
operator* (
const T
k,
const Complex<T>& p) {
303 return Complex<T>(p) *=
k;
306 friend Complex<T>
operator* (
const Complex<T>& p,
const T
k) {
307 return Complex<T>(p) *=
k;
310 friend Complex<T>
operator* (
const Complex<T>& p,
const Complex<T>& q) {
311 return Complex<T>(p._Val[
_RE] * q._Val[
_RE] - p._Val[
_IM] * q._Val[
_IM], p._Val[
_RE] * q._Val[
_IM] + p._Val[
_IM] * q._Val[
_RE]);
314 friend Complex<T>
operator/ (
const Complex<T>& p,
const Complex<T>& q) {
315 return Complex<T>((1.0 / q.mag2())*(p*q.conj()));
318 friend Complex<T>
operator/ (
const Complex<T>& p,
const T& q) {
319 return Complex<T>(p._Val[
_RE] / q, p._Val[
_IM] / q);
322 friend Complex<T>
operator/ (
const T& p,
const Complex<T>& q) {
323 return Complex<T>(p / q._Val[
_RE], p / q._Val[
_IM]);
326 friend bool operator< (const Complex<T>& p,
const Complex<T>& q) {
327 return (p._Val[
_RE] < q._Val[
_RE]);
330 friend bool operator> (
const Complex<T>& p,
const Complex<T>& q) {
331 return (p._Val[
_RE] > q._Val[
_RE]);
337 #endif // !__complex_h_ ivec2 operator+=(ivec2 &a, const ivec2 &b)
ivec2 operator-(const ivec2 &a, const ivec2 &b)
ivec2 operator+(const ivec2 &a, const ivec2 &b)
ivec2 operator*(const ivec2 &a, const ivec2 &b)
vec2 operator/=(vec2 &a, const vec2 &b)
vec2 operator/(const vec2 &a, const vec2 &b)
ivec2 operator-=(ivec2 &a, const ivec2 &b)
int operator>(const ivec2 &a, const ivec2 &b)
void angle(const std::vector< Complex< T >> &src, std::vector< T > &dst)
ivec2 operator*=(ivec2 &a, const ivec2 &b)