Skalowanie wykresu, i kilka problemów z rysowaniem funkcji?

0

Na początek witam wszystkich na forum.

Jestem początkującym programistą i java jest pierwszym językiem, od którego zaczynam przygodę z programowaniem dlatego proszę o wyrozumialość.

Poniżej zamieszczam kod programu rysującego wykres funkcji f(x)=Acos(x) exp(-xw) , dla określonego przedziału X C <a,b>, dane : A, w!
Jak widać wykres sie rysuje ale mam problem z jego wyskalowaniem. Utknąłem w tym miejscu i szczerze powiedziawszy nie wiem jak dalej przebrnąć. Wartości podanej wyżej funkcji sięgają nieskonczoności dlatego skalowanie wzdlóz y-greka bedzie chyba niemozliwe. Jezeli tak proszę o wskazówke. Skalowanie osi x mogloby wyglądac tak: (Szerokośc okna w poziomie):|Xmin - Xmax| = skala_OX. Pytanie jak stworzyć funkcje modułu? Kolejny problem to zamiana zmiennych wprowadzanych przez urzytkownika, czyli parametrów a oraz b ze stringa na zmienną typu double i użycie ich w mojej pętli rysującej funkcje. TO chyba wszystko. Proszę o porady i wszelkie wskazówki.

// Importuj klasy z Abstract Windowing Toolkit (podstawowa grafika)
import java.awt.*;
// ... i klasy z Java Foundation Classes - Swing (okienka)
import javax.swing.*;
// ... i obsługa zdarzeń z AWT
import java.awt.event.*;

// Klasa reprezentuj±ca obwiedziony czerwon± ramk± panel
// gdzie ma się znaleĽć rysunek.
class PanelGraficzny
  extends JPanel         // Klasa reprezentuj±ca panel - element grupuj±cy 
                     // inne elementy (tu tylko miejsce do rysowania)
  implements ActionListener // Specyfikacja, że ta klasa będzie w stanie 
                     // odbierać zdarzenia, takie jak wciskanie przycisków
                     // na ekranie
{
  // Specyfikacja stałych reprezentuj±cych kolory
  final static Color kolorRamki = Color.red;
  final static Color kolorTla   = Color.white;
  final static Color kolorLiter = Color.black;

  // Pole tekstowe (tworzone i udostępniane tej klasie przez
  // klasę Grafika poniżej), przechowuj±ce pewien parametr tekstowy
  // i lokalna kopia jego zawarto¶ci do przekazywania między 
  // actionPerformed() a paint()
  JTextField parametr1, parametr2, parametr3,parametr4;

  String stringParametru1 = "0.0";
  String stringParametru2 = "0.0";
  String stringParametru3 = "0.0";
  String stringParametru4 = "0.0";

  // Konstruktor tworzacy panel graficzny
  public PanelGraficzny(JTextField _parametr1, JTextField _parametr2, JTextField _parametr3, JTextField _parametr4)
  { 
   // Zachowuje przekazane przez klasę Grafika pole tekstowe
      parametr1 = _parametr1;
      parametr2 = _parametr2;
      parametr3 = _parametr3;
      parametr4 = _parametr4;
  } // constructor

  // Metoda paint(Graphics g) jest wywoływana automatycznie przez system, gdy
  // okienko wymaga narysowania (pierwszy raz pojawia się na ekranie, 
  // zostaje odsłonięte, zrewymiarowane, itp.)
  public void paint(Graphics g)
  {
   // Pobiera aktualne rozmiary panela
   Dimension d = getSize();

  // Wypełnia panel kolorem tła
      g.setColor(kolorTla);
      g.fillRect(0, 0, d.width - 1, d.height - 1);

  // Rysuje ramkę dookoła panela
      g.setColor(kolorRamki);
      g.drawRect(0, 0, d.width - 1, d.height - 1);

  //rysujemy osie
      g.setColor(new Color(0,0,0));
      g.drawLine (20, d.height / 2, d.width-15, d.height / 2);
      g.drawLine (d.width/2, 20, d.width/2, d.height-15);
   //rysujemy groty
      g.drawLine (d.width-15, d.height / 2, d.width-30, d.height/2+5); 
      g.drawLine (d.width-15, d.height / 2, d.width-30, d.height/2-5);
      g.drawLine (d.width/2, 20, d.width/2+5, 35);
      g.drawLine (d.width/2, 20, d.width/2-5, 35);

  //podpisujemy oś x oraz y
      String x = "x";
      g.setColor(kolorLiter);
      g.drawString(x, d.width-30, d.height/2+20);
      String y = "y";
      g.setColor(kolorLiter);
      g.drawString(y, d.width/2+15, 35);

   //GŁOWNY KOD PROGRAMU

   // klasa Funkcja, przechowująca metodę fodx
   class Funkcja {
        public double fodx(double x)
        {

        double y;
      double A=5;
      double w=2.0;
      double a;
      double b;

       y=Math.exp(-x)*Math.cos(x);
         return y;
    }
 }

   //tworzymy zmienna funkcja klasy Funkcja aby móc skorzystać z metody fodx w klasie Funkcja
   Funkcja funkcja = new Funkcja();

   //rysujemy wykres
    int skala_ox , zakres;
         double y1 , y2 ,x1 ,x2;      
          //skala_ox = height/((height/2)-(int)fodx(50));
          zakres =20;
          skala_ox =15;       
         //rysujemy wykres!                 
            x1=(zakres*-1) * skala_ox + (d.width /2 );   
            y1=(funkcja.fodx(zakres*-1)) * skala_ox + (d.height / 2);
      for(double i=zakres*(-1); i  < zakres;i=i+0.01){

               y2 =  funkcja.fodx(i+1)* -(skala_ox) + (d.height / 2);
               x2 = i * skala_ox + (d.width /2 );
                  g.setColor(new Color(255,200,0));
                  g.drawLine( (int) x1  , (int) y1 , (int) x2  ,(int) y2);
               x1= x2;
               y1 = y2;
      }

  } // paint

  // Metoda actionPerformed(ActionEvent e) jest wywoływana automatycznie
  // przez system, gdy zostanie wci¶nięty przycisk 'Rysuj'
  public void actionPerformed(ActionEvent e) 
  {
   // Pobiera z pola tekstowego wskazywanego przez parametr1,2,3,4 zawarto¶ć (tekst)
   stringParametru1 = parametr1.getText();
    stringParametru2 = parametr2.getText();
     stringParametru3 = parametr3.getText();
      stringParametru4 = parametr4.getText();

      //parsowanie i zamiana zmiennych

   // Przekazuje do głównego okna aplikacji (rodzica) ż±danie narysowania 
   // całego okna od pocz±tku
   getParent().repaint();
  } // actionPerformed
} // class PanelGraficzny

// Klasa startowa
public class Grafika 
{
  public static void main(String args[]) 
  {
   // Tworzy nowe okno dla aplikacji
   final JFrame okno = new JFrame("Program rysujący wykres funkji");

   // Specyfikuje, że w momencie zamknięcia tego 
   // okna cała aplikacja ma być zamykana
   okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   // Tworzy now± etykietę tekstow± z automatycznym centrowaniem tekstu
   // i ustawia jej wymiary

   JLabel etykieta = new JLabel("Wzór funkcji: f(x)=A*exp(-x)*sin(wx),  gdzie x nalezy od przedziału <a,b>", JLabel.CENTER);
   etykieta.setPreferredSize(new Dimension(800,35));   //etykieta górna

     //etykieta dolna
  /* JLabel etykieta2 = new JLabel("Wypełnij poniższe pola i naciśnij rysuj", JLabel.CENTER);
   etykieta2.setPreferredSize(new Dimension(800,15));*/

   // Tworzy nowy panel kontrolny
   JPanel panelKontrolny = new JPanel();

     // Tworzy elementy panelu kontrolnego  
     // ... opisy pola tekstowego do wprowadzania parametru
     JLabel opis1 = new JLabel("Parametr A: ", JLabel.RIGHT);
     JLabel opis2 = new JLabel("Parametr a: ", JLabel.RIGHT);
     JLabel opis3 = new JLabel("Parametr b: ", JLabel.RIGHT);
     JLabel opis4 = new JLabel("Parametr w: ", JLabel.RIGHT);
// ... pola do wprowadzania parametrów
     JTextField parametr1 = new JTextField();
     JTextField parametr2 = new JTextField();
     JTextField parametr3 = new JTextField();
     JTextField parametr4 = new JTextField();
     // Tworzy przycisk 'Rysuj'
     JButton przyciskRysuj = new JButton("Rysuj!");

     // Dodaje elementy kontrolne do panelu kontrolnego
     // tak by stanowiły tablelę o 1 wierszu i 5 koluimnach
     panelKontrolny.setLayout(new GridLayout(1,5));
     panelKontrolny.add(opis1);
     panelKontrolny.add(parametr1);
     panelKontrolny.add(opis2);
     panelKontrolny.add(parametr2);
     panelKontrolny.add(opis3);
     panelKontrolny.add(parametr3);
     panelKontrolny.add(opis4);
     panelKontrolny.add(parametr4);
     panelKontrolny.add(przyciskRysuj);

   // Tworzy nowy panel graficzy, udostępniaj±c mu pole tekstowe
      PanelGraficzny panelGraficzny = new PanelGraficzny(parametr1, parametr2, parametr3, parametr4);

   // Nakazuje przyciskowi 'Rysuj' informować
   // powyżej zdefiniowany panel graficzny 
   // o zdarzeniach takich jak wci¶nięcie tego przycisku
   przyciskRysuj.addActionListener(panelGraficzny);

   // Dodaje etykietę i panele do zawartosci okna
   Container wnetrzeOkna = okno.getContentPane();
   wnetrzeOkna.add(etykieta,      BorderLayout.NORTH); // góra okna
    wnetrzeOkna.add(panelGraficzny, BorderLayout.CENTER); // reszta okna
   wnetrzeOkna.add(panelKontrolny, BorderLayout.SOUTH); // dół okna
   // wnetrzeOkna.add(etykieta2,      BorderLayout.SOUTH); // dół okna
   // Ustawia pocz±tkowe wymiary okna aplikacji i je wy¶wietla na ekranie
   okno.setSize(new Dimension(800,600));
   okno.setVisible(true);
  } // main

} // class Grafika
0

Nikt Nie pomoże ?

0

przebrnąlem przez etap parsowania zmiennych string na double. Zamieszczam kod ponizej. Wykresik sie rysuje wszystko ok. Teraz chciałbym go jeszcze wyskalowac ew dodać podzialke. Tak jak pisałem w poście. Ktoś wie jak zrobić funkcję modułu |a-b| gdzie a i b to zakres z góry ustalany przez urzytkownika?

import java.awt.*;
// ... i klasy z Java Foundation Classes - Swing (okienka)
import javax.swing.*;
// ... i obsługa zdarzeń z AWT
import java.awt.event.*;

// Klasa reprezentuj±ca obwiedziony czerwon± ramk± panel
// gdzie ma się znaleĽć rysunek.
class PanelGraficzny
  extends JPanel            // Klasa reprezentuj±ca panel - element grupuj±cy 
                            // inne elementy (tu tylko miejsce do rysowania)
  implements ActionListener // Specyfikacja, że ta klasa będzie w stanie 
                            // odbierać zdarzenia, takie jak wciskanie przycisków
                            // na ekranie
{
  // Specyfikacja stałych reprezentuj±cych kolory
  final static Color kolorRamki = Color.red;
  final static Color kolorTla   = Color.white;
  final static Color kolorLiter = Color.black;

  // Pole tekstowe (tworzone i udostępniane tej klasie przez
  // klasę Grafika poniżej), przechowuj±ce pewien parametr tekstowy
  // i lokalna kopia jego zawarto¶ci do przekazywania między 
  // actionPerformed() a paint()
  JTextField parametr1, parametr2, parametr3,parametr4;

  String stringParametru1 = "0.0";
  String stringParametru2 = "0.0";
  String stringParametru3 = "0.0";
  String stringParametru4 = "0.0";

  // Konstruktor tworzacy panel graficzny
  public PanelGraficzny(JTextField _parametr1, JTextField _parametr2, JTextField _parametr3, JTextField _parametr4)
  { 
    // Zachowuje przekazane przez klasę Grafika pole tekstowe
        parametr1 = _parametr1;
        parametr2 = _parametr2;
        parametr3 = _parametr3;
        parametr4 = _parametr4;
  } // constructor

  // Metoda paint(Graphics g) jest wywoływana automatycznie przez system, gdy
  // okienko wymaga narysowania (pierwszy raz pojawia się na ekranie, 
  // zostaje odsłonięte, zrewymiarowane, itp.)
  public void paint(Graphics g)
  {

       try{

          double a =1.0; //domyślna wartość

        a= Double.parseDouble(parametr2.getText());
    }catch(Exception e){}

       double b= 1.0; //domyślna wartość
        try{
    b= Double.parseDouble(parametr3.getText());
    }catch(Exception e){}

    // Pobiera aktualne rozmiary panela
    Dimension d = getSize();

  // Wypełnia panel kolorem tła
        g.setColor(kolorTla);
        g.fillRect(0, 0, d.width - 1, d.height - 1);

  // Rysuje ramkę dookoła panela
        g.setColor(kolorRamki);
        g.drawRect(0, 0, d.width - 1, d.height - 1);

  //rysujemy osie
        g.setColor(new Color(0,0,0));
        g.drawLine (20, d.height / 2, d.width-15, d.height / 2);
        g.drawLine (d.width/2, 20, d.width/2, d.height-15);
   //rysujemy groty
        g.drawLine (d.width-15, d.height / 2, d.width-30, d.height/2+5); 
        g.drawLine (d.width-15, d.height / 2, d.width-30, d.height/2-5);
        g.drawLine (d.width/2, 20, d.width/2+5, 35);
        g.drawLine (d.width/2, 20, d.width/2-5, 35);

  //podpisujemy oś x oraz y
        String x = "x";
        g.setColor(kolorLiter);
        g.drawString(x, d.width-30, d.height/2+20);
        String y = "y";
        g.setColor(kolorLiter);
        g.drawString(y, d.width/2+15, 35);

    //GŁOWNY KOD PROGRAMU

   // klasa Funkcja, przechowująca metodę fodx
    class Funkcja {
          public double fodx(double x)
          {
           double A= 0.0; //domyślna wartość
           double w= 0.0; //domyślna wartość

           double y;
   try{
    A= Double.parseDouble(parametr1.getText());
    }catch(Exception e){System.out.println("ss");}

    try{
         w = Double.parseDouble(parametr4.getText());
         }catch(Exception e){}

    y=A*Math.exp(-x)*Math.cos(w*x);
            return y;
     }
 }

    //tworzymy zmienna funkcja klasy Funkcja aby móc skorzystać z metody fodx w klasie Funkcja
   Funkcja funkcja = new Funkcja();

    //rysujemy wykres
     int skala_ox , zakres;
            double y1 , y2 ,x1 ,x2;        

             zakres =20;
             skala_ox =15;         
           //rysujemy wykres!                      
                x1=(zakres*-1) * skala_ox + (d.width /2 );    
                y1=(funkcja.fodx(zakres*-1)) * skala_ox + (d.height / 2);
        for(double i=zakres*(-1); i  < zakres;i=i+0.01){

                    y2 =  funkcja.fodx(i+1)* -(skala_ox) + (d.height / 2);
                    x2 = i * skala_ox + (d.width /2 );
                        g.setColor(new Color(255,200,0));
                        g.drawLine( (int) x1  , (int) y1 , (int) x2  ,(int) y2);
                    x1= x2;
                    y1 = y2;

        }

  } // paint

  // Metoda actionPerformed(ActionEvent e) jest wywoływana automatycznie
  // przez system, gdy zostanie wci¶nięty przycisk 'Rysuj'
public void actionPerformed(ActionEvent e) 
  {
    // Pobiera z pola tekstowego wskazywanego przez parametr1,2,3,4 zawarto¶ć (tekst)
        stringParametru1 = parametr1.getText();
        stringParametru2 = parametr2.getText();
        stringParametru3 = parametr3.getText();
        stringParametru4 = parametr4.getText();

    // Przekazuje do głównego okna aplikacji (rodzica) ż±danie narysowania 
    // całego okna od pocz±tku
    getParent().repaint();
  } // actionPerformed
} // class PanelGraficzny

// Klasa startowa
public class Grafika 
{
  public static void main(String args[]) 
  {
    // Tworzy nowe okno dla aplikacji
    final JFrame okno = new JFrame("Program rysujący wykres funkji");

    // Specyfikuje, że w momencie zamknięcia tego 
    // okna cała aplikacja ma być zamykana
    okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Tworzy now± etykietę tekstow± z automatycznym centrowaniem tekstu
    // i ustawia jej wymiary

    JLabel etykieta = new JLabel("Wzór funkcji: f(x)=A*exp(-x)*cos(wx),  gdzie x nalezy od przedziału <a,b> Początkowe wartości= 0", JLabel.CENTER);
    etykieta.setPreferredSize(new Dimension(800,35));    //etykieta górna

      //etykieta dolna
  /* JLabel etykieta2 = new JLabel("Wypełnij poniższe pola i naciśnij rysuj", JLabel.CENTER);
    etykieta2.setPreferredSize(new Dimension(800,15));*/

    // Tworzy nowy panel kontrolny
    JPanel panelKontrolny = new JPanel();

      // Tworzy elementy panelu kontrolnego  
      // ... opisy pola tekstowego do wprowadzania parametru
      JLabel opis1 = new JLabel("Parametr A: ", JLabel.RIGHT);
      JLabel opis2 = new JLabel("Parametr a: ", JLabel.RIGHT);
      JLabel opis3 = new JLabel("Parametr b: ", JLabel.RIGHT);
      JLabel opis4 = new JLabel("Parametr w: ", JLabel.RIGHT);
// ... pola do wprowadzania parametrów
      JTextField parametr1 = new JTextField();
      JTextField parametr2 = new JTextField();
      JTextField parametr3 = new JTextField();
      JTextField parametr4 = new JTextField();
      // Tworzy przycisk 'Rysuj'
      JButton przyciskRysuj = new JButton("Rysuj!");

      // Dodaje elementy kontrolne do panelu kontrolnego
      // tak by stanowiły tablelę o 1 wierszu i 5 koluimnach
      panelKontrolny.setLayout(new GridLayout(1,5));
      panelKontrolny.add(opis1);
      panelKontrolny.add(parametr1);
      panelKontrolny.add(opis2);
      panelKontrolny.add(parametr2);
      panelKontrolny.add(opis3);
      panelKontrolny.add(parametr3);
      panelKontrolny.add(opis4);
      panelKontrolny.add(parametr4);
      panelKontrolny.add(przyciskRysuj);

    // Tworzy nowy panel graficzy, udostępniaj±c mu pole tekstowe
        PanelGraficzny panelGraficzny = new PanelGraficzny(parametr1, parametr2, parametr3, parametr4);

    // Nakazuje przyciskowi 'Rysuj' informować
    // powyżej zdefiniowany panel graficzny 
    // o zdarzeniach takich jak wci¶nięcie tego przycisku
    przyciskRysuj.addActionListener(panelGraficzny);

    // Dodaje etykietę i panele do zawartosci okna
    Container wnetrzeOkna = okno.getContentPane();
    wnetrzeOkna.add(etykieta,       BorderLayout.NORTH); // góra okna
     wnetrzeOkna.add(panelGraficzny, BorderLayout.CENTER); // reszta okna
    wnetrzeOkna.add(panelKontrolny, BorderLayout.SOUTH); // dół okna
   // wnetrzeOkna.add(etykieta2,       BorderLayout.SOUTH); // dół okna
    // Ustawia pocz±tkowe wymiary okna aplikacji i je wy¶wietla na ekranie
    okno.setSize(new Dimension(800,600));
    okno.setVisible(true);
  } // main

} // class Grafika

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0