Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Grafico di funzione

  1. #1

    Grafico di funzione

    Salve a tutti,
    mi sto perdendo nella documentazione ufficiale della sun da qualche ora, e ancora non ho capito se si può fare questa cosa: io ho due array, contenenti rispettivamente le ascisse e le ordinate di punti sul piano cartesiano:dovrei disegnare la curva che passa per questi punti e plottarla su un JFrame.
    Se mi potete indirizzare almeno su dove cercare mi fate un grande favore.

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    La scrissi qualche tempo fa, non l'ho mai ottimizzata
    codice:
    private class MyDrawingPanel extends JPanel {
            private double[] x;
            private double[] y;
            private int scale ;
            
            public MyDrawingPanel(int scale) {
                this.scale = scale;
            }
            
            private void populateX() {            
                double minValue = -0.5*(this.getWidth()-10)/scale;
                double maxValue = -minValue;
                double step = maxValue*2/(this.getWidth()-10);
                
                //populate x array
                x = new double[2*(this.getWidth()-10)];
                for (int i = 0; i < x.length; i++) {
                    x[i] = minValue + i*step;
                }
            }        
            
            private double evaluateFunction(double x) {
                // Qui metto la funzione nel nostro caso
                // f(x) = x^2+ 2x +1;
                
                return x*x+ 2*x + 1;
            }
            
            private void populateY() {
                y = new double[x.length];
                for (int i = 0; i < y.length; i++) {
                    y[i] = evaluateFunction(x[i]);
                }
            }
            
            private void plot(Graphics g, double x1, double y1, double x2, double y2) {
                x1 += this.getWidth()/2;
                x2 += this.getWidth()/2;
                y1 = this.getHeight()/2-y1;
                y2 = this.getHeight()/2-y2;
                g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
            }
            
            private void paintAxis(Graphics g) {
                g.drawLine(5, this.getHeight()/2, this.getWidth()-5, this.getHeight()/2);
                int counter = 0;
                while (counter < this.getWidth()/2 - (scale+5)) {
                    g.drawLine(this.getWidth()/2 + counter + scale, this.getHeight()/2 -2, this.getWidth()/2+counter + scale, this.getHeight()/2+2);
                    g.drawLine(this.getWidth()/2 - (counter+ scale), this.getHeight()/2 -2, this.getWidth()/2 - (counter + scale), this.getHeight()/2+2);
                    counter += scale;
                }
                g.drawLine(this.getWidth()/2, 5, this.getWidth()/2, this.getHeight()-5);
                counter = 0;
                while (counter < this.getHeight()/2 - (scale+5)) {
                    g.drawLine(this.getWidth()/2 - 2, this.getHeight()/2 + (counter + scale), this.getWidth()/2 + 2, this.getHeight()/2 + (counter + scale));
                    g.drawLine(this.getWidth()/2 - 2, this.getHeight()/2 - (counter + scale), this.getWidth()/2 + 2, this.getHeight()/2 - (counter + scale));
                    counter += scale;
                }
            }
            
            public void paintComponent(Graphics g) {
                paintAxis(g);
                populateX();
                populateY();
                for (int i = 0; i < x.length-1; i++) {
                    plot(g, x[i]*scale, y[i]*scale, x[i+1]*scale, y[i+1]*scale);
                }
            }             
            
        }
    Parte di un altro programma. Se la vuoi prendere come spunto accomodati pure. Per provarla ti basta infilarla in un JFrame e dargli una scala.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Scusa non è che sono molto bravo con java e non riesco ad utilizzarla..mi potresti spiegare meglio come devo fare?Grazie ancora

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ah... bhè, qualcosa del genere ad esempio:

    codice:
    import javax.swing.*;
    import java.awt.*;
    
    public class TestGraficoFunzione extends JFrame {
    
      private class MyDrawingPanel extends JPanel {
            private double[] x;
            private double[] y;
            private int scale ;
            
            public MyDrawingPanel(int scale) {
                this.scale = scale;
            }
            
            private void populateX() {            
                double minValue = -0.5*(this.getWidth()-10)/scale;
                double maxValue = -minValue;
                double step = maxValue*2/(this.getWidth()-10);
                
                //populate x array
                x = new double[2*(this.getWidth()-10)];
                for (int i = 0; i < x.length; i++) {
                    x[i] = minValue + i*step;
                }
            }        
            
            private double evaluateFunction(double x) {
                // Qui metto la funzione nel nostro caso
                // f(x) = x^2+ 2x +1;
                
                return x*x+ 2*x + 1;
            }
            
            private void populateY() {
                y = new double[x.length];
                for (int i = 0; i < y.length; i++) {
                    y[i] = evaluateFunction(x[i]);
                }
            }
            
            private void plot(Graphics g, double x1, double y1, double x2, double y2) {
                x1 += this.getWidth()/2;
                x2 += this.getWidth()/2;
                y1 = this.getHeight()/2-y1;
                y2 = this.getHeight()/2-y2;
                g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
            }
            
            private void paintAxis(Graphics g) {
                g.drawLine(5, this.getHeight()/2, this.getWidth()-5, this.getHeight()/2);
                int counter = 0;
                while (counter < this.getWidth()/2 - (scale+5)) {
                    g.drawLine(this.getWidth()/2 + counter + scale, this.getHeight()/2 -2, this.getWidth()/2+counter + scale, this.getHeight()/2+2);
                    g.drawLine(this.getWidth()/2 - (counter+ scale), this.getHeight()/2 -2, this.getWidth()/2 - (counter + scale), this.getHeight()/2+2);
                    counter += scale;
                }
                g.drawLine(this.getWidth()/2, 5, this.getWidth()/2, this.getHeight()-5);
                counter = 0;
                while (counter < this.getHeight()/2 - (scale+5)) {
                    g.drawLine(this.getWidth()/2 - 2, this.getHeight()/2 + (counter + scale), this.getWidth()/2 + 2, this.getHeight()/2 + (counter + scale));
                    g.drawLine(this.getWidth()/2 - 2, this.getHeight()/2 - (counter + scale), this.getWidth()/2 + 2, this.getHeight()/2 - (counter + scale));
                    counter += scale;
                }
            }
            
            public void paintComponent(Graphics g) {
                paintAxis(g);
                populateX();
                populateY();
                for (int i = 0; i < x.length-1; i++) {
                    plot(g, x[i]*scale, y[i]*scale, x[i+1]*scale, y[i+1]*scale);
                }
            }             
            
        }
    
      public TestGraficoFunzione(int scala) {
        super("Test");
        this.setSize(600,400);
        this.getContentPane().add(new MyDrawingPanel(scala));
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      public static void main(String[] args) {
        new TestGraficoFunzione(20);
      }
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    ok perfetto..grazie mille

  6. #6
    Ciao, anch'io devo fare un'applicazione simile. Solo che a me la differenza sta nel fatto che la funzione la devo inserire dall'interfaccia e non dal sorgente.
    Come potrei fare? Basta anche in linee teoriche...

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Se l'applicazione (sembra tanto un esercizio scolastico...) consiste proprio nello scrivere un parser per espressioni matematiche, allora ti consiglio di documentarti un po' su espressioni regolari et similia, altrimenti c'è già qualche progetto pronto per il parsing di espressioni matematiche (almeno delle funzioni usate più comunemente):

    http://www.google.it/search?q=parsin...ient=firefox-a
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    In realtà lo era. L'esercizio praticamente consisteva nel calcolarmi l'area sottesa di una funzione, solo che si doveva metterla da sorgente.
    Io ne vorrei creare un'applicazione utile anche nello studio della matematica, insomma un programma del tipo derive. So che è complesso, ma tentar non nuoce...
    EDIT: Ps, grazie per il link. Sinceramente avevo sentito parlare di parser e di generatori di parser, ma non ne avevo la minima idea di cosa fossero.

  9. #9
    sono riuscito finalmente a fare il grafico della mia funzione utilizzando lo script che mi avete proposto sopra..ora ho un ultimo problema:vorrei, se possibile, poter mettere come sfondo a quel grafico di funzione, una immagine .jpeg,cioè in definitiva dovrei avere il grafico disegnato sopra l'immagine. Ho provato a farlo ma mi si aprono due JFrame diversi, uno con l'immagine e uno con il grafico di funzione, mentre invece ne dovrebbe apparire uno solo con le due immagini sovrapposte (evidentemente sbaglio qualcosa). Sapete dirmi come posso fare?Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.