Engineering School, 2nd year
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

178 lines
3.9 KiB

/**
* #(@)complex.cpp ENSICAEN 2005-02-27
*
* @author MASSE Nicolas (2005-Groupe4-LIMIN) <nicolas27.masse@laposte.net>
* @author LIMIN Thomas (2005-Groupe4-MASSE) <thomas.limin@laposte.net>
*
* ENSICAEN
* 6 Boulevard Marechal Juin
* F-14050 Caen Cedex
*
* Ce fichier est l'oeuvre d'eleves de l'ENSI de Caen. Il ne peut etre
* reproduit, utilise ou modifie sans l'avis express de ses auteurs.
*/
#include "complex.h"
#include <cmath>
using namespace std;
Complex::~Complex() {
cout << "---Complex[" << this << "](";
this->writeTo(cout);
cout << ")" << endl;
}
Complex::Complex(double re, double im) : _re(re), _im(im) {
cout << "+++Complex[" << this << "](" << re << ", " << im << ")" << endl;
}
Complex::Complex(const Complex & cpx) {
cout << "rrrComplex[" << this << "](";
cpx.writeTo(cout);
cout << ")" << endl;
this->setRealPart(cpx.getRealPart());
this->setImaginaryPart(cpx.getImaginaryPart());
}
double Complex::getRealPart() const {
return _re;
}
double Complex::getImaginaryPart() const {
return _im;
}
void Complex::setRealPart(double re) {
_re = re;
}
void Complex::setImaginaryPart(double im) {
_im = im;
}
double Complex::getMagnitude() const {
double re = this->getRealPart();
double im = this->getImaginaryPart();
return std::sqrt((re * re) + (im * im));
}
double Complex::getAngle() const {
double angle = 0;
double r = this->getRealPart();
double i = this->getImaginaryPart();
if (r == 0) {
if (i > 0) {
angle = M_PI_2;
} else if (i < 0) {
angle = - M_PI_2;
} else {
angle = FP_NAN;
}
} else if (r > 0) {
angle = std::atan(i / r);
} else {
if (i > 0) {
angle = M_PI - std::atan(i / r);
} else {
angle = - M_PI + std::atan(i / r);
}
}
return angle;
}
Complex Complex::rotate(Complex & c, double angle) const {
Complex tmp = (*this) - c;
Complex tmp2 = tmp * Complex(cos(angle), sin(angle));
return tmp2 + c;
}
void Complex::writeTo(std::ostream & output) const {
output << this->getRealPart() << " + i * " << this->getImaginaryPart();
}
Complex Complex::operator+(const Complex & c2) const {
return sum(*this, c2);
}
Complex Complex::operator-(const Complex & c2) const {
return ::minus(*this, c2);
}
Complex Complex::operator*(const Complex & c2) const {
return product(*this, c2);
}
Complex & Complex::operator=(const Complex & c2) {
cout << "===Complex[" << &c2 << "](";
c2.writeTo(cout);
cout << ") >> [" << this << "](";
this->writeTo(cout);
cout << ")"<< endl;
this->setImaginaryPart(c2.getImaginaryPart());
this->setRealPart(c2.getRealPart());
return *this;
}
void Complex::swapRealAndImaginaryPart() {
double tmp = this->getImaginaryPart();
this->setImaginaryPart(this->getRealPart());
this->setRealPart(tmp);
}
Complex product(const Complex & cpx1, const Complex & cpx2) {
double re1 = cpx1.getRealPart();
double re2 = cpx2.getRealPart();
double im1 = cpx1.getImaginaryPart();
double im2 = cpx2.getImaginaryPart();
return Complex((re1 * re2) - (im1 * im2), (re1 * im2) + (im1 * re2));
}
Complex sum(const Complex & cpx1, const Complex & cpx2) {
return Complex(cpx1.getRealPart() + cpx2.getRealPart(),
cpx1.getImaginaryPart() + cpx2.getImaginaryPart());
}
Complex minus(const Complex & cpx1, const Complex & cpx2) {
return Complex(cpx1.getRealPart() - cpx2.getRealPart(),
cpx1.getImaginaryPart() - cpx2.getImaginaryPart());
}
Complex normalize(Complex cpx) {
cout << "La normalisation a commence" << endl;
double mag = cpx.getMagnitude();
double r, i;
r = cpx.getRealPart() / mag;
i = cpx.getImaginaryPart() / mag;
return Complex(r, i);
}
Complex & getMax(Complex & c1, Complex & c2) {
Complex & max = c2;
if (c1.getMagnitude() > c2.getMagnitude()) {
max = c1;
}
return max;
}
void remplirTableau(int n, Complex * tab) {
int i;
for (i = 0; i < n; i++) {
tab[i] = Complex(i, 0);
}
}