Detección de la trayectória de un satélite (JAVA)

Segunda práctica de Inteligéncia Artificial 1. Se trata de calcular la trayectória de un satélite mediante un polinomio de grado 3 usando unas plantillas de texto como base.

Las plantillas son numéricas y están codificadas como la intensidad de cada punto.

Se detecta el perímetro donde hay mas intensidad, que significa que hay un satélite. Luego se calcula el radio y se hace la gausiana para encontrar el centro. A partir de todos los centros se recompone la trayectória.












 .  CUIDADO:
/!   El archivo "swing-layout-1.0.jar" es ESENCIAL para que funcione la GUI, pues es la API de NetBeans para
^^^   hacer ventanas. No se ha de borrar o automaticamente no se podrá ni compilar ni ejecutar la práctica.


Compilación Linux:
       CLASSPATH=".:swing-layout-1.0.jar" javac *.java

Ejecución Linux:
       CLASSPATH=".:swing-layout-1.0.jar" java menu1

Compilación Windows:
       @set CLASSPATH=".;swing-layout-1.0.jar"
       @javac *.java

Ejecución Windows:
       @set CLASSPATH=".;swing-layout-1.0.jar"
       @java menu1

Al ejecutar la práctica aparece una GUI.


Opciones de la GUI:

       Abajo a la izquierda se le ha de indicar el path donde encontrar los archivos de texto que simulan los fotogramas y el inicio del nombre. Ejemplos:
               Si están en /IA1 y los archivos son "img1.txt" ..... "imgxxx.txt" se pondrá "/IA1/img.
               Si están en C:\IA1 y los archivos son "ima1.txt" ..... "imaxxx.txt" se pondrá "C:\IA1\ima".

       Debajo de la ruta hay un cuadro donde debemos introducir el número de imágenes que habrá que leer.

       Se puede elegir si realizar un calculo inverso, en el caso de que la imágen sea vertical.

       Se puede elegir el número de imágenes a avanzar cuando se comprueba el error de los puntos, para ganar velocidad a costa de precisión.

       Se puede elegir el error deseado del algoritmo.

       Se puede elegir la precisión en el ajuste del algoritmo, tanto la inicial como la mínima (el algoritmo se ha implementado con precisión variable para ganar eficacia).

       Se pueden modificar los parámetros iniciales de la ecuación: a, b, c y d.

       Se puede elegir un numero máximo de iteraciones en el algoritmo de manera que se para cuando llega a tal número.



    Editado por Daniel el 23/11/2007 a las 09:47:43h.



public class PolRegresion {
  private double[] x;  //datos
  private double[] y;
  private int nDatos;
  double[][] m;    //matriz de los coeficientes
  double[] t;      //términos independientes
  public double[] a; //polinomio   a[0]+a[1]·x+a[2]·x2+...
  public int grado; //grado del polinomio

  public PolRegresion(double[] x, double[] y, int grado) {
    this.x=x;
    this.y=y;
    nDatos=x.length;
    this.grado=grado;
    t=new double[grado+1];
    m=new double[grado+1][grado+1];
    a=new double[grado+1];
  }
  private void coeficientes(){
    double[] s=new double[2*grado+1];
    double suma;
    for(int k=0; k<=2*grado; k++){
      suma=0.0;
      for(int i=0; i<nDatos; i++){
        suma+=potencia(x[i], k);
      }
      s[k]=suma;
    }
    for(int k=0; k<=grado; k++){
      suma=0.0;
      for(int i=0; i<nDatos; i++){
        suma+=potencia(x[i], k)*y[i];
      }
      t[k]=suma;
    }
    for(int i=0; i<=grado; i++){
      for(int j=0; j<=grado; j++){
        m[i][j]=s[i+j];
      }
    }
  }
  private double potencia(double base, int exp){
    double producto=1.0;
    for(int i=0; i<exp; i++){
      producto*=base;
    }
    return producto;
  }
//procedimiento de Siedel
  public void calculaPolinomio(){
    coeficientes();
//matriz
    double aux;
    for(int i=0; i<=grado; i++){
        aux=m[i][i];
      for(int j=0; j<=grado; j++){
        m[i][j]=-m[i][j]/aux;
      }
      t[i]=t[i]/aux;
      m[i][i]=0.0;
  }
//primera aproximación
  double[] p=new double[grado+1];
  p[0]=t[0];
  for(int i=1; i<=grado; i++){
    p[i]=t[i];
  }
//aproximaciones  sucesivas
  double error=0.0, maximo=0.0;
  do{
    error=0.0;
    maximo=0.0;
    for(int i=0; i<=grado; i++){
      a[i]=t[i];
      for(int j=0; j<i; j++){
        a[i]+=m[i][j]*a[j];
      }
      for(int j=i+1; j<=grado; j++){
        a[i]+=m[i][j]*p[j];
      }
      error=Math.abs((a[i]-p[i])/a[i]);
      if (error>maximo)   maximo=error;
    }
    for(int i=0; i<=grado; i++){
        p[i]=a[i];
    }
  }while(maximo>0.001);

}
}






















import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

/*
 * Satelite.java
 *
 * Created on 21 de diciembre de 2006, 13:05
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 *
 * @author David
 */
public class Satelite {
   
    // Parametros definidos por el usuario
    private String NombreImagenInicio;                  // Carpeta en la que estan las imagenes
    private int NImagenes;                              // N de imagenes que hay en la carpeta
    private int NImagenesASaltar;                       // N de imagenes a saltarse
    private int NImagenesUsadas;
    private int MaxIters;                               // Maximo de iteraciones del steepedascend
    private double PrecisionInicial;                    // Precision inicial del steepdascend
    private double IncrementoPrecision;                 // Incremento de precision del steepdascend
    private double MaxPrecision;                        // Maxima precision a la que deseamos llegar
    private double MaxError;                            // Error al que deseamos llegar
    private double[] parametros;                        // Array de parametros de la trayectoria
    private boolean inverso;
    private boolean resta=true;
   
    // Datos leidos de la carpeta o calculadios a partir de otros
    private int iniAncho=255;
    private int iniAlto=255;
    private int[][][] imagenes;                         // Array de matrices con las imagenes
    private double[][] centrosDouble;                   // Array de centros de los planetas
   
    private PolRegresion poli;                          // Polinomio por minimos cuadrados
    private double radio;                               // Radio del satelite
    private int xinicial, yinicial, incremento;
    private int [] x;                                   //
    private double [] y;                               // Salidas reales
    private double [] y1;                               // Salidas con el polinomio1
    private double [] y2;                               // Salidas con el polinomio2
    private double [] e1;                               // Errores del polinomio1 en cada punto
    private double [] e2;                               // Errores del polinomio2 en cada punto
    private double sumE1, sumE2;                        // Error de los polinomios
       
    /**
     * Creates a new instance of Satelite
     */
    public Satelite(String NombreImagenInicio, int NImagenes, int NImagenesASaltar, int MaxIters, double PrecisionInicial, double IncrementoPrecision, double MaxPrecision, double MaxError, double []parametros, boolean inverso) {
           
        // Variables
        this.NombreImagenInicio= NombreImagenInicio;
        this.NImagenes=NImagenes;
        this.NImagenesASaltar=NImagenesASaltar;
        this.MaxIters=MaxIters;
        this.PrecisionInicial=PrecisionInicial;
        this.IncrementoPrecision=IncrementoPrecision;
        this.MaxPrecision=MaxPrecision;
        this.MaxError=MaxError;
        this.parametros=parametros;
        this.NImagenesUsadas =(int)Math.floor(NImagenes/NImagenesASaltar);
        this.inverso=inverso;
       
        // Leemos las imagenes
        if (LeeImagenes()!=0)
            System.out.println("Error al leer las imagenes");
       
        // Calculamos los centros y radios de los satelites
        CalculaCentros(inverso);
        this.radio=CalculaRadios();
    }
   
   
    /** Lee un fichero de imagen y devuelve una matriz con los pixeles */
    private static int[][] LeeImagen(String fichero){
        // Declaramos las variables
        int[][] matriz = new int[255][255];
        String[] vector;
        int i=0, j=0;
           
        try{
            BufferedReader reader = new BufferedReader(new FileReader(fichero));
            while(j<255){
                String linea=reader.readLine();
                vector = linea.split(" ");
                while(i<255){
                    matriz[i][j]=Integer.parseInt(vector[i]);
                    i++;
                }
                i=0;
                j++;
            }
        }catch(Exception e){
                System.out.println("Error la funcion obtener_matriz");
                e.printStackTrace();
        }
        return matriz;
}

    /** Buscamos el eje vertical en el que se encuentra el planeta en una imagen */
    private static int busca_maxim_x(int[][] matriz){
        // Declaramos las variables
        int pos=0, valor_columna=0, maximo_columna=0, i=0, j=0;

        // Buscamos la columna que tiene valor maximo.
        while(i<matriz[0].length){
            while(j<matriz[0].length){
                valor_columna+=matriz[i][j];
                j++;
            }

            if(maximo_columna<valor_columna){
                pos=i;
                maximo_columna=valor_columna;
            }
            valor_columna=0;
            j=0;
            i++;
        }
        return pos;
    }

    /** Buscamos el eje vertical en el que se encuentra el planeta en una imagen */
    private static int busca_maxim_y(int[][] matriz){
        int pos=0, valor_fila=0, maximo_fila=0, i=0, j=0;
       
        // Buscamos la fila que tiene valor maximo.
        while(i<matriz[0].length){
            while(j<matriz[0].length){
                valor_fila+=matriz[j][i];
                j++;
            }
            if(maximo_fila<valor_fila){
                pos=i;
                maximo_fila=valor_fila;
            }
            valor_fila=0;
            j=0;
            i++;
        }
        return pos;
    }

   
    /** Lee las imagenes de los ficheros */
    private int LeeImagenes(){
        // Declaramos las variables
        this.imagenes=new int[NImagenesUsadas][255][255];
        int i=1, j=0;
       
        while (j<NImagenesUsadas) {
           
            // Abrimos el fichero
            String NombreImagenCompleto=NombreImagenInicio+i+".txt";
            File fichero=new File(NombreImagenCompleto);

            // Comprobamos que exista el fichero
            if(!fichero.exists()){
                System.out.print("El fichero '"+NombreImagenCompleto+"' no existe\n");
                return -1;
            }
           
            // Leemos la imagen
            imagenes[j]=LeeImagen(NombreImagenCompleto);
           
            // Avanzamos a la siguiente imagen
            j++;
            i+=NImagenesASaltar;
        }
        return 0;
    }
       
   
    /** Calcula los centros de los asteroides de una secuencia de imagenes */
    private void CalculaCentros(boolean inverso){
        // Declaramos las variables
        x = new int[NImagenesUsadas];
        y = new double[NImagenesUsadas];
       
        // Calculamos el centro de la primera imagen para tomar el punto como origen de coordenadas
        xinicial=busca_maxim_x(imagenes[0]);
        yinicial=busca_maxim_y(imagenes[0]);
        if (inverso) {
            parametros[0]=yinicial;
            incremento=xinicial;
        } else {
            parametros[0]=xinicial;
            incremento=yinicial;
        }
        // Calculamos los centros
        for (int i=0; i<NImagenesUsadas; i++) {
            if (inverso) {
                x[i]=busca_maxim_x(imagenes[i]);
                y[i]=busca_maxim_y(imagenes[i]);
            } else {
                y[i]=busca_maxim_x(imagenes[i]);
                x[i]=busca_maxim_y(imagenes[i]);
            }
        }
    }
       
    /** Calculo del radio del satelite como la media de los radios */
    private double CalculaRadios(){
        // Daclaramos las variables
        double[] radios=new double [imagenes.length];
        double radioMedio=0;
        int inicio=0, fin=0;
       
        // Recorremos todas las imagenes
        for (int i=0; i<imagenes.length; i++) {
            // Contamos el numero de pixels del diametro horizontal
            for (int j=0; j<(254); j++) {
                if(imagenes[i][x[i]][j]==0 && imagenes[i][x[i]][j+1]!=0) inicio=j;
                if(imagenes[i][x[i]][j]!=0 && imagenes[i][x[i]][j+1]==0) fin=j;
            }
            radios[i]=(fin-inicio)/2;
            radioMedio=radioMedio+fin-inicio;
           
        }
        radioMedio=radioMedio/imagenes.length/2;
        System.out.println("RadioMedio: "+radioMedio);
       
        return radioMedio;
}
   
    /** Calcula el valor de una gausiana con los parametros dados */
    private static double calculo_gauss(double x, int mu, double radio){

        // Calculamos el exponente de la gausiana: exp=-(0.5)*((x-mu)/radio)^2
        double exp=-(0.5)*Math.pow(((x-mu)/radio),2);
        // Calculamos el valor de la gausiana: (Ni/sqrt(2*pi)*radio)*e^(exp)
        double valor=(1/(Math.sqrt(2*3.1416159))*radio)*Math.exp(exp);

        // Calculamos para area=1 (Ni=1). Esto indica que el valor maximo de la gaussiana sera 0.4.

//        System.out.println("mu="+mu+"  x="+x+"   valor RADIO="+radio);
//        System.out.println("VALOR X-MU/RADIO="+Math.pow(((x-mu)/radio),2));
//        System.out.println("VALOR CARRO="+carro);
//        System.out.println("VALOR EXPONENTE="+Math.exp(carro));
//        System.out.println("VALOR GAUSIANA="+valor);

        // Devolvemos el valor de la gausiana con esos parametros
        return valor;
    }
   
    private double CalculaRadioGauss(){

        // La intensidad maxima de un pixel es 255
        // El valor maximo de una gausiana de area 1 es 0.4
       
        // Suponemos que la maxima intensidad de un pixel es 255 y para este valor el valor maximo d la gaussiana es 0.4 (en area =1)
        // Tenemos que calcular cual sera el valor de la gaussiana para el valor  promedio de la intensidad que pasemos a esta funcion
        // una vez sepamos el valor de la gaussiana -> podremos empezar con las  comparaciones que mas se parezcan con el radio calculado
        // mediante HILL CLIMBING (pq ya sabemos el estado final -> "el valor dela gaussiana").

        // valor_y es el valor que cobraria la intensidad del pixel central suponiendo que la intensidad maxima de pixel es 255 y que
        // para este valor su valor m†ximo de gaussiana es 0.4. Es decir transformamos el valor central de los .txt al valor que cobra
        // en la gaussiana.

        // Calculamos el valor medio de la intensidad de los centros de los satelites
        double media_maximos=0;
        for (int i=0; i<this.NImagenesUsadas; i++) {
            media_maximos+=imagenes[i][(int)x[i]][(int)y[i]];
        }
        media_maximos=media_maximos/this.NImagenesUsadas;
       
        // Obtenemos las coordenadas del centro del primer satelite
        int maxim_x=x[0];
        int maxim_y=(int)y[0];
       
        // Definimos las variables
        double radio=0;
        double valor_y=(media_maximos*0.4)/255;     // Estado objetivo
        int mu = maxim_y;
        double valor_x=maxim_x+mu;
        double error_minimo = 0.001;                // Error maximo admisible (Condicion de parada)
        double error=999999;                        // Error inicial
        double[] opc = new double[6];               // Posibles cambios en el radio (Hijos)
        int opci=0;
       
        // Mientras el error no sea admisible, vamos ajustando la gausiana
        while(error_minimo<error){

            // Calculamos el nuevo error para los 6 hijos (Valor de la gausiana - valor objetivo)
            opc[0]=Math.abs(calculo_gauss(valor_x, mu, radio+0.001)-valor_y);
            opc[1]=Math.abs(calculo_gauss(valor_x, mu, radio-0.001)-valor_y);
            opc[2]=Math.abs(calculo_gauss(valor_x, mu, radio+0.01)-valor_y);
            opc[3]=Math.abs(calculo_gauss(valor_x, mu, radio-0.01)-valor_y);
            opc[4]=Math.abs(calculo_gauss(valor_x, mu, radio+0.1)-valor_y);
            opc[5]=Math.abs(calculo_gauss(valor_x, mu, radio-0.1)-valor_y);

            // Nos quedamos con el hijo que más disminuya el error
            for(int i=0;i<6;i++) {
                if(error>opc[i]) {
                    error=opc[i];
                    opci=i;
                }
            }
            if (opci==0) radio=radio+0.001;
            if (opci==1) radio=radio-0.001;
            if (opci==2) radio=radio+0.01;
            if (opci==3) radio=radio-0.01;
            if (opci==4) radio=radio+0.1;
            if (opci==5) radio=radio-0.1;

            System.out.println("ELIJO ESTA OPCION: "+opci);
            System.out.println(valor_x+" -> valor X para gaussiana");
            System.out.println(error+" -> ERROR para el RADIO");
            System.out.println(radio+" -> RADIO en accion");
            System.out.println(media_maximos+" -> VALOR MAXIMO para calculo intesidad");
            System.out.println(valor_y+" -> VALOR Y | "+valor_x+" -> VALOR X | "+mu+" -> VALOR MU");
        }
        // Devolvemos el radio calculado
        return radio;
}
   
    /** Calcula el valor del polinomio en un punto */
    private static double CalculaValor(double[] parametros, int x){
        double valor=parametros[3]*Math.pow(x,3)+parametros[2]*Math.pow(x,2)+parametros[1]*x+parametros[0];
        return valor;
    }
   
    /** Calcula el error del polinomio respecto a todos los centros */
    private double CalculaError(double[] parametros, int[] x, double[] y, boolean resta){
        // Definimos las variables
        double[] error=new double [this.NImagenesUsadas];
        double errorAcumulado=0;
       
        // Calculamos el error que comete en cada punto de la trayectoria
        for (int i=0; i<NImagenesUsadas; i++) {
            if (resta)
                error[i]=CalculaValor(parametros, x[i]-(int)this.incremento)-y[i];
            else
                error[i]=CalculaValor(parametros, x[i])-y[i];
            error[i]=Math.abs(error[i]);
            errorAcumulado+=error[i];
        }
        errorAcumulado=errorAcumulado/NImagenesUsadas;
        return errorAcumulado;
    }

   
    private double CambiaParametros(double[] parametros, int[] x, double[] y, double precision){
        // Definimos las variables
        double[] NuevosParametros = new double[4];
        double[] aux = new double[4];
        double error, errorInicial;

        // Calculamos el error cometido
        error = CalculaError(parametros, x, y,resta);
        errorInicial=error;
       
        NuevosParametros[3]=parametros[3];
        NuevosParametros[2]=parametros[2];
        NuevosParametros[1]=parametros[1];
        NuevosParametros[0]=parametros[0];

        for (int ia=-1; ia<=1; ia++) {
            for (int ib=-1; ib<=1; ib++) {
                for (int ic=-1; ic<=1; ic++) {
                    aux[3]=NuevosParametros[3]+ia*(precision)*0.001;
                    aux[2]=NuevosParametros[2]+ib*(precision)*0.01;
                    aux[1]=NuevosParametros[1]+ic*(precision)*0.1;
                    aux[0]=NuevosParametros[0];
                    double errorObtenido=CalculaError(aux, x, y, resta);

                    if (errorObtenido<error) {
                        parametros[3]=aux[3];
                        parametros[2]=aux[2];
                        parametros[1]=aux[1];
                        parametros[0]=aux[0];
                        error=errorObtenido;
                    }
                }
            }
        }
       
        return error;
    }
   
    /** Calculo de la trayectoria mediante el metodo de steeped ascend */
    public double CalculaTrayectoria(){  
        // Declaramos las variables auxiliares
        double error, NuevoError=0, precision;
        int i=0;
       
        precision= this.PrecisionInicial;
        // Calculamos el error inicial
        error=CalculaError(parametros, x, y, resta);
       
        //Cambiamos los parametros
        while ((i<MaxIters)&&(error>MaxError)&&(precision>MaxPrecision)) {

            NuevoError=CambiaParametros(parametros, x, y, precision);
            if (i%100==0)
                System.out.println("Iteracion "+i+". Error "+NuevoError+". Precision: "+(precision));
           
            if (NuevoError!=error) {
                error=NuevoError;
            } else {
                precision*=this.IncrementoPrecision;
                System.out.println("Iteracion: "+i+" Maximo Local encontrado. Error: "+error+" Nueva Precision:"+precision);
            }
            i++;
        }
       
        // Calculamos el polinomio tambien por minimos cuadrados
        double []xd = new double[NImagenesUsadas];
        for (int w=0; w<NImagenesUsadas; w++) xd[w]=(double)x[w];
        this.poli=new PolRegresion(xd, y, 3);
        poli.calculaPolinomio();
       
        return error;
    }
       
    private void CalcularSalidas() {
        y1= new double[NImagenesUsadas];
        y2= new double[NImagenesUsadas];
        e1= new double[NImagenesUsadas];
        e2= new double[NImagenesUsadas];
        sumE1=0;
        sumE2=0;
       
        for (int i=0; i<NImagenesUsadas; i++) {
            y1[i]=CalculaValor(poli.a,x[i]);
            if (resta)
                y2[i]=CalculaValor(parametros, x[i]-this.incremento);
            else
                y2[i]=CalculaValor(parametros, x[i]);
            e1[i]=Math.abs(y[i]-y1[i]);
            e2[i]=Math.abs(y[i]-y2[i]);
            System.out.println("("+ x[i] +"," + y[i]+")-("+ x[i] +"," + y1[i]+")-("+ x[i] +"," + y2[i]+")-e1="+e1[i]+" e2="+e2[i]);
            sumE1+=e1[i];
            sumE2+=e2[i];
        }
        sumE1=(sumE1/NImagenesUsadas);
        sumE2=(sumE2/NImagenesUsadas);
        System.out.println("E1="+sumE1+" E2="+sumE2);
    }
   
    // Dada una matriz de pixeles dibuja la funcion del color dado
    private static void DibujaFuncion(int [][]matriz, int []x, double []y, int color, boolean inversa) {
        if (!inversa) {
            for (int i=0; i<x.length; i++){
                if (((int)y[i]<255)&&((int)x[i]<255)&&((int)x[i]>0)&&((int)y[i]>0))
                    matriz[(int)x[i]][(int)(y[i])]=color;
            }
        } else {
            for (int i=0; i<x.length; i++){
                if (((int)y[i]<255)&&((int)x[i]<255)&&((int)x[i]>0)&&((int)y[i]>0))
                    matriz[(int)y[i]][(int)(x[i])]=color;
            }
        }
    }
   
    public int[] CreaImagen(){
       
        // Calculamos las salidas de las funciones
        CalcularSalidas();
       
        // Declaramos las variables
        int [][]matriz=new int[iniAncho][iniAlto];
        int []vector=new int[(iniAncho)*(iniAlto)];
       
        // Ponemos el fondo en blanco
        for (int i=0; i<iniAncho; i++){
            for (int j=0; j<iniAlto; j++){
                matriz[i][j]=Color.white.getRGB();
            }
        }
       
        // Dibujamos la trayectoria real en negro
        DibujaFuncion(matriz, x, y, Color.black.getRGB(), inverso);
       
        // Dibujamos la trayectoria de minimos cuadrados en azul
        DibujaFuncion(matriz, x, y1, Color.blue.getRGB(), inverso);
       
        // Dibujamos la trayectoria de stepest-ascent en amarillo
        DibujaFuncion(matriz, x, y2, Color.red.getRGB(), inverso);
       
        // Pasamos la matriz a forma vectorial
        int k=0;
        for (int i=0; i<iniAncho; i++){
            for (int j=0; j<iniAlto; j++){
                vector[k]=matriz[i][j];
                k++;
            }
        }
       
        // Devolvemos la matriz de la imagen
        return vector;
    }

    public String getPolinomioStepest() {
        return(parametros[3]+"x3 + "+parametros[2]+"x2 + "+parametros[1]+"x + "+parametros[0]);
    }
   
    public String getPolinomioMinimos() {
        return(poli.a[3]+"x3 + "+poli.a[2]+"x2 + "+poli.a[1]+"x + "+poli.a[0]);
    }
   
    public double getRadio() {
        return this.radio;
    }
   
    public double getSumE1() {
        return this.sumE1;
    }
   
    public double getSumE2() {
        return this.sumE2;
    }
}

/*
 * menu1.java
 *
 * Created on 2 de enero de 2007, 23:49
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.ImageIcon;

/**
 *
 * @author  David
 */
public class menu1 extends javax.swing.JFrame {

    Image imagenResultado, imagenFuente;
   
    /** Creates new form menu1 */
    public menu1() {
        initComponents();
    }
   
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jPanelRadio = new javax.swing.JPanel();
        imagenRadio = new javax.swing.JLabel();
        jRadio2 = new javax.swing.JTextField();
        jRadio1 = new javax.swing.JTextField();
        jLabel15 = new javax.swing.JLabel();
        jLabel16 = new javax.swing.JLabel();
        imagenRadio1 = new javax.swing.JLabel();
        jPanelError = new javax.swing.JPanel();
        jError1 = new javax.swing.JTextField();
        jLabel12 = new javax.swing.JLabel();
        jLabel13 = new javax.swing.JLabel();
        jError2 = new javax.swing.JTextField();
        jPanelPolinomio = new javax.swing.JPanel();
        jLabel10 = new javax.swing.JLabel();
        jPolinomio1 = new javax.swing.JTextField();
        jLabel11 = new javax.swing.JLabel();
        jPolinomio2 = new javax.swing.JTextField();
        ImagenTrayectoria = new javax.swing.JLabel();
        jPanelConfiguracion = new javax.swing.JPanel();
        jPanelFicheroEntrada = new javax.swing.JPanel();
        jRutaImagenes = new javax.swing.JTextField();
        jLabel8 = new javax.swing.JLabel();
        jNImagenes = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jNImagenesASaltar = new javax.swing.JTextField();
        jInverso = new javax.swing.JCheckBox();
        jPanelCondicionesParada = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        jMaxIter = new javax.swing.JTextField();
        jMaxError = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        jPrecisionInicial = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        jMaxPrecision = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jPanelCondicionesParada1 = new javax.swing.JPanel();
        jLabel9 = new javax.swing.JLabel();
        ja = new javax.swing.JTextField();
        jb = new javax.swing.JTextField();
        jLabel14 = new javax.swing.JLabel();
        jc = new javax.swing.JTextField();
        jLabel17 = new javax.swing.JLabel();
        jd = new javax.swing.JTextField();
        jLabel18 = new javax.swing.JLabel();
        jMenu = new javax.swing.JMenuBar();
        jMenuArchivo = new javax.swing.JMenu();
        jMenuItemAbrir = new javax.swing.JMenuItem();
        jMenuCalcular = new javax.swing.JMenu();
        jMenuItemCalcularRadio = new javax.swing.JMenuItem();
        jMenuItemCalcularTrayectoria = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Cálculo de trayectorias y radios de satélites");
        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Salida"));
        jPanelRadio.setBorder(javax.swing.BorderFactory.createTitledBorder("Radio del satélite"));
        imagenRadio.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        imagenRadio.setText("Imagen Real");
        imagenRadio.setBorder(javax.swing.BorderFactory.createTitledBorder("Imagen Real"));

        jRadio2.setEditable(false);
        jRadio2.setText("0");

        jRadio1.setEditable(false);
        jRadio1.setText("0");

        jLabel15.setText("Radio 2");

        jLabel16.setText("Radio 1");

        imagenRadio1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        imagenRadio1.setText("Imagen Virtual");
        imagenRadio1.setBorder(javax.swing.BorderFactory.createTitledBorder("Imagen Virtual"));

        org.jdesktop.layout.GroupLayout jPanelRadioLayout = new org.jdesktop.layout.GroupLayout(jPanelRadio);
        jPanelRadio.setLayout(jPanelRadioLayout);
        jPanelRadioLayout.setHorizontalGroup(
            jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelRadioLayout.createSequentialGroup()
                .addContainerGap()
                .add(jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanelRadioLayout.createSequentialGroup()
                        .add(jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                            .add(jLabel15)
                            .add(jLabel16))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                            .add(jRadio2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE)
                            .add(org.jdesktop.layout.GroupLayout.LEADING, jRadio1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE)))
                    .add(jPanelRadioLayout.createSequentialGroup()
                        .add(imagenRadio, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 121, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(imagenRadio1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 121, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
        );
        jPanelRadioLayout.setVerticalGroup(
            jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanelRadioLayout.createSequentialGroup()
                .add(jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(imagenRadio, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 112, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(imagenRadio1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 112, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel16)
                    .add(jRadio1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelRadioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel15)
                    .add(jRadio2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        jPanelError.setBorder(javax.swing.BorderFactory.createTitledBorder("Error en la trayectoria"));
        jError1.setEditable(false);
        jError1.setText("0");

        jLabel12.setText("Error Mínimos cuadrados");

        jLabel13.setText("Error por Stepest-Ascent");

        jError2.setEditable(false);
        jError2.setText("0");

        org.jdesktop.layout.GroupLayout jPanelErrorLayout = new org.jdesktop.layout.GroupLayout(jPanelError);
        jPanelError.setLayout(jPanelErrorLayout);
        jPanelErrorLayout.setHorizontalGroup(
            jPanelErrorLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanelErrorLayout.createSequentialGroup()
                .add(jPanelErrorLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jLabel12)
                    .add(jLabel13))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelErrorLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jError2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jError1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE)))
        );
        jPanelErrorLayout.setVerticalGroup(
            jPanelErrorLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelErrorLayout.createSequentialGroup()
                .add(jPanelErrorLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel12)
                    .add(jError1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelErrorLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel13)
                    .add(jError2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanelPolinomio.setBorder(javax.swing.BorderFactory.createTitledBorder("Polinomio de la trayectoria"));
        jLabel10.setText("Polinomio Mín Cuadrados");

        jPolinomio1.setEditable(false);
        jPolinomio1.setText("0x3 + 0x2 + 0x + 0");

        jLabel11.setText("Polinomio Stepest-Ascent");

        jPolinomio2.setEditable(false);
        jPolinomio2.setText("0x3 + 0x2 + 0x + 0");

        org.jdesktop.layout.GroupLayout jPanelPolinomioLayout = new org.jdesktop.layout.GroupLayout(jPanelPolinomio);
        jPanelPolinomio.setLayout(jPanelPolinomioLayout);
        jPanelPolinomioLayout.setHorizontalGroup(
            jPanelPolinomioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanelPolinomioLayout.createSequentialGroup()
                .addContainerGap()
                .add(jPanelPolinomioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jLabel10)
                    .add(jLabel11))
                .add(14, 14, 14)
                .add(jPanelPolinomioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jPolinomio2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 614, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jPolinomio1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 614, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanelPolinomioLayout.setVerticalGroup(
            jPanelPolinomioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelPolinomioLayout.createSequentialGroup()
                .add(jPanelPolinomioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel10)
                    .add(jPolinomio1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 19, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelPolinomioLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel11)
                    .add(jPolinomio2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
        );

        ImagenTrayectoria.setBorder(javax.swing.BorderFactory.createTitledBorder("Trayectoria del satélite"));
        ImagenTrayectoria.setMaximumSize(null);

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanelPolinomio, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
                        .add(ImagenTrayectoria, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 445, Short.MAX_VALUE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(jPanelRadio, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .add(jPanelError, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(jPanelRadio, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jPanelError, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(ImagenTrayectoria, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelPolinomio, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        jPanelConfiguracion.setBorder(javax.swing.BorderFactory.createTitledBorder("Configuración"));
        jPanelFicheroEntrada.setBorder(javax.swing.BorderFactory.createTitledBorder("Ficheros de entrada"));
        jRutaImagenes.setText("c:\Ex1\ima");

        jLabel8.setLabelFor(jRutaImagenes);
        jLabel8.setText("Ruta Imágenes");

        jNImagenes.setText("236");

        jLabel3.setLabelFor(jNImagenes);
        jLabel3.setText("Nº Imágenes");

        jLabel4.setLabelFor(jNImagenesASaltar);
        jLabel4.setText("Nº Imágenes a saltar");

        jNImagenesASaltar.setText("4");

        jInverso.setText("Inverso");
        jInverso.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        jInverso.setMargin(new java.awt.Insets(0, 0, 0, 0));

        org.jdesktop.layout.GroupLayout jPanelFicheroEntradaLayout = new org.jdesktop.layout.GroupLayout(jPanelFicheroEntrada);
        jPanelFicheroEntrada.setLayout(jPanelFicheroEntradaLayout);
        jPanelFicheroEntradaLayout.setHorizontalGroup(
            jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelFicheroEntradaLayout.createSequentialGroup()
                .add(jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jLabel4)
                    .add(jLabel8)
                    .add(jLabel3))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanelFicheroEntradaLayout.createSequentialGroup()
                        .add(jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                            .add(org.jdesktop.layout.GroupLayout.LEADING, jNImagenes)
                            .add(org.jdesktop.layout.GroupLayout.LEADING, jNImagenesASaltar, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 39, Short.MAX_VALUE))
                        .addContainerGap(238, Short.MAX_VALUE))
                    .add(jRutaImagenes, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)))
            .add(jPanelFicheroEntradaLayout.createSequentialGroup()
                .add(jInverso)
                .addContainerGap())
        );
        jPanelFicheroEntradaLayout.setVerticalGroup(
            jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelFicheroEntradaLayout.createSequentialGroup()
                .addContainerGap()
                .add(jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jPanelFicheroEntradaLayout.createSequentialGroup()
                        .add(jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(jLabel8)
                            .add(jRutaImagenes, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jPanelFicheroEntradaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(jNImagenes, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel3))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jNImagenesASaltar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(jLabel4))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 10, Short.MAX_VALUE)
                .add(jInverso))
        );

        jPanelCondicionesParada.setBorder(javax.swing.BorderFactory.createTitledBorder("Condiciones de parada"));
        jLabel2.setText("Max Iteraciones");

        jMaxIter.setText("20000");

        jMaxError.setText("1");

        jLabel6.setText("Max Error");

        jPrecisionInicial.setText("0.1");

        jLabel5.setText("Precision Inicial");

        jMaxPrecision.setText("0.00000000000000001");

        jLabel7.setText("Max Precision");

        org.jdesktop.layout.GroupLayout jPanelCondicionesParadaLayout = new org.jdesktop.layout.GroupLayout(jPanelCondicionesParada);
        jPanelCondicionesParada.setLayout(jPanelCondicionesParadaLayout);
        jPanelCondicionesParadaLayout.setHorizontalGroup(
            jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelCondicionesParadaLayout.createSequentialGroup()
                .addContainerGap()
                .add(jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jLabel6)
                    .add(jLabel5)
                    .add(jLabel2)
                    .add(jLabel7))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jMaxPrecision, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 136, Short.MAX_VALUE)
                    .add(jPrecisionInicial, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 136, Short.MAX_VALUE)
                    .add(jMaxIter, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 136, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jMaxError, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 136, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanelCondicionesParadaLayout.setVerticalGroup(
            jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelCondicionesParadaLayout.createSequentialGroup()
                .add(jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel2)
                    .add(jMaxIter, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel6)
                    .add(jMaxError, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel5)
                    .add(jPrecisionInicial, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParadaLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jLabel7)
                    .add(jMaxPrecision, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        jPanelCondicionesParada1.setBorder(javax.swing.BorderFactory.createTitledBorder("Parametros iniciales"));
        jLabel9.setText("a");

        ja.setText("0");

        jb.setText("1");

        jLabel14.setText("b");

        jc.setText("0");

        jLabel17.setText("c");

        jd.setText("0");

        jLabel18.setText("d");

        org.jdesktop.layout.GroupLayout jPanelCondicionesParada1Layout = new org.jdesktop.layout.GroupLayout(jPanelCondicionesParada1);
        jPanelCondicionesParada1.setLayout(jPanelCondicionesParada1Layout);
        jPanelCondicionesParada1Layout.setHorizontalGroup(
            jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelCondicionesParada1Layout.createSequentialGroup()
                .addContainerGap()
                .add(jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jLabel14)
                    .add(jLabel17)
                    .add(jLabel9)
                    .add(jLabel18))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jd, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE)
                    .add(jc, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE)
                    .add(ja, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jb, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanelCondicionesParada1Layout.setVerticalGroup(
            jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelCondicionesParada1Layout.createSequentialGroup()
                .add(jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel9)
                    .add(ja, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel14)
                    .add(jb, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel17)
                    .add(jc, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParada1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jLabel18)
                    .add(jd, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        org.jdesktop.layout.GroupLayout jPanelConfiguracionLayout = new org.jdesktop.layout.GroupLayout(jPanelConfiguracion);
        jPanelConfiguracion.setLayout(jPanelConfiguracionLayout);
        jPanelConfiguracionLayout.setHorizontalGroup(
            jPanelConfiguracionLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelConfiguracionLayout.createSequentialGroup()
                .add(jPanelFicheroEntrada, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParada, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelCondicionesParada1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanelConfiguracionLayout.setVerticalGroup(
            jPanelConfiguracionLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelConfiguracionLayout.createSequentialGroup()
                .add(jPanelConfiguracionLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanelFicheroEntrada, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(jPanelCondicionesParada, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jPanelCondicionesParada1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        jMenuArchivo.setText("Archivo");
        jMenuItemAbrir.setText("Abrir");
        jMenuArchivo.add(jMenuItemAbrir);

        jMenu.add(jMenuArchivo);

        jMenuCalcular.setText("Calcular");
        jMenuItemCalcularRadio.setText("Calcular Radio");
        jMenuItemCalcularRadio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemCalcularRadioActionPerformed(evt);
            }
        });

        jMenuCalcular.add(jMenuItemCalcularRadio);

        jMenuItemCalcularTrayectoria.setText("Calcular Trayectoria");
        jMenuItemCalcularTrayectoria.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemCalcularTrayectoriaActionPerformed(evt);
            }
        });

        jMenuCalcular.add(jMenuItemCalcularTrayectoria);

        jMenu.add(jMenuCalcular);

        setJMenuBar(jMenu);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelConfiguracion, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanelConfiguracion, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 165, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jMenuItemCalcularTrayectoriaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemCalcularTrayectoriaActionPerformed
        // Leemos los parametros de la configuracion
        String NombreImagenInicio=this.jRutaImagenes.getText();
        int NImagenes = Integer.parseInt(this.jNImagenes.getText());
        int NImagenesASaltar = Integer.parseInt(this.jNImagenesASaltar.getText());
        int MaxIters=Integer.parseInt(this.jMaxIter.getText());
        double PrecisionInicial=Double.parseDouble(this.jPrecisionInicial.getText());
        double IncrementoPrecision=0.9;
        double MaxPrecision=Double.parseDouble(this.jMaxPrecision.getText());
        double MaxError=Double.parseDouble(this.jMaxError.getText());
        double []parametros = new double[4];
        parametros[0]=Double.parseDouble(this.ja.getText());
        parametros[1]=Double.parseDouble(this.jb.getText());
        parametros[2]=Double.parseDouble(this.jc.getText());
        parametros[3]=Double.parseDouble(this.jd.getText());
        boolean inverso=this.jInverso.isSelected();
       
        // Creamos un objeto tipo satélite
        Satelite s1 = new Satelite(NombreImagenInicio, NImagenes, NImagenesASaltar, MaxIters, PrecisionInicial, IncrementoPrecision, MaxPrecision, MaxError, parametros, inverso);
       
        // Calculamos el radio, la trayectoria y las salidas
        s1.CalculaTrayectoria();
        int[]vector=s1.CreaImagen();
       
        // Obtenemos el radio y lo mostramos en la ventana
        Double radio = s1.getRadio();
        Double error1 = s1.getSumE1();
        Double error2 = s1.getSumE2();
        this.jRadio1.setText(radio.toString());
        this.jRadio2.setText(radio.toString());
        this.jError1.setText(error1.toString());
        this.jError2.setText(error2.toString());
       
        // Obtenemos los polinomios y los mostramos en la ventana
        this.jPolinomio1.setText(s1.getPolinomioMinimos());
        this.jPolinomio2.setText(s1.getPolinomioStepest());
       
        // Dibujamos la trayectoria
        int iniAncho=255;
        int iniAlto=255;
        Image imagenResultado = this.createImage(new MemoryImageSource(iniAncho,iniAlto,vector,0,iniAncho));
          // Escalamos la imagen
        Image imagenEscalada = imagenResultado.getScaledInstance(-(this.ImagenTrayectoria.getWidth()-50), this.ImagenTrayectoria.getHeight()-50, 1);
          // Mostramos la imagen en pantalla
        ImageIcon IconoImagen = new ImageIcon(imagenEscalada);
        this.ImagenTrayectoria.setIcon(IconoImagen);
       
    }//GEN-LAST:event_jMenuItemCalcularTrayectoriaActionPerformed

    private void jMenuItemCalcularRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemCalcularRadioActionPerformed
     
    }//GEN-LAST:event_jMenuItemCalcularRadioActionPerformed
   
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new menu1().setVisible(true);
            }
        });
    }
   
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel ImagenTrayectoria;
    private javax.swing.JLabel imagenRadio;
    private javax.swing.JLabel imagenRadio1;
    private javax.swing.JTextField jError1;
    private javax.swing.JTextField jError2;
    private javax.swing.JCheckBox jInverso;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.s