Also ich baue mir grad einen Funktionsplotter, der auch schon funktioniert, ich kann eine Funktion eingeben, sie wird mir gezeichenet wenn ich auf den "Funktion zeichne" button klicke, mir wird für die Funktion die Wertetabelle ausgegeben, wenn ich auf den button "Wertetabelle" klicke und habe jetzt einen "Ableitung"sbutton hinzugefügt, der mir meine erste Ableitung ausgibt und mir die Ableitung auch noch zeichnet! Das funktioniert soweit auch alles,
mein Problem ist jetzt nur, das jedes mal wenn eine Funktion zum zeichnen gesetzt wird, das ganze canvas nochmal gezeichnet wird.(redraw())Da die ableitungs funktion auch als funktion gezählt wird, wird sie zwar gezeichnet,die Grund Funktion wird aber sozusagen übermalt.Das will ich nicht!
Du grund funktion soll im Canvas drin bleiben und die ABleitung soll darauf gezeichnet werden, am besten in einer anderen Farbe. Das wäre toll.........:toll:
ich weiß das der fehler bei mir in der setFunction methode liegt, weil da jedes mal,wenn eine Funktion gesetzt wird, die redraw() funktion aufgerufen wird.!
Aber wie könnte ich das am besten realisieren????
und meine zweite FRage ist, wie ich das am besten realsiere,wenn ich ein "Lösch" Button haben möchte, der mir alles wieder löscht,also die Wertetabelle,die Ableitung und die Funktion.....
weil an die labels und so, komme ich ja nicht ran, das ich sagen könnte clear() oder sowas....!?
ich hoffe sehr, mir kann jemand helfen!Danke schon mal im Vorraus!
:rtfm:
mal bissel code!
und die Funktionsplotter Klasse ist zum zeichnen da!
EDIT: und das ganze natürlich in SWT
mein Problem ist jetzt nur, das jedes mal wenn eine Funktion zum zeichnen gesetzt wird, das ganze canvas nochmal gezeichnet wird.(redraw())Da die ableitungs funktion auch als funktion gezählt wird, wird sie zwar gezeichnet,die Grund Funktion wird aber sozusagen übermalt.Das will ich nicht!
Du grund funktion soll im Canvas drin bleiben und die ABleitung soll darauf gezeichnet werden, am besten in einer anderen Farbe. Das wäre toll.........:toll:
ich weiß das der fehler bei mir in der setFunction methode liegt, weil da jedes mal,wenn eine Funktion gesetzt wird, die redraw() funktion aufgerufen wird.!
Aber wie könnte ich das am besten realisieren????
und meine zweite FRage ist, wie ich das am besten realsiere,wenn ich ein "Lösch" Button haben möchte, der mir alles wieder löscht,also die Wertetabelle,die Ableitung und die Funktion.....
weil an die labels und so, komme ich ja nicht ran, das ich sagen könnte clear() oder sowas....!?
ich hoffe sehr, mir kann jemand helfen!Danke schon mal im Vorraus!
:rtfm:
mal bissel code!
Java:
package funktionen;
public class PlotterGUI {
private Display display = new Display();
private Shell shell = new Shell(display);
Funktionssplitter funktionssplitter;
private FunktionPlotter canvas;
/**
* Erstellt ein Canvas für den Funktionsplotter
*/
public void guiErstellt() {
shell.setText("Funktions Plotter");
shell.setSize(900, 600);
// Canvas erzeugen und auf shell setzten
canvas = new FunktionPlotter(shell, SWT.BORDER);
............
canvas.addMouseListener(new MouseListener() {
...................
@Override
public void mouseUp(MouseEvent e) {
...........
}
@Override
public void mouseDown(MouseEvent e) {
...........
}
@Override
public void mouseDoubleClick(MouseEvent e) {}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
/**
* Erstellt alle text felder aud der Anwendungsoberfläche
*
* @param shell
* Anwendungsoberfläche
* @return
*/
public Shell textFields(Shell shell) {
// TextLabel auf shell erstellen mit erklärung des programms
..............
// Textfeld erstellen für die zu eingegebene Funktion
..........
// Button "Funktion zeichnen" erstellen
Button zeichnen = new Button(shell, PUSH);
zeichnen.setText("Funktion zeichnen");
zeichnen.setBounds(550, 180, 140, 25);
// Button einem Listener hinzufügen um auf die Ereignisse zu reagieren
zeichnen.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MathEngine mathEngine = new MathEngine();
String text = feld.getText();
IFunction f = mathEngine.eval(text);
canvas.setFunction(f);
};
});
// Button "Wertetabelle ausgeben" erstellen
.............
});
// Button "Ableitung" erstellen zum Ausgeben und zeichnen der Funktion
Button ableitung = new Button(shell, PUSH);
ableitung.setText("Ableitung");
ableitung.setBounds(550, 260, 140, 25);
ErsteAbleitung ableitungen = new ErsteAbleitung(feld.getText());
funktionssplitter = new Funktionssplitter(feld.getText(), ableitungen);
ableitung.addListener(SWT.OK, new Listener() {
@Override
public void handleEvent(Event event) {
String ableitung = funktionssplitter.ableitung(feld.getText());
printAbleitung(ableitung);
MathEngine mathEngine = new MathEngine();
IFunction f = mathEngine.eval(ableitung);
canvas.setFunction(f);
}
});
// Button "Löschen" löscht die ganze Funktion
// Button löschen = new Button(shell, PUSH);
// löschen.setText("Funktion löschen");
// löschen.setBounds(550, 450, 140, 25);
// löschen.addListener(SWT.OK, new Listener() {
// @Override
// public void handleEvent(Event event) {
// }
// });
return shell;
}
protected void printAbleitung(String ableitung) {
Label label = new Label(shell, SWT.LEFT_TO_RIGHT);
label.setBounds(550, 290, 140, 40);
label.setText("f'(x)=" +ableitung);
}
/**
* Gibt die Wertetabelle zurück für das ganze x Intervall[-9..9]
*
* @param stringFunction
* Funktion für die, die Wertetabelle berechnet werden soll
* @return
*/
public void printWertetabelle(String stringFunction) {
..............
label.setText(stringBuilder.toString());
}
public static void main(String[] args) {
new PlotterGUI().guiErstellt();
}
}
und die Funktionsplotter Klasse ist zum zeichnen da!
Java:
package funktionen;
public class FunktionPlotter extends Canvas {
private IFunction function;
int oberstesEnde;
int unterstesEnde;
int linkesEnde;
int rechtesEnde;
FunktionPlotter(Composite parent,
int style) {
super(parent, style);
//Standard einteilung
setLinkesEnde(-10);
setRechtesEnde(10);
setOberstesEnde(10);
setUnterstesEnde(-10);
addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
drawScala(e.gc);
drawFunction(e.gc);
}
});
}
/** Zeichnet das Koordinatenkreuz und die Scala des Koordinatenkreuzes */
private void drawScala(GC gc) {
.......
}
// Y-Koordinatenachse
.......
//zeichnet die y-Achse
......
//zeichnet die einteilung und beschriftung der y-achse
.........
}
}
/**
* Zeichnet die Funktion
*
* @param gc
*/
public void drawFunction(GC gc) {
if (function == null)
return;
KoordinatenUmrechnerX umrechnerX = new KoordinatenUmrechnerX(getSize().x, linkesEnde, rechtesEnde);
KoordinatenUmrechnerY umrechnerY = new KoordinatenUmrechnerY(getSize().y, oberstesEnde, unterstesEnde);
int py2 = 0;
int px2 = 0;
// im Koordinatensystem gibt es 500 Pixel
for (double x = -100; x < 100; x += 0.04) {
// berechnet für das x das y
double y = function.f(x);
// berechnet X-Pixel für die bestimmte Funktion
int px1 = (int) umrechnerX.f(x);
// berechnet Y-Pixel für die bestimmte Funktion
int py1 = (int) umrechnerY.f(y);
gc.drawLine(px1, py1, px2, py2);
px2 = px1;
py2 = py1;
}
}
public int getLinkesEnde() {
return linkesEnde;
}
public void setLinkesEnde(int linkesEnde) {
this.linkesEnde = linkesEnde;
}
public int getRechtesEnde() {
return rechtesEnde;
}
public void setRechtesEnde(int rechtesEnde) {
this.rechtesEnde = rechtesEnde;
}
public int getOberstesEnde() {
return oberstesEnde;
}
public void setOberstesEnde(int oberstesEnde) {
this.oberstesEnde = oberstesEnde;
}
public int getUnterstesEnde() {
return unterstesEnde;
}
public void setUnterstesEnde(int unterstesEnde) {
this.unterstesEnde = unterstesEnde;
}
public IFunction getFunction() {
return function;
}
public void setFunction(IFunction function) {
this.function = function;
redraw();
}
}
EDIT: und das ganze natürlich in SWT
Zuletzt bearbeitet: