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)=A*cos(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