# Funktionsplotter



## zoj (4. Jun 2009)

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:


```
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 (4. Jun 2009)

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


----------



## zoj (4. Jun 2009)

Verjigorm hat gesagt.:


> 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 (4. Jun 2009)

Du weisst schon, dass Pixel keine Kommazahlen haben?

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


----------



## Schandro (4. Jun 2009)

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 (4. Jun 2009)

Verjigorm hat gesagt.:


> Du weisst schon, dass Pixel keine Kommazahlen haben?



Stimmt :lol:



Verjigorm hat gesagt.:


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



Hört sich kompliziert an. Dabei will ich ganz klein anfangen.
Trotzdem - Danke für den Tipp!


----------



## Verjigorm (4. Jun 2009)

zoj hat gesagt.:


> Hört sich kompliziert an. Dabei will ich ganz klein anfangen.
> Trotzdem - Danke für den Tipp!



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


----------



## zoj (4. Jun 2009)

Verjigorm hat gesagt.:


> 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 (4. Jun 2009)

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

Sollte man aber vermeiden, wenn es geht


----------



## zoj (30. Jun 2009)

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:


```
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);
    }
}
```


----------



## SlaterB (30. Jun 2009)

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 (10. Jul 2009)

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:

```
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));
    }
}
```


----------



## Leroy42 (10. Jul 2009)

Benutze einen passenden Layout-Manager.


----------



## zoj (10. Jul 2009)

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 (10. Jul 2009)

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 (10. Jul 2009)

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


```
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 (10. Jul 2009)

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:

```
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));
    }
}
```


----------



## Schandro (10. Jul 2009)

repaint();


----------



## Leroy42 (10. Jul 2009)

zoj hat gesagt.:


> Wie erreiche ich nun, dass die Funktion paint() erneut aufgerufen wird?



Einfach durch einen Aufruf der Methode repaint() neu initiieren!


----------



## zoj (10. Jul 2009)

Es klappt 

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


----------



## Leroy42 (10. Jul 2009)

Nein!

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


----------



## Schandro (10. Jul 2009)

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.


----------



## zoj (10. Jul 2009)

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 (11. Jul 2009)

Beispiel:


```
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 (11. Jul 2009)

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 (11. Jul 2009)

Ups, mein Fehler gewesen. 

So, habe deinen Ansatz übernommen und das Ergebnis sieht so ausBild)
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:

```
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 (11. Jul 2009)

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


----------



## zoj (15. Jul 2009)

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: 

```
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 (15. Jul 2009)

Ups, Denkfehler 

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


----------



## zoj (16. Jul 2009)

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:

```
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


----------



## HoaX (16. Jul 2009)

edit: da gings ja auf seite 2 weiter ...


----------

