import java.awt.*;
/** 
 * Model desno rocnega koordinatnega sistema v 3D prostoru. 
 * (Right Hand Coordinate System) 
 */
public class Rhcs {

    /**
     * Polje enoznacnih imen koordinatnih osi. 
     * Privzeta imena so x, y, z (v tem vrstnem redu).
     */
	public char axis[] = {'x','y','z'};
    
    /**
     * Koordinatna ravnina.
     */
	public Ravnina xy,xz,yz;
    
    /**
     * Polje ravnin mejnega kvadra.
     */
	public Ravnina rv[] = new Ravnina[6];
    
    /**
     * Polje oglisc <a href="Ravnina.html#op">poligona</a>
     * ravnine v 3D prostoru.
     */
	public Tocka op[] = new Tocka[5];
	Tocka t[] = new Tocka[10];
    
    /**
     * Postavi in inicializira model koordinatnega sistema.
     * Mejni kvader sistema je dolocen s tockama Dp in Dn.
     *@param Dp  dimenzija pozitivnih osi (max x, max y, max z)
     *@param Dn  dimenzija negativnih osi (min x, min y, min z)
     */
	public Rhcs(Tocka Dp,Tocka Dn) {
		// tocke koordinatnih osi:
		t[0] = new Tocka(0,0,0);		
		t[1] = new Tocka(Dp.x,0,0);		
		t[2] = new Tocka(0,Dp.y,0);
		t[3] = new Tocka(0,0,Dp.z);
		t[4] = new Tocka(Dn.x,0,0);
		t[5] = new Tocka(0,Dn.y,0);
		t[6] = new Tocka(0,0,Dn.z);
		// pozicija oznacb:
		t[7] = new Tocka(Dp.x * 1.3f,0,0);
		t[8] = new Tocka(0,Dp.y * 1.3f,0);
		t[9] = new Tocka(0,0,Dp.z * 1.3f);
		
		/*** op[] - oglisca poligonov ravnin: ***/
		
		// normale mejnih ravnin v smeri pozitivnih osi:
		op[0] = new Tocka(Dp);
		op[1] = new Tocka(Dp.x, Dn.y, Dp.z);
		op[2] = new Tocka(Dp.x, Dn.y, Dn.z);
		op[3] = new Tocka(Dp.x, Dp.y, Dn.z);
		op[4] = op[0];

		rv[0] = new Ravnina(op,5); // px
		
		op[0] = new Tocka(Dp);
		op[1] = new Tocka(Dp.x, Dp.y, Dn.z);
		op[2] = new Tocka(Dn.x, Dp.y, Dn.z);
		op[3] = new Tocka(Dn.x, Dp.y, Dp.z);
		op[4] = op[0];
		
		rv[1] = new Ravnina(op,5); // py
		
		op[0] = new Tocka(Dp);
		op[1] = new Tocka(Dn.x, Dp.y, Dp.z);
		op[2] = new Tocka(Dn.x, Dn.y, Dp.z);
		op[3] = new Tocka(Dp.x, Dn.y, Dp.z);
		op[4] = op[0];
		
		rv[2] = new Ravnina(op,5); // pz
		
		// normale mejnih ravnin v smeri negativnih osi:
		op[0] = new Tocka(Dn);
		op[1] = new Tocka(Dn.x, Dn.y, Dp.z);
		op[2] = new Tocka(Dn.x, Dp.y, Dp.z);
		op[3] = new Tocka(Dn.x, Dp.y, Dn.z);
		op[4] = op[0];
		
		rv[3] = new Ravnina(op,5); // nx
		
		op[0] = new Tocka(Dn);
		op[1] = new Tocka(Dp.x, Dn.y, Dn.z);
		op[2] = new Tocka(Dp.x, Dn.y, Dp.z);
		op[3] = new Tocka(Dn.x, Dn.y, Dp.z);
		op[4] = op[0];
		
		rv[4] = new Ravnina(op,5); // ny
		
		op[0] = new Tocka(Dn);
		op[1] = new Tocka(Dp.x, Dn.y, Dn.z);
		op[2] = new Tocka(Dp.x, Dp.y, Dn.z);
		op[3] = new Tocka(Dn.x, Dp.y, Dn.z);
		op[4] = op[0];
		
		rv[5] = new Ravnina(op,5); // nz
		
		// normale koordinatnih ravnin v smeri pozitivnih osi:
		op[0] = new Tocka(Dp.x, Dp.y, 0);
		op[1] = new Tocka(Dn.x, Dp.y, 0);
		op[2] = new Tocka(Dn.x, Dn.y, 0);
		op[3] = new Tocka(Dp.x, Dn.y, 0);
		op[4] = op[0];
		
		xy = new Ravnina(op,5);
		
		op[0] = new Tocka(Dp.x, 0, Dp.z);
		op[1] = new Tocka(Dp.x, 0, Dn.z);
		op[2] = new Tocka(Dn.x, 0, Dn.z);
		op[3] = new Tocka(Dn.x, 0, Dp.z);
		op[4] = op[0];
		
		xz = new Ravnina(op,5);
		
		op[0] = new Tocka(0, Dp.y, Dp.z);
		op[1] = new Tocka(0, Dn.y, Dp.z);
		op[2] = new Tocka(0, Dn.y, Dn.z);
		op[3] = new Tocka(0, Dp.y, Dn.z);
		op[4] = op[0];
		
		yz = new Ravnina(op,5);
	}
	
	/**
	 * Izrise koordinatno ravnino.
	 *@param g  graficni kontekst kamor naj izrise
	 *@param i  indeks prve osi ravnine (x - 0, y - 1, z - 2)
	 *@param j  indeks druge osi ravnine (x - 0, y - 1, z - 2)
	 *@param w  sirina canvasa
	 *@param h  visina canvasa
	 *@param x0  x translacija izhodisca glede na sredino canvasa 
	 *@param y0  y translacija izhodisca glede na sredino canvasa 
	 */
	public void draw2D(Graphics g,int i,int j,int w,int h,int x0,int y0) {

		if(i == 0 && j == 1) {
			g.setColor(Color.red);
		    g.drawLine( x0, h/2 + y0, w + x0, h/2 + y0);
		    g.drawLine( w/2 + x0, y0, w/2 + x0, h);
			
		    g.drawChars(axis,i,1, 1, h/2 + 10 + y0);
		    g.drawChars(axis,j,1, w/2 - 8 + x0, h - 4);
		}
//		if(i == 0 && j == 2) {
		else {
			g.setColor(Color.blue);
		    g.drawLine( x0, h/2 + y0, w + x0, h/2 + y0);
		    g.drawLine( w/2 + x0, y0, w/2 + x0, h);
			
		    g.drawChars(axis,i,1, 1, h/2 - 2 + y0);
		    g.drawChars(axis,j,1, w/2 - 8 + x0, 8);
		}
	}
	
	/**
	 * Izrise model koordinatnega sistema v 3D prostoru.
	 *@param g  graficni kontekst kamor naj izrise
	 *@param x0  x koordinata izhodisca na canvasu
	 *@param y0  y koordinata izhodisca na canvasu
	 *@param mat  matrika 3D transformacij
	 */
	public void draw3D(Graphics g,int x0,int y0,Matrix3D mat) {
/*		// rise ravnine mejnega kvadra:
		for(int i=0; i<rv.length; i++) {
			rv[i].draw3D(g,x0,y0,mat,Color.yellow);
		}
*/		// rise koor. ravnine:
		yz.draw3D(g,x0,y0,mat,Color.green);
		xz.draw3D(g,x0,y0,mat,Color.blue);
		xy.draw3D(g,x0,y0,mat,Color.red);
		
		// rise koor. osi:
		Tocka tt[] = mat.transform(t,10);	

		for(int i = 1; i < 7; i++) {
			if(tt[i].z < 0f) g.setColor(Color.gray);
		    else g.setColor(Color.black);
		    
		    g.drawLine((int)tt[0].x + x0,(int)-tt[0].y + y0,
		    		   (int)tt[i].x + x0,(int)-tt[i].y + y0);
		}		    
		for(int i = 7; i < 10; i++) {
			if(tt[i].z < 0f) g.setColor(Color.gray);
		    else g.setColor(Color.black);
		    
		    g.drawChars(axis,i-7,1,(int)tt[i].x + x0,(int)-tt[i].y + y0);
		}
	}
}
