/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projet_freyja.nombre;

/**
 *
 * @author Shu
 */
public class Nombre {
    protected double partieReelle;
    protected double partieImaginaire;
    
    public Nombre() {
        
    }
    
    public Nombre(double partieReel, double partieImaginaire) {
            this.partieReelle = partieReel;
            this.partieImaginaire = partieImaginaire;
    }
    
    public Nombre(Nombre nbr) {
        this.partieReelle = nbr.getPartieReelle();
        this.partieImaginaire = nbr.getPartieImaginaire();
    }
    
    public double getPartieReelle() {
        return partieReelle;
    }

    public void setPartieReelle(double partieReelle) {
        this.partieReelle = partieReelle;
    }

    public double getPartieImaginaire() {
        return partieImaginaire;
    }

    public void setPartieImaginaire(double partieImaginaire) {
        this.partieImaginaire = partieImaginaire;
    }

    @Override
    public String toString() {
        return "( " + this.partieReelle + " : " + this.partieImaginaire + " )";
    }
    
    public Nombre additioner(Nombre nbr) {
        return new Nombre(this.partieReelle+nbr.getPartieReelle(), this.partieImaginaire+nbr.getPartieImaginaire());
    }
    
    public Nombre soustraction(Nombre nbr) {
        return new Nombre(this.partieReelle-nbr.getPartieReelle(), this.partieImaginaire-nbr.getPartieImaginaire());
    }
    
    public Nombre multiplication(Nombre nbr) {
        return new Nombre(this.partieReelle*nbr.getPartieReelle()-this.partieImaginaire*nbr.getPartieImaginaire(), this.partieReelle*nbr.getPartieImaginaire()+this.partieImaginaire*nbr.getPartieReelle());
    }
    
    public Nombre division(Nombre nbr) {
        return new Nombre((this.partieReelle*nbr.getPartieReelle()+this.partieImaginaire*nbr.getPartieImaginaire())/(nbr.getPartieReelle()*nbr.getPartieReelle()+nbr.getPartieImaginaire()*nbr.getPartieImaginaire()), (this.partieImaginaire*nbr.getPartieReelle()-this.partieReelle*nbr.getPartieImaginaire())/(nbr.getPartieReelle()*nbr.getPartieReelle()+nbr.getPartieImaginaire()*nbr.getPartieImaginaire()));
    }
    
    public double module() {
        return Math.sqrt(this.partieReelle*this.partieReelle+this.partieImaginaire*this.partieImaginaire);
    }
    
    public double argument() {
        if(this.partieReelle == 0 && this.partieImaginaire == 0) {
            return 0;
        } else if(this.partieReelle == 0 && this.partieImaginaire > 0) {
            return Math.PI/2.0;
        } else if(this.partieReelle == 0 && this.partieImaginaire < 0) {
            return -Math.PI/2.0;
        } else if(this.partieReelle > 0) {
            return Math.atan(this.partieImaginaire/this.partieReelle);
        } else {
            return Math.PI - Math.atan(this.partieImaginaire/this.partieReelle);
        }
    }
    
    public Nombre[] racine(int n) {
        Nombre[] racines = new Nombre[n];
        for(int i = 0; i < n; i++) {
            racines[i] = new Nombre(Math.pow(this.module(),1.0/n)*Math.cos((i*2.0*Math.PI+this.argument())/n), Math.pow(this.module(),1.0/n)*Math.sin((i*2.0*Math.PI+this.argument())/n));
        }
        return racines;
    }
}
