import java.awt.*;
import java.applet.*;
import java.util.*;
import java.lang.*;

class  ParametricSurface2
{
	static int l=0;
	static double temp[][];
	static double quad[][]= new double [4][4];
	
	
	
	static double xy[][]=new double[4][3];
	
	static int X[] = new int[4];
	static int Y[] = new int[4];

	
	static double tempM[]=new double[3];
	
	
	static double theta;
	static double phi;
	
	
	public static void draw(Graphics g, double matrix[][])
	{
		double e=0.05;
		for (double v = 0 ; v < 1 ; v += e)
   			for ( double u = 0 ; u < 1 ; u += e)
   			{

      			drawQuad(g,matrix,x(u,v),y(u,v),z(u,v),x(u+e,v),y(u+e,v),z(u+e,v),x(u+e,v+e),y(u+e,v+e),z(u+e,v+e),x(u,v+e),y(u,v+e),z(u,v+e));

      		}
    }

	
	public static void drawQuad(Graphics g, double matrix[][],double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double x4, double y4, double z4)
	{
		
  		
   		
		quad[0][0]=x1;
		quad[0][1]=y1;
		quad[0][2]=z1;
		quad[0][3]=1;
		
		quad[1][0]=x2;
		quad[1][1]=y2;
		quad[1][2]=z2;
		quad[1][3]=1;
		
		quad[2][0]=x3;
		quad[2][1]=y3;
		quad[2][2]=z3;
		quad[2][3]=1;
		
		quad[3][0]=x4;
		quad[3][1]=y4;
		quad[3][2]=z4;
		quad[3][3]=1;
		
   		Matrix3D.transform(quad[0],tempM,matrix);
   			
 		
   		for(int i=0;i<4;i++)
   			Matrix3D.transform(quad[i],xy[i],matrix);
  		for (int i = 0 ; i < 4 ; i++)
       	{
     		X[i] = (int) viewPortX(xy[i][0]);
      		Y[i] = (int) viewPortY(xy[i][1]);
   		}
   		
   		
 		
//  		g.drawPolygon(X,Y,4); 	
  		
   		
   			
		
	}
		
		
	public static double x(double u,double v)
	{
		return u;
		
	}
	
	public static double y(double u,double v)
	{
		return v;
	}
	
	public static double z(double u,double v)
	{
		return (u+v);
	}

	public static double viewPortX(double x)
	{

		return ( (500*x)+ (500/2) );	
	} 
	
	public static double viewPortY(double y)
	{

		return (-(500*y) + (500/2));
	} 
	
}

