Graficadora de funciones cuadradas en Java con Swing

Aqui les dejo el codigo y el video tutorial para la graficadora, esta graficadora es muy sencilla, sin embargo para lo que sirve les dejo las 3 clases basicas que la conforman.

Para el codigo se recomienda ampliamente tener conocimientos matematicos de funciones cuadradas asi como alguna base de aplicaciones swing en Java.

Video tutorial:

Codigo fuente:

package graficadora;

import javax.swing.*;
import java.awt.*;

/**
 *
 * @author jorge
 */
public class Graficadora {

    //Importante, plano debe ser publico y estatico
    public static plano plano;

    public static void main(String[] args) {

        //Creando la ventana y el plano de dibujo
        Ventana frame = new Ventana();
        frame.setDefaultCloseOperation(Ventana.EXIT_ON_CLOSE);
        frame.setBounds(300, 300, 510, 600);
        frame.setLayout(new BorderLayout());
        plano = new plano();

        //Configuración del Boton
        JButton start = new JButton("Iniciar");
        start.addActionListener(frame);
        start.setText("Iniciar");

        //Bordes al panel
        frame.add( plano, BorderLayout.CENTER);
        frame.add(start, BorderLayout.SOUTH);

        frame.setVisible( true );

    }
}

 

package graficadora;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
/**
 *
 * @author jorge
 */
public class plano extends JPanel{

    public plano() {
        init();
    }

    public void init() {
        this.setBorder(BorderFactory.createLineBorder(Color.black));
    }

    @Override 
     public void paintComponent( Graphics g ) {
                    super.paintComponent(g);

                    g.setColor(Color.red);

                    g.drawLine(0, this.getHeight()/2, this.getWidth(), this.getHeight()/2);
                    g.drawLine(this.getWidth()/2, 0,this.getWidth()/2 , this.getHeight());

                 }

    // y=c*x2 +c*x +c

     public void paintSQRFunc(Graphics g, double x2mult,
             double x1mult,double cons, double x1,double x2)
     {

         for(double i=x1;i<x2;i++)
         {
             double y = ((double)Math.pow(i,2)*x2mult)+i*x1mult+cons;
             double xp = i+1;
             double yp = ((double)Math.pow(xp,2)*x2mult)+xp*x1mult+cons;
             g.drawLine((int)coord_x(i), (int)coord_y(y), (int)coord_x(xp), (int)coord_y(yp));

         }
     }

     private double coord_x(double x)
     {
         double real_x = x+this.getWidth()/2;
        return real_x;
     }
     private double coord_y(double y)
     {
          double real_y = -y+this.getHeight()/2;

          return (real_y);
     }
}

 

package graficadora;
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.event.ActionListener;
import graficadora.Graficadora;
/**
 *
 * @author jorge
 */
public class Ventana extends JFrame implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {

       Graficadora.plano.paintSQRFunc(Graficadora.plano.getGraphics(),-0.2,2,-15,-200,200);
    }

}

 

Acerca del autor:

Mi nombre es Jorge Villalobos, soy Colombiano de nacimiento y resido en México desde 2005,actualmente soy el creador de codigoprogramacion.com Soy ingeniero en tecnologías de información y comunicaciones y trabajo de tiempo completo desarrollando aplicaciones web. En general me considero un tipo normal, me gusta salir, divertirme, y uno de mis hobbies es programar y hacer tutoriales para compartir conocimiento, me gusta la pizza, el ajedrez y tomar una que otra cerveza los fines de semana. Espero que este proyecto ayude a ayudar a los demás.

Twitter del autor:

12 comments

  1. Alba says:

    Muchas gracias, me ha servido mucho para un programa de crear patrones a medida.

  2. el cuarto ss says:

    Lo que dijo x2 el tercer ss jaja

  3. Excelente explicación… Me sirvio de mucho, Graciasss c:

  4. el ss says:

    Esta muy bien explicado, saludos!!!

  5. Audelino says:

    Bro de casualidad sabes co o lo paso a BlueJ?

  6. Anai says:

    Muchas gracias por este programa, me has ayudado mucho. Gracias y exito en todo

  7. Javier says:

    Saludos Jorge.
    La explicación está excelente, a pesar que es un tema que cuesta a muchos tal como mencionas. Tengo tres consultas a ver si deseas ayudarme.

    1. En la clase ventana escribes esta linea: Graficadora.plano.paintSQRFunc(Graficadora.plano.getGraphics(),-0.2,2,-15,-200,200);
    La cual es para realizar el gráfico de la función cuadrática SQRF hace alusión a dicha función, ¿con qué lo reemplazaría si deseo la gráfica de la función lineal o la cúbica?

    2. En caso que los parámetros de la función deban ser ingresados por el usario, para no tener que estar modificando el código cada vez que se desea realizar un gráfico, se que es necesario usar la lectura con Scanner sin embargo no sé como haría para asignar dichos valores a las variables (que corresponde a las coordenadas).

    3. ¿cómo haría para que desde la misma JFrame pueda decidir el tipo de función a graficar (lineal, cuadrática, cúbica), sin que tenga que modificar los parámetros en el código por ejemplo no hacer x^2=0 para la función lineal?
    Muchas gracias por tu ayuda.

    • brdn says:

      Se que es un poco tarde, y aunque no soy el creador del código creo que podría responder las preguntas

      1.- En la llamada al método que hace para graficar
      Graficadora.plano.paintSQRFunc(Graficadora.plano.getGraphics(),-0.2,2,-15,-200,200);

      Lo que hace es pasar los parametros segun la expresion algrebraica, por lo que si quieres graficar una ecuacion lineal solo necesitas dar el parametro que multiplica el valor de x^2 como 0, esto para que no lo tome en cuenta, un ejemplo seria el siguiente:
      Graficadora.plano.paintSQRFunc(Graficadora.plano.getGraphics(), 0, 2, 10, 100, -100)
      Lo cual graficaria la siguiente expresión: y = (0)x^2 + (2)x + (10) lo cual es lo mismo que → y = (2)x + (10) o → (2)x + (-1)y + (10), al graficarlo lo haria en el intervalo x = (-100, 100).

      2.- En todo caso si deseas que el usuario ingrese los parametros, preferentemente deberias añadir JTextFields a la Interfaz Grafica de la misma forma que se hizo con el boton, y al momento de que el ActionListener detecte que el boton graficar fue presionado recoja los valores que el usuario ingreso en los JTextField con el metodo *.getText() y esos mismos valores usarlos para invocar el metodo. Si deseas hacerlo con la clase Scanner, necesitas crear un Objeto Scanner de la siguiente forma, Scanner entrada = new Scanner(System.in);
      Despues cuando quieras preguntar por los parametros realizas un System.out.println(“Ingresa el valor que multiplica x^2″); ese seria un ejemplo y para guardar el valor que te pase creas variables del tipo double que guarden los valores de la siguiente manera:
      double x2mult = entrada.nextDouble();
      Y asi cn todos los demas despues de eso mandas a llamar el metodo de la siguiente manera
      Graficadora.plano.paintSQRFunc(Graficadora.plano.getGraphics(), x2mult, xmult, valorIndependiente, rango1Dado, rango2Dado)

      3.- Aqui la pregunta, es irrelevante por que el metodo solo grafica con los valores que le pases si pasa algun valor con 0 pues el metodo ignorara esa variable y solo graficara con los datos que tenga, asi que eso ya lo realiza el metodo, al pasar un valor de 0 a x2mult el programa se podria decir que identifica que es una ecuacion lineal por el simple hecho de que no tiene una variable cuadratica, ya que al multiplicarla por 0 se elimina

      • Vidic says:

        Con respecto a cómo hacer que el usuario ingrese los parámetros, podrías poner el cómo sería? Porque no termino de entender cómo añadir el JTextFields.

  8. rene says:

    Hola me da gusto que haces eso, oye el algoritmo de la linea DDA lo has programada alguna vez… disculpa dime como empezar

  9. Tengo una super duda. Ando buscando la forma de aprender hacer una graficadora, pero lo que busco es que en lugar de la linea __________ que muestra la funcion, aparesca mi nombre “LEONARDO”. Como puedo hacer eso.

Leave a Reply to el ss Cancel reply

Your email address will not be published. Required fields are marked *