 
/*
Klasa KomlepksanBroj enkapsulira osnovne operacije sa kompleksnim 
brojevima
 */

package polar;

public class KompleksanBroj {
   
    private double re, im; 
   
    /* 
      realni i imaginarni dio kompleksnog broja
      privatne varijable-koristimo metode realan() i imaginaran() 
      da dodjemo do njih

    */
 
    public double realan(){ return re;}
    public double imaginaran() {return im;} 

    /* 
    Konstruktor inicijalizira kompleksan broj  
    */
    
   public KompleksanBroj(double x, double y) {
        this.re = x;
        this.im = y;
    }

    /* 
      jos postoji opasnost da netko pozove defaultni konstruktor
      da to sprijecimo proglasimo ga privatnim -na taj nacin ga sakrijemo
    */
   private KompleksanBroj() {
       //prazna implementacija
    }

    //sada prelazimo na metode

   
    /*
    modul kompleksnog broja
    */

    public double modul() { 
          return Math.sqrt(re*re + im*im); 
    }

    /*
    Za razuman ispis kompleksnog broja  preradjujemo metodu toString iz
    klase Object.
    */

    public String toString() { 
        return  re + "+" +im+"*i " ;
  }
    
    /*
    Staticka metoda u klasi -zbraja dva kompleksna broja-kako je to staticka
    metoda nema trenutne instance (this) koristi se na ovaj nacin: 
      
            KompleksanBroj c =  KompleksanBroj.zbroj(a, b); 
            -objekt c se eksplicitno konstruira unutar metode zbroj sa new
            -prije smo to samo radili unutar metode main koja je takodjer   
             staticka
     */

    public static  KompleksanBroj zbroj( KompleksanBroj a,  KompleksanBroj b) {
        return new  KompleksanBroj(a.re + b.re, a.im + b.im); 
    }

   
 /*
    Nestaticka metoda u klasi -zbraja dva kompleksna broja-kako je to 
    nestaticka metoda imamo trenutne instancu (this) i zato je implementacija
    drugacija. Nacin koristenja je isti:  
          
            KompleksanBroj c =  b.zbroj(a);
	    -b je referenca na objekt iz klase KompleksanBroj
            -objekt c se eksplicitno konstruira unutar metode zbroj sa new
            
     */

    public   KompleksanBroj zbroj( KompleksanBroj a) {
        return new  KompleksanBroj(this.re + a.re, this.im + a.im); 
    }
   

    /** staticka metoda za mnozenje*/
    public static KompleksanBroj umnozak(KompleksanBroj a, KompleksanBroj b) {
        return new KompleksanBroj(a.re*b.re - a.im*b.im, a.re*b.im + 
 a.im*b.re);
    }

   /** nestaticka metoda za mnozenje*/
    public  KompleksanBroj umnozak(KompleksanBroj a) {
        return new KompleksanBroj(re*a.re - im*a.im, re*a.im + im*a.re);
    }
}
