import java.awt.*;

class DrawPad3D extends Canvas {
	Image offScrImg;
	Graphics gr;
	Rhcs cs;
	int prevx,prevy,x,y,m;
	float xtheta,ytheta;
	Matrix3D mat = new Matrix3D(),tmat = new Matrix3D();
	Tocka T1,T2,pt;
	Premica p;
	Ravnina rv;	
	
	DrawPad3D(int m,Tocka Dp,Tocka Dn) {
		resize(m,m);
		validate();
		setBackground(Color.lightGray);
		cs = new Rhcs(Dp,Dn);
		this.m = m;
		mat.xrot(110);
		mat.yrot(-140);
		mat.zrot(10);
		mat.scale(0.65f);
	}
	void set(Tocka P1,Tocka P2) {
		T1 = new Tocka(P1);
		T2 = new Tocka(P2);
   		p = new Premica(P1,P2,cs);
		if(rv != null) pt = p.intersec(rv);
	    repaint();
	}
	void set(Tocka P1,Vektor V) {
		T1 = new Tocka(P1);
		T2 = null;
   		p = new Premica(P1,V,cs);
		if(rv != null) pt = p.intersec(rv);
	    repaint();
	}
	void set(float x1,float y1,float z1,
	         float x2,float y2,float z2) {
		T1 = new Tocka(x1,y1,z1);
		T2 = new Tocka(x2,y2,z2);
   		p = new Premica(x1,y1,z1,x2,y2,z2,cs);
		if(rv != null) pt = p.intersec(rv);
	    repaint();
	}
	void set(Tocka P[]) {
		rv = new Ravnina(P);
		if(p != null) pt = p.intersec(rv);
	    repaint();
	}
    public boolean mouseDown(Event e, int x, int y) {
		prevx = x;
		prevy = y;
		return true;
    }
	public boolean mouseDrag(Event e,int x,int y) {
		xtheta = (prevy - y) * 360.0f / m;
		ytheta = (x - prevx) * 360.0f / m;
		tmat.unit();
		tmat.xrot(xtheta);
		tmat.yrot(ytheta);
		mat.mult(tmat);
	    repaint();
		prevx = x;
		prevy = y;
		return true;
	}
	void clear() {
		T1 = null;
		T2 = null;
		p = null;
		rv = null;
		pt = null;
		repaint();
    }
	public void update(Graphics g) {
    	offScrImg.getGraphics().clearRect(0,0,m,m);
		cs.draw3D(gr,m/2,m/2,mat);
		if(T1 != null) T1.draw3D(gr,m/2,m/2,mat,Color.black);
		if(T2 != null) T2.draw3D(gr,m/2,m/2,mat,Color.black);
   		if(p != null) p.draw3D(gr,m/2,m/2,mat,Color.black);
		if(rv != null) rv.draw3D(gr,m/2,m/2,mat,Color.magenta);
		if(pt != null) pt.draw3D(gr,m/2,m/2,mat,Color.magenta);
		paint(g);
	}
    public void paint(Graphics g) {
		if(offScrImg == null) {
			offScrImg = createImage(m,m);
			gr = offScrImg.getGraphics();
			cs.draw3D(gr,m/2,m/2,mat);
		}
		g.drawImage(offScrImg,0,0,null);
	}
}
