1
#include "../NKernel.h"
6
Complex::Complex(t_float re, t_float im)
12
Complex::Complex(const Complex& complex)
14
real_ = complex.real_;
15
imaginary_ = complex.imaginary_;
22
Complex& Complex::operator=(const Complex& complex)
24
real_ = complex.real_;
25
imaginary_ = complex.imaginary_;
30
/*const Complex Complex::operator + (const Complex& complex) const
34
result.real_ = real_ + complex.real_;
35
result.imaginary_ = imaginary_ + complex.imaginary_;
40
const Complex Complex::operator - (const Complex& complex) const
44
result.real_ = real_ - complex.real_;
45
result.imaginary_ = imaginary_ - complex.imaginary_;
50
const Complex Complex::operator*(const Complex& complex) const
55
a = real_; b = imaginary_;
56
c = complex.real_; d = complex.imaginary_;
58
result.real_ = (a*c - b*d);
59
result.imaginary_ = (a*d + b*c);
64
const Complex Complex::operator / (const Complex& complex) const
68
t_float inv_denominator;
70
a = real_; b = imaginary_;
71
c = complex.real_; d = complex.imaginary_;
72
inv_denominator = (t_float) 1.0 / (c*c + d*d);
74
result.real_ = (a*c + b*d) * inv_denominator;
75
result.imaginary_ = (b*c - a*d) * inv_denominator;
80
/*const Complex Complex::operator * (const t_float& f) const
84
result.real_ = real_ * f;
85
result.imaginary_ = imaginary_ * f;
90
/*const Complex Complex::operator / (const t_float& f) const
97
result.real_ = real_ / f ;
98
result.imaginary_ = imaginary_ / f;
103
void Complex::operator+=(const Complex& complex)
105
real_ += complex.real_;
106
imaginary_ += complex.imaginary_;
109
void Complex::operator-=(const Complex& complex)
111
real_ -= complex.real_;
112
imaginary_ -= complex.imaginary_;
115
void Complex::operator*=(const Complex& complex)
120
a = real_; b = imaginary_;
121
c = complex.real_; d = complex.imaginary_;
124
imaginary_ = (a*d + b*c);
127
void Complex::operator /= (const Complex& complex)
131
t_float inv_denominator;
133
//if(complex.real_ == 0 && complex.imaginary_ == 0)
136
a = real_; b = imaginary_;
137
c = complex.real_; d = complex.imaginary_;
138
inv_denominator = (t_float)1.0 / (c*c + d*d);
140
real_ = (a*c + b*d) * inv_denominator;
141
imaginary_ = (b*c - a*d) * inv_denominator;
144
/*void Complex::operator *= (const t_float& f)
150
/*void Complex::operator/=(const t_float& f)
155
real_ *= (t_float)1.0 / f;
156
imaginary_ *= (t_float)1.0 / f;
159
void Complex::conjugue()
161
imaginary_ = -imaginary_;
164
t_float Complex::absolute()
166
t_float x, y, result, temp;
168
x = (t_float) std::fabs(real_);
169
y = (t_float) std::fabs(imaginary_);
182
result = x * (t_float) std::sqrt(1.0+temp*temp);
187
result = y *(t_float) std::sqrt(1.0+temp*temp);
194
t_bool Complex::IsNull()
196
if((real_ == 0) && (imaginary_ == 0))
203
t_float Complex::real() const
208
t_float Complex::imaginary() const
213
void Complex::real(t_float r)
218
void Complex::imaginary(t_float i)
223
const Complex operator + (const Complex& lhs, const Complex& rhs)
225
return Complex(lhs.real() + rhs.real(), lhs.imaginary() + rhs.imaginary());
228
const Complex operator - (const Complex& lhs, const Complex& rhs)
230
return Complex(lhs.real() - rhs.real(), lhs.imaginary() - rhs.imaginary());
233
const Complex operator*(const Complex& lhs, const Complex& rhs)
238
a = lhs.real(); b = lhs.imaginary();
239
c = rhs.real(); d = rhs.imaginary();
241
result.real(a*c - b*d);
242
result.imaginary(a*d + b*c);
247
const Complex operator/(const Complex& lhs, const Complex& rhs)
251
t_float inv_denominator;
253
a = lhs.real(); b = lhs.imaginary();
254
c = rhs.real(); d = rhs.imaginary();
255
inv_denominator = (t_float) 1.0 / (c*c + d*d);
257
result.real((a*c + b*d) * inv_denominator);
258
result.imaginary((b*c - a*d) * inv_denominator);
262
/*fcomplex Cdiv(fcomplex a, fcomplex b)
267
if (fabs(b.r) >= fabs(b.i))
271
c.r = (a.r+r*a.i) / den;
272
c.i = (a.i-r*a.r) / den;
278
c.r = (a.r*r+a.i) / den;
279
c.i = (a.i*r-a.r) / den;
288
fcomplex Csqrt(fcomplex z)
293
if ((z.r == 0.0) && (z.i == 0.0))
300
w = sqrt( (sqrt( z.r*z.r + z.i*z.i ) + fabs(z.r)) * 0.5);
308
c.i = (z.i >= 0) ? w : -w;
309
c.r = z.i / (2.0*c.i);
317
fcomplex RCmul(t_float x, fcomplex a)
328
fcomplex Cinv( fcomplex z)
331
t_float s = 1.0 / (z.r*z.r + z.i*z.i);