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.
Wenn jemand mein Code ausführen will:
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);
}
}