Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114

    [JAVA] disegnare sinusoide

    Ciao, devo realizzare un programma che sfrutti swing per disegnare una sinusoide. Da un bottone della finestra principale si deve aprire un'altra finestra con la sinusoide in questione.
    Questa deve però avere la seguente forma (dipendente dagli input):
    --> Math.sin (INPUT/23*2*Math.Pi)
    [formula per calcolare il bioritmo fisico, dove INPUT = giorni di vita vissuti]
    INPUT è un valore numerico che deve essere incrementato di una unità.

    Come posso fare?
    Grazie!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] disegnare sinusoide

    Originariamente inviato da battax
    devo realizzare un programma che sfrutti swing per disegnare una sinusoide.
    Come posso fare?
    In questa discussione avevo postato un esempio di come si estende JPanel per poter disegnare correttamente qualcosa (era proprio una sinusoide).
    Anche se non è esattamente quello che dovrai fare tu, vedi se può esserti utile come base di partenza.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    Grazie l'avevo vista, così come (anche se non ricordo dove) avevo trovato il seguente codice:

    import java.awt.Graphics;
    import javax.swing.JPanel;

    public class DrawSin extends JPanel
    {

    public void paintComponent(Graphics g)
    {

    super.paintComponent(g);

    int w=getWidth();
    int h=getHeight();
    int i,x,senoRelativo;

    for (i=0;i<w;i++)
    {
    senoRelativo=(int)((h/2)*Math.sin(i*2*Math.PI/w));
    x = (h/2) - senoRelativo;
    g.drawLine(i,x,i,x);

    }
    }
    }
    import javax.swing.JFrame;

    public class CreateWindow
    {
    public static void main (String args[])
    {
    DrawSin sin= new DrawSin();
    JFrame application = new JFrame();
    application.setDefaultCloseOperation(JFrame.EXIT_O N_CLOSE);
    application.add(sin);
    application.setSize(640,480);
    application.setVisible(true);
    }
    }


    Questo però apre un JFrame e genera una sinusoide proporzionale alla finestra, mentre io dovrei disegnarla con la formula che ho citato sopra.
    Anzi a dire il vero dovrei disegnarne 3 (una con la costante 23, una con 28 e una con 33), ma quando vado a sostituire una delle tre formule a quella di questo codice mi ritrovo o con una linea piatta, oppure con tante forme d'onda proporzionali in numero alla costante che devo moltiplicare (quest'ultimo caso se mantengo il /w)!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da battax
    ma quando vado a sostituire una delle tre formule a quella di questo codice mi ritrovo o con una linea piatta, oppure con tante forme d'onda proporzionali in numero alla costante che devo moltiplicare (quest'ultimo caso se mantengo il /w)!
    Devi solo tenere presente alcune cose, cioè che l'argomento di sin() è un valore in radianti e che restituisce un valore compreso tra -1 e +1, ovviamente.
    Quindi il risultato di sin() lo devi moltiplicare per qualcosa per poter avere una ampiezza tale che la sinusoide sia ben visualizzabile e i radianti li devi calcolare in modo opportuno per fare in modo che la sinusoide si espanda in modo altrettanto utile.

    Nel mio esempio avevo scritto:

    Math.sin (x/200.0 * 2*Math.PI)

    dove 'x' era la coordinata x, in pixel, sul componente. Vuol dire in pratica che ogni 200 pixel in orizzontale si forma una sinusoide completa (da 0 a 360 gradi).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    Un problema è che sin restituisce numeri double (o float), cioè non interi, mentre drawLine richiede in input 4 interi.
    Siccome la sinusoide (anche nel mio caso) deve avere valori tra -1.00 a 1.00 (con almeno 2 cifre decimali), come posso fare per passare tali valori a drawLine? Ad esempio 0.92 verrebbe troncato a 0 e così tutti gli altri!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da battax
    Un problema è che sin restituisce numeri double (o float), cioè non interi, mentre drawLine richiede in input 4 interi.
    Siccome la sinusoide (anche nel mio caso) deve avere valori tra -1.00 a 1.00 (con almeno 2 cifre decimali), come posso fare per passare tali valori a drawLine? Ad esempio 0.92 verrebbe troncato a 0 e così tutti gli altri!
    Infatti nel mio esempio moltiplicavo per un certo valore e poi facevo una conversione a int. È chiaro che non ha senso/utilità disegnare a video una sinusoide con ampiezza di 1 pixel (anche perché se non becchi esattamente il valore -1 o +1 facendo un cast a int otterresti sempre 0).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    Ho provato ad usare il codice che mettesti te nell'altra discussione ma mi sorgono 2 problemi:
    - l'area tra la sinusoide e l'asse è "colorata" (dipende dal metodo paintComponent?)
    - non riesco comunque ad inserirci la mia formula perché se x/COSTANTE è il numero di pixel "occupati" da un ciclo completo, come faccio ad inserire la formula senza modificare soltanto l'ampiezza?

    In poche parole il valore dell'altezza y deve essere determinato dalla mia formula, mentre x deve essere semplicemente incrementato! A parole è semplice, il problema è farlo!!!

    Senza poi considerare che di sinusoidi ne dovrò comunque disegnare 3...

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da battax
    - l'area tra la sinusoide e l'asse è "colorata" (dipende dal metodo paintComponent?)
    No, è perché si è usato il drawLine, che disegna una linea che parte dall'asse orizzontale della sinusoide verso l'alto o il basso a seconda del valore istantaneo.

    Originariamente inviato da battax
    - non riesco comunque ad inserirci la mia formula perché se x/COSTANTE è il numero di pixel "occupati" da un ciclo completo, come faccio ad inserire la formula senza modificare soltanto l'ampiezza?

    In poche parole il valore dell'altezza y deve essere determinato dalla mia formula, mentre x deve essere semplicemente incrementato! A parole è semplice, il problema è farlo!!!
    La formula che hai postato all'inizio è:

    Math.sin (INPUT/23*2*Math.Pi)

    Immagino che quel INPUT sia il valore intero che si incrementa man mano di 1 unità, giusto? In pratica può essere la coordinata x all'interno del componente. Tra l'altro, se INPUT è un valore intero o lo converti prima a double oppure quel 23 lo devi rendere double, altrimenti quella divisione è intera e non sortisce il risultato che vorresti.

    Quindi la tua formula dovrebbe essere:

    codice:
    int x;
    int y;
    
    for (x=  ........)
    {
        y = (int) (base + ampiezza * Math.sin (x / 23.0 * 2 * Math.PI));
        .... disegna il punto ....
    }
    Dove nel ciclo for farai andare la x da un certo valore ad un altro valore incrementando di 1 e dove base è la coordinata y dell'asse della sinusoide e ampiezza è il valore che specifica l'altezza di una mezza sinusoide.

    Se vogliamo fare i fini, nei componenti la coordinata y si incrementa verso il basso, quindi per fare le cose come si deve si dovrebbe fare base - ..... cioè se la sinusoide è positiva, deve andare verso l'alto del componente.

    È più chiaro ora? C'è qualcosa su cui hai dei dubbi?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    114
    Sono riuscito a creare la sinusoide che volevo con il seguente codice "indipendente":
    (metto dei commenti per i vari passaggi)

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

    class DrawSinEmo extends JPanel
    {
    public void paintComponent(Graphics g)
    {

    super.paintComponent(g);

    int width = getWidth ();
    int height = getHeight ();
    int c = height/2;
    //inserisco la mia variabile (i), è in questo ordine di dimensione
    //poi lo dovrò prendere in input dal programma
    int i=8459;
    int x;
    //disegno l'asse
    g.drawLine(0,c,width,c);

    int p, y;
    //conto i punti
    for (p=0, x=0; x<width ;x+=10)
    {p++;}
    int ay[] = new int[p];
    int ax[] = new int[p];
    double r;
    p=0;
    //memorizzo i punti
    for (x=0; x<width ;x+=10)
    {
    r = Math.sin (i/28.0* 2*Math.PI);
    y = (int) (c-200 * r);
    ay[p] = y;
    ax[p] = x;
    i++;
    p++;
    }
    //disegno la sinusoide(che però drawPolygon mi chiude ma poco importa)
    g.setColor(Color.red);
    g.drawPolygon (ax, ay, p);
    }

    }

    public class CreateWindow2
    {
    public static void main (String args[])
    {
    DrawSinEmo sin1= new DrawSinEmo();
    DrawSinFis sin2= new DrawSinFis();
    DrawSinEmo sin3= new DrawSinEmo();
    JFrame application = new JFrame("BIO");
    application.setDefaultCloseOperation(JFrame.EXIT_O N_CLOSE);
    application.add(sin1);
    application.add(sin2);
    application.add(sin3);
    application.setSize(600,480);
    application.setVisible(true);
    }
    }


    PROBLEMI:
    - Io devo disegnare 3 sinusoidi (le altre due con 23 e 33 al posto di 28) e se lo faccio mi dà errori in runtime
    - devo scrivere qualcosa nel grafico, altrimenti sarebbe inutile (come fare?)
    - il precedente programma lo devo richiamare da un altro programma e non da se stesso (forse la cosa più semplice per me delle tre)

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da battax
    - Io devo disegnare 3 sinusoidi (le altre due con 23 e 33 al posto di 28) e se lo faccio mi dà errori in runtime
    Non hai detto quale errore ti dà ... visto così il codice è quasi corretto, la creazione della interfaccia grafica dovresti farla nel contesto del EDT, non del main thread.

    C'è poi una questione di "layout". Il content pane di JFrame per default usa il layout manager BorderLayout e tu hai aggiunto 3 pannelli nella parte CENTER ma solo 1 è visualizzato.
    Quindi come intendi disporre questi grafici?

    Originariamente inviato da battax
    - devo scrivere qualcosa nel grafico, altrimenti sarebbe inutile (come fare?)
    Intendi dire che devi scrivere del testo? Graphics/Graphics2D hanno dei metodi drawString() per disegnare appunto del testo (e puoi anche selezionare il font corrente con setFont()).

    Quindi disegnare del testo è facile, semmai risulta un po' più laborioso se il testo devi allinearlo, centrarlo, ruotarlo o cose del genere, perché dovresti fare dei calcoli in più.

    Originariamente inviato da battax
    - il precedente programma lo devo richiamare da un altro programma e non da se stesso (forse la cosa più semplice per me delle tre)
    Dovresti specificare meglio cosa è quel "altro" programma. È in Java? Fatto da te?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.