Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln

Diskutiere Graphikrechner 2/Strings und Variablen in Doubles umwandeln im Allgemeine Java-Themen Bereich.
V

visar77

Hallo, ich versuch ein Graphikrechner zu programmieren. Sowohl die Zeichnung des Graphen als auch die Nullstellenbestimmung funktioniert jetzt fast komplett einwandfrei. Nun will ich aber, dass ich in der Konsole eine mathematische Funktion eingeben kann, damit das Programm diese dann ausführen kann. Dafür muss ich aber ein Weg finden, wie ich ein String inkl. Variable z.B ("x+1") in ein Double konvertieren kann. Ich komm hier leider nicht mehr weiter.
Java:
//Scanner sc = new Scanner(System.in);
        //String Funktion = sc.next();
        String Funktion = "3*x";
            
        //Funktionsgraphen
        g2d.setStroke(new BasicStroke(2));
        int Genauigkeit = 1000;
        ArrayList<Double> xcoords = new ArrayList<Double>();
        ArrayList<Double> ycoords = new ArrayList<Double>();
        for(int x = (-16*Genauigkeit); x<(16*Genauigkeit)+1; x++) {
            //Da x sehr groß ist und somit nicht bei der Zeichnung der Funktion eingesetzt werden kann, verwendete ich x2
            double x2 = x/(Genauigkeit/1.0);
            xcoords.add(x2);
            //y ist die Funktion
            double y = Double.parseDouble(Funktion);
            ycoords.add(y);
                
            g2d.setColor(Color.red);
            //Diese Zeile zeichnet den Graphen
            g2d.draw(new Line2D.Double(breite/2+x2*(höhe/20), höhe/2-y*(höhe/20),breite/2+x2*(höhe/20), höhe/2-y*(höhe/20)));
        }
Wenn jemand mein Code ausführen will:
Java:
import java.awt.*;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Main extends Canvas{

    private static final long serialVersionUID = 4648172894076113183L;
    private static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    private static double breite = screenSize.getWidth();
    private static double höhe = screenSize.getHeight();
    public static int GUI = 1;
    
    public void paint(Graphics g) {
        //KoordinatenSystem und Graphen
        
        Graphics2D g2d = (Graphics2D) g;
        //x-Achse
        Polygon dreieck = new Polygon();
        dreieck.addPoint((int)breite/2, 0);
        dreieck.addPoint(((int)breite/2)-60,40);
        dreieck.addPoint(((int)breite/2)+60,40);
        g2d.setColor(Color.black);
        g2d.fill(dreieck);
        g2d.setStroke(new BasicStroke(4));
        g.setColor(Color.black);
        g.drawLine((int)breite/2, 42, (int)breite/2,(int) höhe);
            
        //y-Achse
        Polygon dreieck2 = new Polygon();
        dreieck2.addPoint((int)breite -15,(int) höhe/2);
        dreieck2.addPoint((int)breite -60,(int)höhe/2 -60);
        dreieck2.addPoint((int)breite -60,(int)höhe/2 +60);
        g2d.fill(dreieck2);
        g.setColor(Color.black);
        g.drawLine(0, (int) höhe/2, (int)breite-42,(int) höhe/2);
            
            
        //Nummerierung
        //x-Achse
        int xKoordinaten = 9;
        for(int i = (int) (höhe/20); i<(int) (höhe*19/20); i+=(int)höhe/20) {
            g2d.setStroke(new BasicStroke(3));
            g.drawLine((int)breite/2+10,i+3,(int)breite/2-10,i+3);
            g2d.setStroke(new BasicStroke(1));
            g.drawLine(0, i+3, (int)breite, i+3);
            if(xKoordinaten != 0) {
                g.setFont(new Font("Monospaced",Font.BOLD,20));
                g.drawString(""+xKoordinaten, (int)breite/2-43, i+10);
            }
            xKoordinaten -= 1;
                
        }
        //y-Achse positiv
        int yKoordinaten = 0;
        for(int i = (int) breite/2+3; i<(int) breite-40; i+=(int)höhe/20) {
            g2d.setStroke(new BasicStroke(3));
            g.drawLine(i-3,(int)höhe/2+10,i-3,(int)höhe/2-10);
            g2d.setStroke(new BasicStroke(1));
            g.drawLine(i-3, 0, i-3, (int)höhe);
            if(yKoordinaten != 0) {
                g.setFont(new Font("Monospaced",Font.BOLD,20));
                g.drawString(""+yKoordinaten, i-7, (int) höhe/2+39);
            }
            yKoordinaten += 1;
                
        }
            //y-Achse negativ
        int yminusKoordinaten = 0;
        for(int i = (int) breite/2+3; i>40; i-=(int)höhe/20) {
            g2d.setStroke(new BasicStroke(3));
            g.drawLine(i-3,(int)höhe/2+10,i-3,(int)höhe/2-10);
            g2d.setStroke(new BasicStroke(1));
            g.drawLine(i-3,0,i-3,(int)höhe);
            if(yminusKoordinaten != 0) {
                g.setFont(new Font("Monospaced",Font.BOLD,20));
                g.drawString(""+yminusKoordinaten, i-7, (int) höhe/2+39);
            }
            yminusKoordinaten -= 1;
                        
        }
        //Scanner sc = new Scanner(System.in);
        //String Funktion = sc.next();
        String Funktion = "3*x";
            
        //Funktionsgraphen
        g2d.setStroke(new BasicStroke(2));
        int Genauigkeit = 1000;
        ArrayList<Double> xcoords = new ArrayList<Double>();
        ArrayList<Double> ycoords = new ArrayList<Double>();
        for(int x = (-16*Genauigkeit); x<(16*Genauigkeit)+1; x++) {
            //Da x sehr groß ist und somit nicht bei der Zeichnung der Funktion eingesetzt werden kann, verwendete ich x2
            double x2 = x/(Genauigkeit/1.0);
            xcoords.add(x2);
            //y ist die Funktion
            double y = Double.parseDouble(Funktion);
            ycoords.add(y);
                
            g2d.setColor(Color.red);
            //Diese Zeile zeichnet den Graphen
            g2d.draw(new Line2D.Double(breite/2+x2*(höhe/20), höhe/2-y*(höhe/20),breite/2+x2*(höhe/20), höhe/2-y*(höhe/20)));
        }
        //Nullstellenbestimmung
        int phase = 0;
        int counter = 1;
        for(int i=0; i<ycoords.size(); i++) {
            if(i<ycoords.size()-1) {
                double z = Math.abs(ycoords.get(i+1));
                double z2 = Math.abs(ycoords.get(i));
                if(phase == 0) {
                    if(z<z2) {
                        phase = 1;
                        counter++;
                        if(counter % 2 == 0) System.out.println("Extrempunkt bei:"+xcoords.get(i));
                        else System.out.println("Nullstelle bei:"+xcoords.get(i));
                    }
                }
                else if(phase == 1){
                        if(z>z2) {
                        phase = 0;
                        counter++;
                        if(counter % 2 == 0) System.out.println("Extrempunkt bei:"+xcoords.get(i));
                        else System.out.println("Nullstelle bei:"+xcoords.get(i));
                    }
                }
            }
        }
    }
    
    public static void main(String[] args) {
        Main m = new Main();
        
        JFrame f = new JFrame("Graphikrechner by Visar Lumi");
        f.getContentPane().add(m, BorderLayout.CENTER);
        m.addKeyListener(new KeyInput());
        f.setSize(new Dimension((int)breite,(int)höhe));
        f.setVisible(true);
        
        

    }

}
 
mrBrown

mrBrown

Du musst die eingegebenen Funktionen parsen und dir ein "Funktionsobjekt" erstellen, womit du dann das Ergebnis an den verschiedene Stellen berechnen kannst.

Für den einfachen Einsteig kannst du dir mal die umgekehrte polnische Notation angucken, damit ist der Aufwand für das Parsen der Funktion relativ gering.
 
V

visar77

Du musst die eingegebenen Funktionen parsen und dir ein "Funktionsobjekt" erstellen, womit du dann das Ergebnis an den verschiedene Stellen berechnen kannst.

Für den einfachen Einsteig kannst du dir mal die umgekehrte polnische Notation angucken, damit ist der Aufwand für das Parsen der Funktion relativ gering.
Könntest du es genauer erläutern was du mit ein Funktionsobjekt meinst? Und was genau soll mir die umgekehrte polnische Notation bringen? Wie ich das richtig verstanden habe, ist das eine Schreibweise wie man mathematische Funktionen logischer eingeben kann, deswegen bin ich mir nicht sicher, was ich damit genau machen soll.
 
R

Rajmund

Dazu ist dieser Thread möglicherweise hilfreich:

 
V

visar77

Dazu ist dieser Thread möglicherweise hilfreich:

Danke, sehr hilfreich. Ich weiß grob wie ich es machen werden. Ich hab nur ein Problem: x und sin/cos. Wie soll ich diese Variablen parsen?
 
V

visar77

Dazu ist dieser Thread möglicherweise hilfreich:

Ich hab es geschafft, es funktioniert jetzt einwandfrei. Es zeichnet den Graphen aber aus irgendwelchen Gründen nicht mehr.
Java:
System.out.println("Gib eine Funktion an:");
        @SuppressWarnings("resource")
        String Funktion = new Scanner(System.in).nextLine();       
            
        //Funktionsgraphen
        g2d.setStroke(new BasicStroke(2));
        int Genauigkeit = 10000;
        ArrayList<Double> xcoords = new ArrayList<Double>();
        ArrayList<Double> ycoords = new ArrayList<Double>();
        for(int x3 = (-16*Genauigkeit); x3<(16*Genauigkeit)+1; x3++) {
            //Da x sehr groß ist und somit nicht bei der Zeichnung der Funktion eingesetzt werden kann, verwendete ich x2
            double x2 = x3/(Genauigkeit/1.0);
            xcoords.add(x2);
            Argument x = new Argument("x");
            x.setArgumentValue(x2);
            Argument fx = new Argument("fx ="+Funktion,x);
            //mXparser.consolePrintln(fx.getArgumentValue());
            //y ist die Funktion
            double y = fx.getArgumentValue();
            double y2 = y;
            ycoords.add(y);
                
            g2d.setColor(Color.red);
            //Diese Zeile zeichnet den Graphen
            g2d.draw(new Line2D.Double(breite/2+x2*(höhe/20), höhe/2-y2*(höhe/20),breite/2+x2*(höhe/20), höhe/2-y2*(höhe/20)));
        }
Java:
package graphikrechner.com;
import java.awt.*;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import org.mariuszgromada.math.mxparser.*;
import java.util.Scanner;
import javax.swing.JFrame;
public class Main extends Canvas{

    private static final long serialVersionUID = 4648172894076113183L;
    private static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    private static double breite = screenSize.getWidth();
    private static double höhe = screenSize.getHeight();
    public static int GUI = 1;
    
    public void paint(Graphics g) {
        //KoordinatenSystem und Graphen
        
        Graphics2D g2d = (Graphics2D) g;
        //x-Achse
        Polygon dreieck = new Polygon();
        dreieck.addPoint((int)breite/2, 0);
        dreieck.addPoint(((int)breite/2)-60,40);
        dreieck.addPoint(((int)breite/2)+60,40);
        g2d.setColor(Color.black);
        g2d.fill(dreieck);
        g2d.setStroke(new BasicStroke(4));
        g.setColor(Color.black);
        g.drawLine((int)breite/2, 42, (int)breite/2,(int) höhe);
            
        //y-Achse
        Polygon dreieck2 = new Polygon();
        dreieck2.addPoint((int)breite -15,(int) höhe/2);
        dreieck2.addPoint((int)breite -60,(int)höhe/2 -60);
        dreieck2.addPoint((int)breite -60,(int)höhe/2 +60);
        g2d.fill(dreieck2);
        g.setColor(Color.black);
        g.drawLine(0, (int) höhe/2, (int)breite-42,(int) höhe/2);
            
            
        //Nummerierung
        //x-Achse
        int xKoordinaten = 9;
        for(int i = (int) (höhe/20); i<(int) (höhe*19/20); i+=(int)höhe/20) {
            g2d.setStroke(new BasicStroke(3));
            g.drawLine((int)breite/2+10,i+3,(int)breite/2-10,i+3);
            g2d.setStroke(new BasicStroke(1));
            g.drawLine(0, i+3, (int)breite, i+3);
            if(xKoordinaten != 0) {
                g.setFont(new Font("Monospaced",Font.BOLD,20));
                g.drawString(""+xKoordinaten, (int)breite/2-43, i+10);
            }
            xKoordinaten -= 1;
                
        }
        //y-Achse positiv
        int yKoordinaten = 0;
        for(int i = (int) breite/2+3; i<(int) breite-40; i+=(int)höhe/20) {
            g2d.setStroke(new BasicStroke(3));
            g.drawLine(i-3,(int)höhe/2+10,i-3,(int)höhe/2-10);
            g2d.setStroke(new BasicStroke(1));
            g.drawLine(i-3, 0, i-3, (int)höhe);
            if(yKoordinaten != 0) {
                g.setFont(new Font("Monospaced",Font.BOLD,20));
                g.drawString(""+yKoordinaten, i-7, (int) höhe/2+39);
            }
            yKoordinaten += 1;
                
        }
            //y-Achse negativ
        int yminusKoordinaten = 0;
        for(int i = (int) breite/2+3; i>40; i-=(int)höhe/20) {
            g2d.setStroke(new BasicStroke(3));
            g.drawLine(i-3,(int)höhe/2+10,i-3,(int)höhe/2-10);
            g2d.setStroke(new BasicStroke(1));
            g.drawLine(i-3,0,i-3,(int)höhe);
            if(yminusKoordinaten != 0) {
                g.setFont(new Font("Monospaced",Font.BOLD,20));
                g.drawString(""+yminusKoordinaten, i-7, (int) höhe/2+39);
            }
            yminusKoordinaten -= 1;
                        
        }
        System.out.println("Gib eine Funktion an:");
        @SuppressWarnings("resource")
        String Funktion = new Scanner(System.in).nextLine();       
            
        //Funktionsgraphen
        g2d.setStroke(new BasicStroke(2));
        int Genauigkeit = 10000;
        ArrayList<Double> xcoords = new ArrayList<Double>();
        ArrayList<Double> ycoords = new ArrayList<Double>();
        for(int x3 = (-16*Genauigkeit); x3<(16*Genauigkeit)+1; x3++) {
            //Da x sehr groß ist und somit nicht bei der Zeichnung der Funktion eingesetzt werden kann, verwendete ich x2
            double x2 = x3/(Genauigkeit/1.0);
            xcoords.add(x2);
            Argument x = new Argument("x");
            x.setArgumentValue(x2);
            Argument fx = new Argument("fx ="+Funktion,x);
            //mXparser.consolePrintln(fx.getArgumentValue());
            //y ist die Funktion
            double y = fx.getArgumentValue();
            double y2 = y;
            ycoords.add(y);
                
            g2d.setColor(Color.red);
            //Diese Zeile zeichnet den Graphen
            g2d.draw(new Line2D.Double(breite/2+x2*(höhe/20), höhe/2-y2*(höhe/20),breite/2+x2*(höhe/20), höhe/2-y2*(höhe/20)));
        }
        //Nullstellenbestimmung
        int phase = 0;
        int counter = 1;
        for(int i=0; i<ycoords.size(); i++) {
            if(i<ycoords.size()-1) {
                double z = Math.abs(ycoords.get(i+1));
                double z2 = Math.abs(ycoords.get(i));
                if(phase == 0) {
                    if(z<z2) {
                        phase = 1;
                        counter++;
                        if(counter % 2 == 0) System.out.println("Extrempunkt bei:"+xcoords.get(i));
                        else System.out.println("Nullstelle bei:"+xcoords.get(i));
                    }
                }
                else if(phase == 1){
                        if(z>z2) {
                        phase = 0;
                        counter++;
                        if(counter % 2 == 0) System.out.println("Extrempunkt bei:"+xcoords.get(i));
                        else System.out.println("Nullstelle bei:"+xcoords.get(i));
                    }
                }
            }
        }
    }
    
    public static void main(String[] args) {
        Main m = new Main();
        
        JFrame f = new JFrame("Graphikrechner by Visar Lumi");
        f.getContentPane().add(m, BorderLayout.CENTER);
        f.setSize(new Dimension((int)breite,(int)höhe));
        f.setVisible(true);
        
        

    }

}
 
Thema: 

Graphikrechner 2/Strings und Variablen in Doubles umwandeln

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben