Interface als Konstruktorparameter nutzen, um Funktion zu plotten

masul

Mitglied
Guten Abend, alle zusammen!

Ich muss mich für eine anstehende Klausur mit dem Thema "Interfaces als Konstruktorparameter" auseinandersetzen. Bisher habe ich sowas noch nie benutzt, bin jetzt auch in einen Kurs gekommen, in dem dieses Thema schon behandelt wurde. Jetzt muss ich mir das quasi selbst aneignen.
Ich habe mir dazu eine alte Klausur des Professors angeschaut, in der genau dies drankam, und versuche jetzt, die Aufgabe als Übung zu lösen. (Aufgabe siehe Anhang)

Leider bin ich nicht sehr weit gekommen, da ich nicht weiß, wie ich mit diesem Interface umgehen soll.;(


Hier mein bisheriger Code dazu:
Java:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

[COLOR="Red"]public class FunctionPlotter extends JPanel [/COLOR]{
	
	protected Function function;
	
	public FunctionPlotter(Function function) {
		this.function = function;
		repaint();
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		for(int i = 25; i <= 500; i += 25) {
			g.setColor(Color.GRAY);
			g.drawLine( i, 0, i, 600);
			for(int j = 25; j <= 600; j += 25)
				g.drawLine( 25, j, 500, j);
		}
		
		g.setColor(Color.RED);
		
		// hier muss ich noch irgendwie den Funktionsgraphen zeichnen lassen
		
	}
}

Java:
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JFrame;

[COLOR="Red"]public class Main [/COLOR]{

	public static void main(String[] args) {
		
		JFrame frame = new JFrame("FunctionPlotter");
		Container container = frame.getContentPane();
		container.setLayout(new GridLayout(1, 2));
		container.add(new FunctionPlotter(new Function() {
			public int value(int argument) {
				return (int) (200 * Math.sin(0.1 * argument));
			}	
		}));
		container.add(new FunctionPlotter(new Function() {
			public int value(int argument) {
				return (int) (150 * Math.cos(0.05 * argument - (Math.PI/4)));
			}	
		}));
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(1050, 650);
		frame.setVisible(true);
	}
}

Und das von ihm vorgegebene Interface:

Java:
[COLOR="Red"]public interface Function[/COLOR] {
	
	public abstract int value(int argument);
}

Ich habe mich schon im Forum umgeschaut und etwas Ähnliches gefunden, nur dass ich das irgendwie nicht so ganz verstanden habe.
http://www.java-forum.org/codeschnipsel-u-projekte/122994-einfacher-funktionsplotter.html

Es wäre echt supernett, wenn mir einer auf die Sprünge helfen könnte, denn die Klausur ist mein 2. Versuch und bin dementsprechend nervös.
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    68,3 KB · Aufrufe: 27
Mir geht es darum, diese Aufgabe im Anhang zu lösen. Bin bisher noch nicht so weit gekommen, da ich mit diesem Interface nicht viel anfangen kann.
 
Naja, du musst eine Klasse schreiben die Function implementiert und eine der angegebenen Funktionen erfüllt. Diese Klasse übergibst du dann dem FunktionsPLotter.
 
Also ich habe das so verstanden, dass das Interface nur im Konstruktor übergeben und nicht von der Klasse direkt implementiert werden soll..
 
Ja ist auch richtig. Du erstellst ja auch ne neue Klasse die das Interface implementiert. Alternativ kannst du auch ne anonyme Klasse nehmen wenn du das schon kennst.
 
Ein Interface übergint man nicht einfach, man übergibt ein konkretes Objekt einer bestimmten Klasse (oder zumindest einer anonymen). Diese Klasse kann dabei ein Interface implementieren, mit dem Konstruktor hat das aber herzlich wenig zu tun.
 
Hmm..ich glaube du meinst das, was ich in meinem 2. Codeschnipsel Z.13 auch getan habe. Aber ich verstehe nicht so ganz, wo ich diese Funktion dann zeichnen lassen soll.
 
Achso, dann hat dein Problem doch gar nichts mit Konstruktoren oder Interfaces zu tun ???:L

Dein Problem scheint zu sein dass du nicht weißt wie du die Funktion zeichnen sollst? Geh mit ner Schleife von -10 bis 10 in bspw. 0.1 Schritten und bestimme mit der Funktion den entsprechenden Y Wert. Dann machst du nen Punkt an der Stelle x/y.
 
Tut mir leid, wenn ich mich falsch ausgedrückt habe. Du hast natürlich Recht. Ich war nur verunsichert, weil ich nicht wusste, ob das soweit richtig war, wie ich das gemacht habe. Aber muss ich jetzt in meine FunctionPlotter- Klasse eine extra Methode schreiben (wie z.B. drawFunction), damit ich die Funktion zeichnen lasse und ihr dann mein argument von der Interface-Methode übergeben? Bin verwirrt, wo ich den Graphics-Code reinschreiben soll.
 
Genau da wo dein Kommentar ist. In der paintComponent(). Wie genau du das machst siehe mein Kommentar oben drüber.
 
Ich habe jetzt in der paintComponent() folgende Schleife hinzugefügt:

Java:
for(int i = 0; i <= 500; i++) {
	g.drawLine(i, function.value(i) +200, i, function.value(i) +200);
}

Nur ist das jetzt keine durchgezogene Linie, sondern nur mehrere Punkte..Habe schon versucht, kleinere Schritte zu machen, hat irgendwie nicht funktioniert.
 
Wenn du einen durchgängigen Graphen haben willst und die Funktion auf dem gesamten Zahlenbereich definiert ist. Dann ziehe die Linien immer von einem Funktionspunkt zum nächsten. Das heißt du musst dir immer den letzten berechneten Punkt zwischenspeichern.
 
Dann zeichne doch nicht jeden Punkt, sondern eine Linie von funktionswert i zu i+1 😉
Achtung, da musst du aufpassen, dass du keine IndexOutOfBounds exception bekommst.
 
Vielen Dank für eure schnellen und hilfreichen Kommentare!

Habe jetzt einfach
Java:
g.drawLine(i, function.value(i) +200, i-1, function.value(i-1) +200);
in die Schleife geschrieben und jetzt passt's🙂

Manchmal brauche ich einfach noch jemanden, der mir einen kleinen Denkanstoß gibt.
Ich wünsche euch noch einen schönen Abend!
 

Neue Themen


Zurück
Oben