Newsgroup: it.comp.java
Titolo: disegnare una generica funzione... è possibile?

vorrei poter disegnare il grafico di una generica *funzione*
passata dall'utente.
ora la funzione č hard-coded, cosě:
// disegna 100 punti della funzione e^x
drawFunction() {
    int N = 100;
    double start = 0.0;
    double step = 2.0 / N; // disegna sull'intervallo [start,2]
    for (i=0; i<N; i++) {
        double x = start + step*i;
        double y = Math.exp(x);
        disegna(x,y);
    }
}
quello che vorrei č poter passare una generica funzione
come fosse un parametro!
drawFunction(Funzione f) {
....
...
     double y = f(x);
     disegna(x,y)
}
č possibile?
La cosa migliore sarebbe:
l'utente inserisce la funzione come stringa e con la sintassi
del Java, ad es:  "Math.log(1/x)*(Math.pow(x,2) - 5)"
PS: ricordo che in javascript c'era una funzione eval() che
valutava espressioni e poteva anche "creare" variabili
al volo... ma non sono sicuro...
cioč del tipo  eval("x=2")

 
http://www.beanshell.org/
però a metterlo solo per questo mi da l'impressione di usare un'orchestra
per eseguire un assolo... :P
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
  ---  
http://xenu.freewinds.cx
(per rispondere personalmente leva IlDitoDalCulo)

 è possibile?
Sì, ma così:
    drawFunction(ObjectWithFunction owf) {
        ....
        ...
        double y = owf.f(x);
        disegna(x,y)
    }
interface ObjectWithFunction {
     double f(double x);
}
class Pippo implements ObjectWithFunction {
     ...
     double f(double x) {return Math.exp(x);}
}
class Pluto implements ObjectWithFunction {
     ...
     double f(double x) {return Math.sin(x);}
}
.....
Pippo p1 = new Pippo();
Pluto p2 = new Pluto();
.....
drawFunction(pi);
drawFunction(p2);
.....

grazie, sto scaricando ora beanshell...
a quanto pare č perfettamente quello che avevo in mente
certo, puň essere piů lungo e complicato
del previsto, ma sempre molto meglio
che scrivermi un parser a mano ;-)

 Sì, ma così:
 > [CUT]
Dario penso lui intendesse dire
"c'e' un qualche modo generico per poter far speficare
all'utente il tipo di funzione della forma y=f(x) all'utente
senza che io debba hard-codare il codice per disegnarla?"
dipo un generico
plot("f(x)") tipo
plot("x^2-3x+4")
plot("3x+2")
almeno io l'ho interpretata cosi' :)

 }
Dopo che ho visto ciò mi è venuto in mente di ricordargli le interfaces.
Se invece vuole una stringa (scritta da un utente) da interpretare
ed eseguire a run-time allora hai sicuramente ragione tu.
- Dario

 ed eseguire a run-time allora hai sicuramente ragione tu.
ci fara' sapere lui cosa voleva dire :D

> bsh Math.exp(2.21)*(Math.pow(3,2)-3*Math.pow(3,1)+5)
45.57858196520152
----------------------------------------------------
l'interprete bsh fa il parsing della stringa, carica le classi java
appropriate e fa il calcolo, il tutto in 3 righe di codice (da parte mia!)
--- estratto del codice ---
  protected void parseInputBsh(String input) {
    System.out.println("Parse bsh: "+input);
    Interpreter inter = new Interpreter();
    try {
      inter.eval("out = "+input);
      output = String.valueOf(inter.get("out"));
    }
    catch (EvalError ex) {
      ex.printStackTrace();
    }
  }
l'interprete valuta l'espressione tramite eval()
ed anche assegna il risultato a una "variabile"
out, quindi posso prendere il valore della variabile
tramite .get("out")
PS: ok il prossimo passo, dopo aver letto la documentazione
di beanshell, è quello di fornire una funzione con variabili
non assegnate (ovvero con una x genrica), del tipo:
log(x)*(a2*y^2 - a1*y + a0)
bsh Math.log(x)*(a1*Math.pow(y,2) - a1*Math.pow(y,1) + a0*Math.pow(y,0))
non so ancora di preciso come, ma a questo punto non
dovrebbe essere difficile