Funktionsplotter

Status
Nicht offen für weitere Antworten.

zoj

Mitglied
Guten Tag,

ich bin gerade dabei einen Funktionsplotter zu programmieren.
Das Problem ist: Ich kann die berechneten Werte nicht darstellen,
da die Funktion g.drawLine nur integer-Werte unterstützt.

Wie kann ich double oder float Werte einzeichnen???:L

Hier der Quellcode:

Java:
package de.ipartner.java;
import java.awt.*;
import javax.swing.*;

class NotHelloWorldPanel extends JPanel{

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        //X-Werte
        double[] x = new double[10];
        //Y-Werte
        double[] fx = new double[10];

        //Y-Werte berechnen und im Array ablegen oder gleich einzeichnen
        for(int i=0;i<10;i++){
            x[i]=i;

            fx[i] = 2* x[i];
            
            //Y-Werte zur Kontrolle ausgeben
            //System.out.println(x[i]+ " : "+fx[i]);
        }
       
        //Test
        //g.drawString(".", 75, 100);
        //g.drawLine(10, 10, 20, 20);

    }
}

public class NotHelloWorld1 extends JFrame{

    //Konstruktor
    NotHelloWorld1(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().add(new NotHelloWorldPanel() );
    }

    //Main-Methode
    public static void main(String[] args){
        JFrame frame = new NotHelloWorld1();
        frame.setTitle("Zeichnung");
        frame.setSize(400,400);
        frame.setVisible(true);
    }
}
 

Verjigorm

Top Contributor
Mal so generell:
In der paintComponent wird keine Logik bearbeitet oder gar irgendwelche Arrays erzeugt und befüllt :bahnhof:
 
Zuletzt bearbeitet:

zoj

Mitglied
Mal so generell:
In der paintComponent wird keine Logik bearbeitet oder gar irgendwelche Arrays erzeugt und befüllt :bahnhof:

Es geht mir nicht um das Array, ich will Werte darstellen.
Diese sind aber Kommazahlen und werden von der Funktion drawLine nicht unterstützt.

In die for-Schleife soll die gesuchte Funktion rein, welch die Kommawerte einzeichnet.
 

Verjigorm

Top Contributor
Du weisst schon, dass Pixel keine Kommazahlen haben?

Was du machen willst sollte mit einem Polygon zu lösen sein.
 

Schandro

Top Contributor
du kannst keine halben Pixel malen. Du musst die Zahlen auf int casten. Ob du es direkt castest:
g.drawLine( (int)x[1], (int)fx[4], (int)x[1]+5, (int)fx[4]+5); // sinnloses Beispiel

oder ob du die Zahlen noch irgendwie umrechnest damit es genaeur dargestellt wird und danach auf int castest, ist egal. Du kannst aber auf jedenfall keine halbe/viertel/... Pixel malen.


2. Wie bereits gesagt wurde: in paintComponent gehört nur der Code zum malen. Sonst ABSOLUT nichts anderes, ohne Ausnahme!
 

zoj

Mitglied
Nö, hab ich so nebenbei auf der Arbeit mal gemacht, sind keine 10 Zeilen :)

Aber generell schau doch mal im Netz, da sollte es doch sowas schon fertig geben

Nun, ich will es erstmal selbst probieren. Will ja dabei noch was lernen.

Frage: Müssen es im Programm zwei Klassen sein?
Kann man die Klasse NotHelloWorldPanel in der NotHelloWorld1 Klasse unterbringen?
 

Verjigorm

Top Contributor
Ja, als innere Klasse (quasi einfach die Klasse ohne public davor) in der gleichen Datei

Sollte man aber vermeiden, wenn es geht
 
Zuletzt bearbeitet:

zoj

Mitglied
So, nu bin ich ein Schritt weiter. Einfache Funktionen bekomme ich bereits gezeichnet.

Nun eine Frage: Wie bekomme ich nun Funktionen n-tes Grades gezeichnet z.B x^3?

Habe im Internet die passende Funktion gefunden: Math.pow, diese funktioniert aber nur mit double. Ich verwende aber integer.

Was mache ich nun?

Hier der Quellcode:

Java:
package de.ipartner.java;
import java.awt.*;
import java.applet.Applet;
import java.lang.Math;

public class Grafik extends Applet{
    public void start(){
        this.setLayout( new BorderLayout() );
        this.setSize(300,300);
    }
    public void paint(Graphics g){
        super.paint(g);
        setBackground(Color.GREEN);

        //X-Y-Maßstab festlegen
        int[] x = new int[this.getSize().width];
        int[] y = new int[this.getSize().width];

        //Werte berechnen
        for(int i=0;i<(this.getSize().width);i++){
            x[i] = i;
            y[i] = ( this.getSize().height ) - ( 1* i);
        }
        
        //Werte einzeichnen
        g.drawPolygon (x, y, x.length);
    }
}
 
S

SlaterB

Gast
ein int ist auch gleichzeitig ein double,
wenn am Ende double rauskommt, kannst du auch wieder auf int casten,

notfalls kompliziert selber implementieren:

public int hoch3(int x) {
return x * x * x;
}
 

zoj

Mitglied
Hallo, bin derzeit einen Schritt weiter.

Habe nun folgendes Problem: Ich habe 2 Eingabefelder und einen Button erstellt.
Diese will ich oberhalb des Grafen anzeigen lassen. Dazu habe ich zwei Panels erstellt.
Dem ersten Panel habe ich die zwei Eingabefelder und den Button hinzugefügt.

Frage: Wie füge ich den zweiten Panel den Grafen zu?
Wenn ich das Applet so starte, wie es derzeit ist, erscheinen zwar die Eingabefelder und der Button oben aber nur Teilweise. Erste durch das klicken werden diese vollkommen erkennbar.

Hier der Quellcode:
Java:
package de.ipartner.java;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class JPlotterV1 extends JApplet{
    private JTextField xMax_txt,yMax_txt;
    private JButton plotten;
    private JPanel panelFkt, panelEingabe;

    public void init(){
        this.setSize(300, 300);
        this.getContentPane().setBackground(new Color(255,204,102));
        this.getContentPane().setLayout(new GridLayout(2,1));
        
        xMax_txt = new JTextField("10");
        yMax_txt = new JTextField("10");
        plotten = new JButton("Plotten");
        
        panelFkt = new JPanel();
        panelEingabe = new JPanel();

        //panelFkt.add(Graphics g);

        panelEingabe.add(xMax_txt);
        panelEingabe.add(yMax_txt);
        panelEingabe.add(plotten);


        this.getContentPane().add(panelEingabe);
        this.getContentPane().add(panelFkt);

        plotten.addActionListener(new knopfAktion());

    }
    
    class knopfAktion implements ActionListener{
        public void actionPerformed(ActionEvent e){
            aktualisierung(e);
        }
    }
    
    private void aktualisierung(ActionEvent e){
        try{
            int xMax = Integer.parseInt(xMax_txt.getText());
            int yMax = Integer.parseInt(yMax_txt.getText());
            
        }catch(NumberFormatException nfe){
                System.out.println("Falsche Eingabe!");
            }
        
        
    }

    public void paint(Graphics g){
        //Groesse des Fensters
        double maxX = this.getBounds().getWidth();
        double maxY = this.getBounds().getHeight();

        int px_old=0;
        int py_old=0;

        //Groesse des Koordinatensystems
        int xMax = 5;
        int yMax = 5;

        for(int px = 0; px <= maxX; px++){

            double x = (px*xMax)/maxX;

            double y = -x*x*x+3*x*x;

            int py = (int)(((yMax-y)*maxY)/yMax);

            g.drawLine(px_old, py_old, px, py);
            px_old=px;
            py_old=py;
        }
        String groesse = "Breite:"+maxX+" Höhe:"+maxY;
        //g.drawString(groesse, 30, 30);
    }

    public void paintGrid(Graphics g){
        //g.drawLine(0, (int)f(0), 300, (int)f(0));
    }
}
 

zoj

Mitglied
Habe auch schon den FlowLayot probiert, das Problem besteht weiterhin.

Den Knopf und die Eingabefelder habe ich den EingabePanel hinzugefügt.

Wie füge ich nun dem FktPanel den Grafen zu?
 

zoj

Mitglied
Was mir noch aufgefallen ist, ist die Bemerkung des Kompilers in diese Zeile:
int xMax = Integer.parseInt(xMax_txt.getText());

Wenn ich den Mauszeiger über xMax bewegwe erscheint folgende Meldung:
"Local Variable hides a field"

Was hat das zu bedeuten?
 

Schandro

Top Contributor
das die Varaible xMax 2 mal existiert, einmal als Membervariable (field) und einmal Lokal in der Methode.

Java:
    private void aktualisierung(ActionEvent e){
        try{
            int xMax = Integer.parseInt(xMax_txt.getText());
            int yMax = Integer.parseInt(yMax_txt.getText());
            
        }catch(NumberFormatException nfe){
                System.out.println("Falsche Eingabe!");
            }
Diese Methode ändert xMax und yMax nicht, da zwei neue Variablen erstellt werden anstatt den bereits existierenden beiden neue Werte zuzuweisen.
 

zoj

Mitglied
Habe nun diese Variablen global gesetzt.

Wie erreiche ich nun, dass die Funktion paint() erneut aufgerufen wird?
Die Variablen-Werte sind nun anders.

Hier der aktualisierte code:
Java:
package de.ipartner.java;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class JPlotterV1 extends JApplet{
    private JTextField xMax_txt,yMax_txt;
    private JButton plotten;
    private JPanel panelFkt, panelEingabe;

    public int xMax = 5;
    public int yMax = 5;

    public void init(){
        this.setSize(300, 300);
        this.getContentPane().setBackground(new Color(255,204,102));
        this.getContentPane().setLayout(new FlowLayout());
        
        xMax_txt = new JTextField("10");
        yMax_txt = new JTextField("10");
        plotten = new JButton("Plotten");
        
        panelFkt = new JPanel();
        panelEingabe = new JPanel();

        //panelFkt.add(Graphics g);

        panelEingabe.add(xMax_txt);
        panelEingabe.add(yMax_txt);
        panelEingabe.add(plotten);


        this.getContentPane().add(panelEingabe);
        this.getContentPane().add(panelFkt);

        plotten.addActionListener(new knopfAktion());

    }
    
    class knopfAktion implements ActionListener{
        public void actionPerformed(ActionEvent e){
            aktualisierung(e);
        }
    }
    
    private void aktualisierung(ActionEvent e){
        try{
            int xMax = Integer.parseInt(xMax_txt.getText());
            int yMax = Integer.parseInt(yMax_txt.getText());
            //init();
            //this.paint(g);

        }catch(NumberFormatException nfe){
                System.out.println("Falsche Eingabe!");
            }
        
        
    }

    public void paint(Graphics g){
        //Groesse des Fensters
        double maxX = this.getBounds().getWidth();
        double maxY = this.getBounds().getHeight();

        int px_old=0;
        int py_old=0;

        //Groesse des Koordinatensystems
        //int xMax = 5;
        //int yMax = 5;

        for(int px = 0; px <= maxX; px++){

            double x = (px*xMax)/maxX;

            double y = -x*x*x+3*x*x;

            int py = (int)(((yMax-y)*maxY)/yMax);

            g.drawLine(px_old, py_old, px, py);
            px_old=px;
            py_old=py;
        }
        String groesse = "Breite:"+maxX+" Höhe:"+maxY;
        //g.drawString(groesse, 30, 30);
    }

    public void paintGrid(Graphics g){
        //g.drawLine(0, (int)f(0), 300, (int)f(0));
    }
}
 

zoj

Mitglied
Es klappt :)

Aber die davor gezeichnete Funktion bleit sichtbar. Gibt es auch eine Funktion, mit der man die Zeichnung zuerst löscht?
 

Leroy42

Top Contributor
Nein!

Sie wird doch automatisch durch Aufruf von repaint() - Also indirekte
Aufrufe von paint() und update() - gelöscht!
 

Schandro

Top Contributor
Das ist ein Grafikfehler. Siehst du dadran, dass die anderen Graphen verschwinden wenn du z.b. die Größe des Applets veränderst (wenn es durch den Appletviewer in einem Fenster angezeigt wird).

Du musst auf einem JPanel malen, in dem du dessen paintComponent überschreibst. Dieses JPanel kannst du dann auf das Applet adden.
Da du das FlowLayout als LayoutManager benutzt, musst du vorher noch mit setPreferredSize dem JPanel eine passende Größe zuweisen, mit einem anderen LayoutManager würde das auch dynamischer gehen.
 
Zuletzt bearbeitet:

zoj

Mitglied
Zum Zeichnen des Graphen habe ich bereits auch ein Panel erstellt: panelFkt.

Wie soll ich nun darin malen und es überschreiben?
Könnt ihr mir ein Tip geben?
 

Schandro

Top Contributor
Beispiel:

Java:
public class AM extends JApplet{
	
	@Override
	
	public void init(){
		this.add(paintPanel);
	}
	
	private JPanel paintPanel = new JPanel(){
		@Override
		public void paintComponent(Graphics g){
			super.paintComponent(g);
			
			g.drawRect(10,50,20,100);
			g.fillOval(50,50,50,50);
		}
	};
}
Da du mehrere Components auf das Applet hinzufügst musst du aufpassen, dass der LayoutManager das panel auf das du malst auch groß genug darstellt.
 

zoj

Mitglied
Vielen Dank für den Tipp!

Habe die Klasse die du gepostet hast so übernommen wie sie ist.
Auch javax.swing.* und java.awt.* importiert.

Beim Ausführen der Klasse taucht jedoch eine Warnung auf.
Wenn ich aud "run away" klicke erscheint das Applet mit der Zeichnung
darin.
Das import java.awt.*; ist ebenfalls rot unterschtrichen.
Der Kompiler meldet: "class, interface or emun expected"

Was kann das sein?
 

zoj

Mitglied
Ups, mein Fehler gewesen.

So, habe deinen Ansatz übernommen und das Ergebnis sieht so aus:(Bild)
Wie du bereits gesagt hast, wird das Panel zu klein dargestellt.

Ich habe versucht mit setSize die Größe zu ändern, jedoch wird die von mir
eingestellt Größe nicht übernommen. Weder für die Eingabe-Panel noch für die Funktions-Panel.
???:L

Hier nochmal der Quellcode:
Java:
package de.ipartner.java;
import java.awt.*;
import javax.swing.*;
import javax.swing.JComponent;
import java.awt.event.*;

public class JPlotterV1 extends JApplet{

    //@Override

    private JTextField xMax_txt,yMax_txt;
    private JButton plotten;
    private JPanel panelEingabe;

    public int xMax = 5;
    public int yMax = 5;

    public void init(){
        this.setSize(600, 600);
        this.getContentPane().setBackground(new Color(255,204,102));
        this.getContentPane().setLayout(new FlowLayout());
        
        xMax_txt = new JTextField("10");
        yMax_txt = new JTextField("10");
        plotten = new JButton("Plotten");
        
        //panelFkt = new JPanel();
        panelEingabe = new JPanel();
        panelEingabe.setSize(50, 100);
        panelEingabe.add(xMax_txt);
        panelEingabe.add(yMax_txt);
        panelEingabe.add(plotten);

        panelFkt.setSize(300, 300);

        this.getContentPane().add(panelEingabe);
        this.getContentPane().add(panelFkt);

        plotten.addActionListener(new knopfAktion());
    }
    
    class knopfAktion implements ActionListener{
        public void actionPerformed(ActionEvent e){
            aktualisierung(e);
        }
    }
    
    private void aktualisierung(ActionEvent e){
        try{
            xMax = Integer.parseInt(xMax_txt.getText());
            yMax = Integer.parseInt(yMax_txt.getText());
            repaint();
        }catch(NumberFormatException nfe){
                System.out.println("Falsche Eingabe!");
            }
    }

    private JPanel panelFkt = new JPanel(){
        @Override

        public void paintComponent(Graphics g){
            super.paintComponent(g);

            double maxX = this.getBounds().getWidth();
            double maxY = this.getBounds().getHeight();

            int px_old=0;
            int py_old=0;

            //Groesse des Koordinatensystems manuell
            //int xMax = 5;
            //int yMax = 5;

            for(int px = 0; px <= maxX; px++){
                double x = (px*xMax)/maxX;
                double y = -x*x*x+3*x*x;
                int py = (int)(((yMax-y)*maxY)/yMax);
                g.drawLine(px_old, py_old, px, py);
                px_old=px;
                py_old=py;
            }
        }
    };
    public void paintGrid(Graphics g){
        //g.drawLine(0, (int)f(0), 300, (int)f(0));
    }
}
 

Schandro

Top Contributor
das FlowLayout benutzt die preferredSize der Componenten. Diese kannst du mit
setPreferredSize(new Dimension( width,height ));
ändern.
 

zoj

Mitglied
Das Programm kann nun mittlerweile den Grafen in den von mir vorgegebenen Bereich zeichnen. (xmin,xmax,ymin,ymax). Auch die Achsen stellt es dar.

Nun wollte ich auch die Einteilungen auf der x-Achse darstellen lassen.
Beim starten des Programmes, werden diese erst richtig dargestellt.
Wenn man aber die Grenzen ändert, verschwinden manche Einteilungen.(Anhang:Bilder)

Ich bin folgendermaßen vorgegangen:
Mit einer for-Schleife duchlaufe ich jeden Pixel und untersuche dessen x-Wert.
Wenn der x-Wert eine Ganzzahl ist, bestimme ich dessen y-Wert und stelle daraus einen Strich dar.

Kann mir wer sagen, was an dem Programm nicht stimmt?

Hier der Quellcode:
Java:
package de.ipartner.java;
import java.awt.*;
import javax.swing.*;
import javax.swing.JComponent;
import java.awt.event.*;
import java.text.*;

public class JPlotterV2_2 extends JApplet{
    private JTextField xMin_txt,xMax_txt,yMin_txt,yMax_txt;
    private JButton plotten;
    private JPanel panelInfo,panelEingabe;
    public JLabel lbl_info,lbl_xMin,lbl_xMax,lbl_yMin,lbl_yMax;

    public double xa=-10.0;
    public double xe=10.0;
    public double ya=-10.0;
    public double ye=10.0;

    double pxMax = 200;
    double pyMax = 200;

    public void init(){
        this.setSize(300, 300);
        this.getContentPane().setBackground(new Color(255,204,102));
        this.getContentPane().setLayout(new FlowLayout());

        xMin_txt = new JTextField("-10");
        xMin_txt.setPreferredSize(new Dimension(40,20));
        xMax_txt = new JTextField("10");
        xMax_txt.setPreferredSize(new Dimension(40,20));
        yMin_txt = new JTextField("-10");
        yMin_txt.setPreferredSize(new Dimension(40,20));
        yMax_txt = new JTextField("10");
        yMax_txt.setPreferredSize(new Dimension(40,20));
        plotten = new JButton("Plotten");
        lbl_info = new JLabel("Funktionsplotter Version 2");
        lbl_xMin = new JLabel("x min");
        lbl_xMax = new JLabel("x max");
        lbl_yMin = new JLabel("y min");
        lbl_yMax = new JLabel("y max");

        panelInfo = new JPanel();
        panelEingabe = new JPanel();
        panelEingabe.setBackground(new Color(200,200,100));
        panelEingabe.setSize(50, 50);
        panelInfo.add(lbl_info);
        panelEingabe.add(lbl_xMin);
        panelEingabe.add(xMin_txt);
        panelEingabe.add(lbl_xMax);
        panelEingabe.add(xMax_txt);
        panelEingabe.add(lbl_yMin);
        panelEingabe.add(yMin_txt);
        panelEingabe.add(lbl_yMax);
        panelEingabe.add(yMax_txt);
        panelEingabe.add(plotten);

        panelFkt.setPreferredSize(new Dimension(200,200));
        panelFkt.setBackground(new Color(240,255,240));

        this.getContentPane().add(panelInfo);
        this.getContentPane().add(panelEingabe);
        this.getContentPane().add(panelFkt);

        plotten.addActionListener(new knopfAktion());
    }

    class knopfAktion implements ActionListener{
        public void actionPerformed(ActionEvent e){
            aktualisierung(e);
        }
    }

    private void aktualisierung(ActionEvent e){
        try{
            xa = Integer.parseInt(xMin_txt.getText());
            xe = Integer.parseInt(xMax_txt.getText());
            ya = Integer.parseInt(yMin_txt.getText());
            ye = Integer.parseInt(yMax_txt.getText());
            lbl_info.setText("Funktionsplotter Version 2");
            repaint();
        }catch(NumberFormatException nfe){
                System.out.println("Falsche Eingabe!");
                lbl_info.setText("Falsche Eingabe!");
            }
    }

    //Gibt den Funktionswert in Abhängigkeit von x zurück
    double f(double x){
        return (-x*x*x+3*x*x);
    }

    //Gibt die py Koordinate in Abhängigkeit von y zurück
    int px_y(double y){
        return((int)(pyMax*(ye-y)/(ye-ya)));
    }

    //Gibt die px Koordinate in Abhängigkeit von x zurück
    int px_x(double x){
        return( (int)(pxMax*(x-xa)/(xe-xa)) );
    }

    //Gibt die x Koordinate in Abhängigkeit von px zurück
    double kar_x(int px){
        return( px*(xe-xa)/(pxMax)+xa);
    }

    //Gibt die y Koordinate in Abhängigkeit von py zurück
    double kar_y(int py){
        return( ye-py*(ye-ya)/(pyMax));
    }

    private JPanel panelFkt = new JPanel(){
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);

            int px_old=0;
            int py_old=px_y( f(xa) ) ;
            int py;

            DecimalFormat df = new DecimalFormat("#0.########");

            //Achsenbeschriftung

            //x_alt ist
            double x_alt=0;

            for(int px=0;px<=pxMax;px++){
                double x = kar_x(px);

                //x auf Ganzzahl prüfen
                if( (x - (int)x) == 0 ){
                    System.out.println("Ganzzahl:"+x+" in px: "+px_x(x));

                    //Abstand zwischen den Einteilungen bestimmen
                    if( (px - px_x(x_alt))>=15 ){
                        //System.out.println(px +" : "+ px_x(x_alt));
                        //System.out.println(x+" : "+x_alt);
                    }

                    x_alt = x;
                    g.drawLine(px,px_y(0)+3 , px, px_y(0)-3);
                    g.drawString(df.format(x), px, px_y(0)+15);
                }
                
            }

            for(int px = 0; px <= pxMax; px++){

                py = px_y( f( kar_x(px) ) );

                g.drawLine(px_old, py_old, px, py);
                px_old=px;
                py_old=py;
            }
            //Achsen
            //X-Achse
            g.drawLine(0, px_y(0), (int)pxMax, px_y(0));
            //Y-Achse
            g.drawLine(px_x(0), (int)pyMax, px_x(0), 0);
        }
    };
}
 

zoj

Mitglied
Ups, Denkfehler :)

Habe das Problem erkannt. Die Grenzen habe ich ja bereits festgelegt und habe somit die x-Werte und deren px-Werte. :oops:
 

zoj

Mitglied
Guten Tag,

habe nun den Funktionsplotter fertig. Was fehlt ist ein Eingabefeld wo man die Funktion eingeben kann.

Könnt ihr euch den Plotter mal anschauen und evtl. Verbesserungsvorschläge geben?

Hier kann der Plotter online betrachtet werden:
Applet HTML Page

Hier der Quellcode:
Java:
package de.ipartner.java;
import java.awt.*;
import javax.swing.*;
import javax.swing.JComponent;
import java.awt.event.*;
import java.text.*;

public class JPlotterV2_2 extends JApplet{
    private JTextField xMin_txt,xMax_txt,yMin_txt,yMax_txt;
    private JButton plotten;
    private JPanel panelInfo,panelEingabe;
    public JLabel lbl_info,lbl_xMin,lbl_xMax,lbl_yMin,lbl_yMax;

    public double xa=-10.0;
    public double xe=10.0;
    public double ya=-10.0;
    public double ye=10.0;
    double pxMax = 200;
    double pyMax = 200;

    public void init(){
        this.setSize(450, 300);
        this.getContentPane().setBackground(new Color(255,204,102));
        this.getContentPane().setLayout(new FlowLayout());

        xMin_txt = new JTextField("-10");
        xMin_txt.setPreferredSize(new Dimension(40,20));
        xMax_txt = new JTextField("10");
        xMax_txt.setPreferredSize(new Dimension(40,20));
        yMin_txt = new JTextField("-10");
        yMin_txt.setPreferredSize(new Dimension(40,20));
        yMax_txt = new JTextField("10");
        yMax_txt.setPreferredSize(new Dimension(40,20));
        plotten = new JButton("Plotten");
        lbl_info = new JLabel("Funktionsplotter Version 2");
        lbl_xMin = new JLabel("x min");
        lbl_xMax = new JLabel("x max");
        lbl_yMin = new JLabel("y min");
        lbl_yMax = new JLabel("y max");

        panelInfo = new JPanel();
        panelEingabe = new JPanel();
        panelEingabe.setBackground(new Color(200,200,100));
        panelEingabe.setSize(50, 50);
        panelInfo.add(lbl_info);
        panelEingabe.add(lbl_xMin);
        panelEingabe.add(xMin_txt);
        panelEingabe.add(lbl_xMax);
        panelEingabe.add(xMax_txt);
        panelEingabe.add(lbl_yMin);
        panelEingabe.add(yMin_txt);
        panelEingabe.add(lbl_yMax);
        panelEingabe.add(yMax_txt);
        panelEingabe.add(plotten);

        panelFkt.setPreferredSize(new Dimension(200,200));
        panelFkt.setBackground(new Color(240,255,240));

        this.getContentPane().add(panelInfo);
        this.getContentPane().add(panelEingabe);
        this.getContentPane().add(panelFkt);

        plotten.addActionListener(new knopfAktion());
    }

    class knopfAktion implements ActionListener{
        public void actionPerformed(ActionEvent e){
            aktualisierung(e);
        }
    }

    private void aktualisierung(ActionEvent e){
        try{
            xa = Integer.parseInt(xMin_txt.getText());
            xe = Integer.parseInt(xMax_txt.getText());
            ya = Integer.parseInt(yMin_txt.getText());
            ye = Integer.parseInt(yMax_txt.getText());
            lbl_info.setText("Funktionsplotter Version 2");
            repaint();
        }catch(NumberFormatException nfe){
                System.out.println("Falsche Eingabe!");
                lbl_info.setText("Falsche Eingabe!");
            }
    }

    //Gibt den Funktionswert in Abhängigkeit von x zurück
    double f(double x){
        return (-x*x*x+3*x*x);
    }

    //Gibt die py Koordinate in Abhängigkeit von y zurück
    int px_y(double y){
        return((int)(pyMax*(ye-y)/(ye-ya)));
    }

    //Gibt die px Koordinate in Abhängigkeit von x zurück
    int px_x(double x){
        return( (int)(pxMax*(x-xa)/(xe-xa)) );
    }

    //Gibt die x Koordinate in Abhängigkeit von px zurück
    double kar_x(int px){
        return( px*(xe-xa)/(pxMax)+xa);
    }

    //Gibt die y Koordinate in Abhängigkeit von py zurück
    double kar_y(int py){
        return( ye-py*(ye-ya)/(pyMax));
    }

    private JPanel panelFkt = new JPanel(){
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);

            int px_old=0;
            int py_old=px_y( f(xa) ) ;
            int py;

            DecimalFormat df = new DecimalFormat("#0.########");

            //Achsenbeschriftung
            int x = (int)xa;
            double schrittweite_x = 1;
            double abstand_px = px_x(x+schrittweite_x)-px_x(x);
            System.out.println("Abstand_px: "+abstand_px);

            int y = (int)ya;
            double schrittweite_y =1;
            double abstand_y = px_y(y+schrittweite_y)-px_y(y);
            abstand_y =-1*abstand_y;
            System.out.println("Abstand_py: "+abstand_y);

            //Abstand zwischen den X_Wereten des K.S anpassen

            //Der Pixel-Abstand zwischen den x-Werten ist zu klein
            //Der Abstand soll mindestens 20 Pixel betragen
            //Also den Abstand erhöhen
            if(abstand_px <20){
                do{
                    schrittweite_x += 0.5;
                    abstand_px = px_x(x+schrittweite_x)-px_x(x);
                    System.out.println("Abstand_px+: "+abstand_px);
                }while(abstand_px <=20);
            }

            if(abstand_y <20){
                do{
                    schrittweite_y += 0.5;
                    abstand_y = px_y(y+schrittweite_y)-px_y(y);
                    abstand_y =-1*abstand_y;
                    System.out.println("Abstand_py+: "+abstand_y);
                }while(abstand_y <=20);
            }

            System.out.println("Jetzt wird gezeichnet");

            for(x=(int)xa;x<=xe;x+=schrittweite_x){
                g.drawLine(px_x(x),px_y(0)+3 , px_x(x), px_y(0)-3);
                System.out.println("x: "+ x);
                g.drawString(df.format(x), px_x(x), px_y(0)+15);
            }

            for(y=(int)ya;y<=ye;y+=schrittweite_y){
                g.drawLine(px_x(0)-3, px_y(y), px_x(0)+3, px_y(y));
                System.out.println("y: "+ y);
                g.drawString(df.format(y), px_x(0)+15, px_y(y)+3);
            }
            
            for(int px = 0; px <= pxMax; px++){
                py = px_y( f( kar_x(px) ) );
                g.drawLine(px_old, py_old, px, py);
                px_old=px;
                py_old=py;
            }
            //Achsen darstellen
            //X-Achse
            g.drawLine(0, px_y(0), (int)pxMax, px_y(0));
            //Y-Achse
            g.drawLine(px_x(0), (int)pyMax, px_x(0), 0);
        }
    };
}

Ich freue mich auf ein Feetback
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben