/*

      int z[][]={{-300,-300,-300,-300},
               {-150,-150,-150,-150},
               {150,150,150,150},
               {300,300,300,300}};
      int x[][]={{-300,-150,150,300},
               {-300,-150,150,300},
               {-300,-150,150,300},
               {-300,-150,150,300}};
      int y[][]={{0,0,0,0},
               {0,-800,-800,0},
               {0,-800,-800,0},
               {0,0,0,0}};
      ejes3D(Color.green,g);
      ParcheBezier(x,y,z,50,g); 

*/


public void ParcheBezier(int x[][],int y[][],int z[][],int n,Graphics g){
  double ds=1.0/n;
  double dt=1.0/n;
  double s=0,t=0,t2,t3,s2,s3;
  double As,Bs,Cs,Ds;
  double At,Bt,Ct,Dt;
  double BXA,BXB,BXC,BXD;
  double BYA,BYB,BYC,BYD;
  double BZA,BZB,BZC,BZD;

  int xd[][]=new int[n+1][n+1];
  int yd[][]=new int[n+1][n+1];
  int zd[][]=new int[n+1][n+1];
  for (int i=0;i<=n;i++){
    s=i*ds;
    s2=s*s;
    s3=s*s*s;
    As=  -s3+3*s2-3*s+1;
    Bs= 3*s3-6*s2+3*s;
    Cs=-3*s3+3*s2;
    Ds=   s3;

    BXA=As*x[0][0]+Bs*x[1][0]+Cs*x[2][0]+Ds*x[3][0];
    BXB=As*x[0][1]+Bs*x[1][1]+Cs*x[2][1]+Ds*x[3][1];
    BXC=As*x[0][2]+Bs*x[1][2]+Cs*x[2][2]+Ds*x[3][3];
    BXD=As*x[0][3]+Bs*x[1][3]+Cs*x[2][3]+Ds*x[3][3];

    BYA=As*y[0][0]+Bs*y[1][0]+Cs*y[2][0]+Ds*y[3][0];
    BYB=As*y[0][1]+Bs*y[1][1]+Cs*y[2][1]+Ds*y[3][1];
    BYC=As*y[0][2]+Bs*y[1][2]+Cs*y[2][2]+Ds*y[3][3];
    BYD=As*y[0][3]+Bs*y[1][3]+Cs*y[2][3]+Ds*y[3][3];

    BZA=As*z[0][0]+Bs*z[1][0]+Cs*z[2][0]+Ds*z[3][0];
    BZB=As*z[0][1]+Bs*z[1][1]+Cs*z[2][1]+Ds*z[3][1];
    BZC=As*z[0][2]+Bs*z[1][2]+Cs*z[2][2]+Ds*z[3][3];
    BZD=As*z[0][3]+Bs*z[1][3]+Cs*z[2][3]+Ds*z[3][3];


    for (int j=0;j<=n;j++){
      t=j*dt;
      System.out.println(t+" "+s); 
      t2=t*t;
      t3=t*t*t;
      At=  -t3+3*t2-3*t+1;
      Bt= 3*t3-6*t2+3*t;
      Ct=-3*t3+3*t2;
      Dt=   t3;

      xd[i][j]=(int)(BXA*At+BXB*Bt+BXC*Ct+BXD*Dt);
      yd[i][j]=(int)(BYA*At+BYB*Bt+BYC*Ct+BYD*Dt);
      zd[i][j]=(int)(BZA*At+BZB*Bt+BZC*Ct+BZD*Dt);

    } // for j
  } // for i
  
  for(int i=0;i<=n;i++)
    for(int j=0;j<n;j++)
       linea3D(xd[i][j],yd[i][j],zd[i][j],xd[i][j+1],yd[i][j+1],zd[i][j+1],g);
      

 
  for(int j=0;j<=n;j++)
    for(int i=0;i<n;i++)
       linea3D(xd[i][j],yd[i][j],zd[i][j],xd[i+1][j],yd[i+1][j],zd[i+1][j],g);
       
} // ParcheBezi
