Graficador Swing

 

Walter Mora F

   
  Inicio  1  2  3  4

 

 

 

Un 'parser' para leer la función

Para graficar una función necesitamos

  1. Leer la función

  2. Calcular los pares  ordenados y unirlos con un segmento de recta

Para leer la función debemos usar un 'parser', es decir una clase que nos permita leer y evaluar la fórmula que define a la función. Aquí, en vez de implementar un 'parser' (que sería bastante laborioso), vamos a usar uno que está disponible de manera gratuita  en internet: JEP (Java Expression Parser,http://sourceforge.net/projects/jep/. Al momento de esta publicación, la versión actual es la 2.3.1

Primero vamos a implementar un pequeño applet para ver como usar el evaluador

Los navegadores ya no brindan soporte para applets de java, este applet se ha deshabilitado

La manera fácil para poder usar JEP con el IDE  JCreator (http://www.jcreator.com/)  es  descargar JEP y poner la carpeta 'org' (que viene en la subcarpeta 'build')    en la subcarpeta  'classes' del proyecto.

Si usa otro IDE, deberá hacer los cambios adecuados para que Java pueda encontrar el archivo jep231.jar.

En nuestro programa, se deben importar dos bibliotecas

import org.nfunk.jep.*;
import org.nfunk.jep.type.*;

La segunda biblioteca nos permite un buen manejo de los números complejos, para trabajar con funciones como

Para leer y evaluar funciones se debe crear un objeto JEP con algunas características

 

private JEP miEvaluador = new JEP();
miEvaluador.addStandardFunctions(); 
miEvaluador.addStandardConstants();
miEvaluador.addComplex();
//habilitar 'sen'
miEvaluador.addFunction("sen", new org.nfunk.jep.function.Sine();
miEvaluador.addVariable("x", 0);
miEvaluador.setImplicitMul(true); //permite 2x en vez de 2*x

Para evaluar, se asigna una función (al leer una función, ésta se convierte en la función actual), se declara la variable y se evalúa en algún valor. Todo esto lo hacemos con un método.

 

double evaluar(JEP Miparser,String fun, double valorx)
{
   Miparser.parseExpression(fun);
   Miparser.addVariable("x", valorx);
   errorEnExpresion = Miparser.hasError(); //hay error?
  return Miparser.getValue();
}

 

el código completo es

 

Evaluador.java 


import javax.swing.*;
import javax.swing.event.*;
//////////////////////
import java.awt.*;
import java.awt.event.*;
import org.nfunk.jep.*;
import org.nfunk.jep.type.*;

public class Evaluador extends JApplet
{
  private JEP miEvaluador;
  double vx;
  boolean errorEnExpresion; //si hay error de sintaxis en la función
  boolean errorEnNumero ;   //si hay error de sintaxis en el valor x
  JTextField Tfun;                //leer función
  JTextField Tvalorx;           //leer valor x para evaluar
  JButton BtnEvaluar;
  JLabel Mensaje;

  public void init()
  {
   Container content = getContentPane();

   Tfun = new JTextField("2x^2-3x+sen(x)",10);
   Tvalorx = new JTextField("4",3);
   BtnEvaluar = new JButton("Evaluar");
   Mensaje = new JLabel(""); //para imprimir resultado de evaluación

   content.setLayout(new FlowLayout());

   content.add(Tfun);
   content.add(Tvalorx);
   content.add(BtnEvaluar);
   content.add(Mensaje);
   //Manejo de eventos
   ManejadorDeEvento ManejadorDevt = new ManejadorDeEvento();
   Tfun.addActionListener(ManejadorDevt);
   Tvalorx.addActionListener(ManejadorDevt);
   BtnEvaluar.addActionListener(ManejadorDevt);

   //parser JEP
   miEvaluador = new JEP();
   miEvaluador.addStandardFunctions(); //agrega las funciones comunes
   miEvaluador.addStandardConstants();
   miEvaluador.addComplex();
   miEvaluador.addFunction("sen", new org.nfunk.jep.function.Sine());
   miEvaluador.addVariable("x", 0);
   miEvaluador.setImplicitMul(true); //permite 2x en vez de 2*x
  }

  private class ManejadorDeEvento implements ActionListener
  {
     public void actionPerformed (ActionEvent evt)
     {
       Object source = evt.getSource ();
       // si se presiona el botón o se da 'enter' en algún campo de texto
       if( source == BtnEvaluar || source == Tfun || source == Tvalorx)      
          LeerImprimir();       
     }   
  }//

  void LeerImprimir()
  {
     try
     {
      Double dx = new Double( Tvalorx.getText() ); //leer el número
      vx = dx.doubleValue();
      errorEnNumero=false;
      Tvalorx.setForeground(Color.black);

     }catch(NumberFormatException e){ errorEnNumero=true; //número incorrecto
                                      Tvalorx.setForeground(Color.red);
                                    }
     vx=evaluar(miEvaluador,Tfun.getText(),vx);

     if(!errorEnExpresion && !errorEnNumero)
     {
       Mensaje.setText(""+vx);
      }else Mensaje.setText("Hay un error.");

   }//

  double evaluar(JEP Miparser,String fun, double valorx)
  {
     Miparser.parseExpression(fun);
     Miparser.addVariable("x", valorx);
     errorEnExpresion = Miparser.hasError(); //hay error?
     return Miparser.getValue();
  }//
}


 

 

 
>>>   Inicio  1  2  3  4

 


Revista digital Matemática, Educación e Internet.
Derechos Reservados