/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
 */
package ejemplojframe;

import java.awt.Color;

import java.awt.Graphics;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

/**
 *
 * @author mario
 */
public class EjemploJFrame extends JFrame{

    int cx,cy,Rx,Ry;
    double A,B,acort;
    String titulo;
    int color;
    
    EjemploJFrame(String titulo,int rx,int ry,Color color,double a,double b,double ac,int ox,int oy){
        cx=ox;
        cy=oy;
        Rx=rx;
        Ry=ry;
        A=a;
        B=b;
        acort=ac;
        setSize(Rx,Ry);
        setTitle(titulo);
        setBackground(color);
        show();
    }
    
    public void paint(Graphics g){
      g.setColor(Color.green);   
      ejes3D(g);
      g.setColor(Color.white);
      
      /*for(double z=-100;z<=100;z+=10)
      for(double x=-500;x<=500;x+=1){
          double y=20*Math.sin(x/100*Math.PI);
          punto3D(x,y,z,g);
      }*/
      double xa,ya,za;
      xa=ya=za=0;
      for(double x=-4; x<=4; x+=0.1){
        for(double z=-4; z<=4; z+=0.1){
            double y=F1(x,z); 
            g.setColor(Color.red);
            if (z>-4)
              linea3D(x*100,y*100,z*100,xa*100,ya*100,za*100,g);
            xa=x;
            za=z;
            ya=y;
        }
      }
      
      for(double z=-4; z<=4; z+=0.1){
        for(double x=-4; x<=4; x+=0.1){
            double y=F1(x,z); 
            g.setColor(Color.red);
            if (x>-4)
              linea3D(x*100,y*100,z*100,xa*100,ya*100,za*100,g);
            xa=x;
            za=z;
            ya=y;
        }
      }
      
      g.setColor(Color.magenta);
      caja3D(0,0,0,100,100,100,g);
      
    }
    
    

    public double F3(double x, double z){
       return Math.sin(x/2)*Math.sin(z);
    }
    
    public double F2(double x, double z){
        return x*x-z*z;
    }
    
    public double F1(double x, double z){
        return -5*Math.cos((x*x+z*z)/4)/(3+x*x+z*z);
    }
    
    
    public void caja3D(double x1,double y1,double z1,double x2,double y2,double z2,Graphics g){
        linea3D(x1,y1,z1,x1,y1,z2,g);
        linea3D(x1,y1,z2,x2,y1,z2,g);
        linea3D(x2,y1,z2,x2,y1,z1,g);
        linea3D(x2,y1,z1,x1,y1,z1,g);
        linea3D(x1,y2,z1,x1,y2,z2,g);
        linea3D(x1,y2,z2,x2,y2,z2,g);
        linea3D(x2,y2,z2,x2,y2,z1,g);
        linea3D(x2,y2,z1,x1,y2,z1,g);
        linea3D(x1,y1,z1,x1,y2,z1,g);
        linea3D(x1,y1,z2,x1,y2,z2,g);
        linea3D(x2,y1,z2,x2,y2,z2,g);
        linea3D(x2,y1,z1,x2,y2,z1,g);
    }

    public void ejes3D(Graphics g){
        linea3D(0,0,0,2000,0,0,g);
        linea3D(0,0,0,0,2000,0,g);
        linea3D(0,0,0,0,0,-2000,g);    
    }
    
    public void punto3D(double x,double y,double z,Graphics g){
        double angA = this.A*Math.PI/180;
        double angB = this.B*Math.PI/180;
        int xd = obtenXd(x,y,z);
        int yd = obtenYd(x,y,z);
        g.drawRect(xd, yd, 1, 1);
    }
    
    public int obtenXd(double x,double y, double z){
        double angA = this.A*Math.PI/180;
        double angB = this.B*Math.PI/180;
        return (int)(this.cx + x*Math.cos(angB) + z*this.acort*Math.cos(angA));
    }
    
    public int obtenYd(double x, double y, double z){
        double angA = this.A*Math.PI/180;
        double angB = this.B*Math.PI/180;
        return (int)(this.cy-(y-x*Math.sin(angB)+z*this.acort*Math.sin(angA)));
    }
    
    public void linea3D(double x1,double y1,double z1,double x2,double y2,double z2,Graphics g){
        int xd1 = obtenXd(x1,y1,z1);
        int yd1 = obtenYd(x1,y1,z1);
        int xd2 = obtenXd(x2,y2,z2);
        int yd2 = obtenYd(x2,y2,z2);
        g.drawLine(xd1, yd1, xd2, yd2);
    }
    
    public static void main(String[] args) {
        // TODO code application logic here
        EjemploJFrame f=new EjemploJFrame("Desplegando en 3D",1200,1200,Color.black,30,30,1,600,600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           
    }
    
    
    
}
