Ich versuche einen Graphikrechner zu programmieren (sowas wie Geogebra nur viel einfacher), welches mathematische Funktionen mittels Graphics2D zeichnet. Dies klappt problemlos. Problem ist nur, dass der Rechner selber herausfinden soll, wo die Nullstellen liegen. Dabei stoß auf ein Problem mit double, da diese ja nicht null sein können und ich immer runden muss, wodurch ich aber zigfache Nullstellen als Output bekomme. Hier der spezielle Code für die Zeichnung des Graphen:
Für die, die mein Code ausführen wollen:
Java:
//Funktionsgraphen
g2d.setStroke(new BasicStroke(2));
int Genauigkeit = 10000;
for(int x = (-16*Genauigkeit); x<(16*Genauigkeit); x++) {
//y ist die Funktion
double y = Math.sin(x);
/* Probleme:
* -exponentialfunktionen
* -sinus und cosinus
* -nicht alle Nullstellen werden erkannt
*/
//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);
if(y == 0) {
System.out.println("Nullstelle bei:"+x2);
}
//Das selbe gilt mit y2
double y2 = Math.sin(x2);
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:
import java.awt.*;
import java.awt.geom.Line2D;
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 final double MIN_VALUE = 4.94065645841246544e-324;
public void paint(Graphics g) {
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;
}
//Funktionsgraphen
g2d.setStroke(new BasicStroke(2));
int Genauigkeit = 10000;
for(int x = (-16*Genauigkeit); x<(16*Genauigkeit); x++) {
//y ist die Funktion
double y = Math.sin(x);
/* Probleme:
* -exponentialfunktionen
* -sinus und cosinus
* -nicht alle Nullstellen werden erkannt
*/
//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);
if(y == 0) {
System.out.println("Nullstelle bei:"+x2);
}
//Das selbe gilt mit y2
double y2 = Math.sin(x2);
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)));
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Graphikrechner by Visar (Genius) Lumi");
Main m = new Main();
f.getContentPane().add(m, BorderLayout.CENTER);
m.addKeyListener(new KeyInput());
f.setSize(new Dimension((int)breite,(int)höhe));
f.setVisible(true);
}
}