Kreise, Linien zeichnen

Hallo,

Ich stehe vor einer, für mich, schwierigen Aufgabe. Die Aufgabe geht im allgmeinem um Graphentheorie (Knoten, Kanten, Verbindngen dazwischen und versch. Suchalgos),
dieses Teil habe ich nun auch fertig.
Nun soll ich aber den Graphen graphisch darstellen. Sowie die Kanten zwischen den Graphen.

Ich habe das mal vereinfacht:
Gegeben:
[ul]
[li]Anzahl der Knoten
[/li][li]die jeweiligen x und y Koordinaten des Knoten
[/li][li] Anzahl der Kanten
[/li][li] Die Verbindung zwischen den Knoten. Welcher Knoten Start/Zielknoten von einem anderen ist
[/li][/ul]

Eigentlich ganz easy, ich habe einen Haufen Knoten, die soll ich als Kreise darstellen, und einen Haufen Kanten, die ich als Pfeile darstellen soll.

Konkrete Fragen:

  1. Wie erstelle ich die ganzen Kreise ?
  2. Wie erstelle ich Pfeile zwischen den Kreisen ?

Alles per Hand? Sowas wie http://jung.sourceforge.net/ ist recht bekannt, oder http://jgrapht.org/ , oder was man sonst noch so mit https://www.google.de/search?q=java+graph+libraries findet…

mit Graphics.drawOval und Graphics.drawLine sollte das alles machbar sein.

Für den Pfeil mach dir eine eigene Klasse der du den Start und den Endpunkt des Pfeils übergibst und die dann eine paint Methode hat, die dir den Pfeil mit hilfe von drawLine zeichnet,

Für den Kreis könntest du dir auch einen Klasse machen und beide Klassen dann eine gemeinsames Interface implementieren lassen das einen Paint Methode hat, dann kannstu du alle Zeichenbaren elemente in eine Liste packen und auf einmal zeichnen lassen.

Ne alles automatisiert…

Nur eine Bedingung: alles mit Swing/AWT

[QUOTE=bd3m]Konkrete Fragen:

  1. Wie erstelle ich die ganzen Kreise ?
  2. Wie erstelle ich Pfeile zwischen den Kreisen ?[/QUOTE]Also die Kreise dürften halb so wild sein, dass geht mit “.drawOval()” (oder “fillOval()”) in einer “paintComponent()”-Methode. Die Pfeile würde ich als Linie mit “drawLine()” und die Pfeilspitze als Dreieck (Shape) mit “fill()” zeichnen.

Mit „Per Hand“ meinte ich NICHT „mit Bleistift und Papier“ :smiley: sondern ob du das wirklich alles selbst implementieren sollst. Viele, viele Mannjahre Planung und Programmierung stecken in den verlinkten Bibliotheken. Wenn es nur um ein paar Linien und Kreise geht, schreibt man das in 5 Minuten runter. Aber… soll man die Farben der Knoten ändern können? Sollen die beschriftet sein? Soll man zoomen und pannen können? Soll man Kreise und Linien anklicken und ggf. verschieben können?

Also mal die GUIVIew

import java.awt.event.ActionListener;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeListener;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JSlider;
import javax.swing.JButton;
import javax.swing.DefaultComboBoxModel;

public class DiGraphView extends JFrame {

	
	
	private JPanel contentPane;
	private JMenuBar menuebar;
	private JMenu  menu;
	private JMenuItem open;
	private JLabel Suchalgorithmus;
	private JLabel Startknoten;
	private JLabel Zielknoten;
	private JComboBox comboBox;
	private JComboBox comboBox_1;
	private JComboBox comboBox_2;
	private JSlider slider;
	private JLabel geschwindigkeit;
	private JButton Start;
	private JButton btnNewButton;

	/**
	 * Die main-Methode initialisiert den Controller,
	 * der anschließend die erste GUI öffnet.
	 * 
	 */
	

	/**
	 * Erzeuge Frame.
	 * 
	 */
	public DiGraphView() {
		setTitle("DiGraph-GUIView");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 675, 450);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		menuebar = new JMenuBar();
		setJMenuBar(menuebar);
		menu = new JMenu("Datei");
		menuebar.add(menu);
		open = new JMenuItem("Graph Laden");
		menu.add(open);
		
		Suchalgorithmus = new JLabel("Suchalgorithmus");
		Suchalgorithmus.setBounds(10, 90, 131, 14);
		contentPane.add(Suchalgorithmus);
		
		Startknoten = new JLabel("Startknoten");
		Startknoten.setBounds(10, 135, 100, 14);
		contentPane.add(Startknoten);
		
		Zielknoten = new JLabel("Zielknoten");
		Zielknoten.setBounds(10, 173, 100, 14);
		contentPane.add(Zielknoten);
		
		setComboBox(new JComboBox());
		getComboBox().setBounds(159, 89, 100, 17);
		contentPane.add(getComboBox());
		
		setComboBox_1(new JComboBox());
		getComboBox_1().setBounds(120, 134, 100, 17);
		contentPane.add(getComboBox_1());
		
		setComboBox_2(new JComboBox());
		getComboBox_2().setBounds(120, 172, 100, 17);
		contentPane.add(getComboBox_2());
		
		slider = new JSlider(0,100,100);
		slider.setBounds(10, 254, 210, 23);
		contentPane.add(slider);
		
		Start = new JButton("Start");
		Start.setBounds(170, 290, 100, 23);
		contentPane.add(Start);
		
		geschwindigkeit = new JLabel("Suchgeschwindigkeit");
		geschwindigkeit.setBounds(10, 227, 210, 14);
		contentPane.add(geschwindigkeit);
		
	}
	
	/*
	 * Listener hinzufügen, damit der Controller weiß,
	 * wann sich etwas ändert bzw. gedrückt wird
	 */
	
	public void getOpenFileListener(ActionListener l){
		open.addActionListener(l);
	}
	
	public void sliderListener(ChangeListener cl){
		slider.addChangeListener(cl);
	}
	
	public void searchListener(ActionListener l){
		Start.addActionListener(l);
	}

	/*
	 * Getter und Setter für private Instanzvariablen
	 */
	public JComboBox getComboBox() {
		return comboBox;
	}

	public void setComboBox(JComboBox comboBox) {
		this.comboBox = comboBox;
		this.comboBox.setModel(new DefaultComboBoxModel(new String[] {"BFS", "DFS", "A-Stern", "Dijkstra"}));
		this.comboBox.setToolTipText("BFS
DFS
A-Stern
Dijkstra");
	}

	public JComboBox getComboBox_1() {
		return comboBox_1;
	}

	public void setComboBox_1(JComboBox comboBox_1) {
		this.comboBox_1 = comboBox_1;
	}

	public JComboBox getComboBox_2() {
		return comboBox_2;
	}

	public void setComboBox_2(JComboBox comboBox_2) {
		this.comboBox_2 = comboBox_2;
	}
}```

Und auf dieser GUI soll ich nun auf der rechten Seite den Graphen hinzufügen. Nun wie ihr seht kann man am Schluss verschiedene Suchalgos drauf anwenden und schauen ob ein Weg vorhanden ist.
Wenn nun ein Knoten expandiert wird, soll er seine Farbe ändern. 
Und skaliert soll der Graph auch richtig werden, ist ja ein Unterschied ob ich 500 Knoten oder nur 5 einfüge.

Ich würde ecuh ja alles geben, aber dann erstickt ihr in Code. :)

Ich komme aufjeden Fall nicht weiter, und muss morgen abgeben.. Weiß nicht wie ich das schaffen soll. Hat einer von euch Urlaub  und kann das kurz machen ;P

Gibt es diese Algorithmen schon fertig implementiert? Kriegt man da mit, wann ein Knoten “expandiert” wird? (Unabhängig davon würde ich es als “sportlich” bezeichnen, da bis morgen noch was passables hinzukriegen… (und ich habe schon das eine oder andere Programm geschrieben, dass Parallelen dazu aufweist)). Aber da du das ganze ja nicht erst seit heute weißt, erübrigt sich diesbezüglich wohl jeder weitere Kommentar :stumm:

Jap ich habe alle Algorithmen dazu geschrieben inkklsuive Listeners und co. Man weiß, wann ein Knoten expandiert wird. Ja es ist ziemlich unmöglich bis morgen was hinzubekommen… Mist…
Danke trotzdem !

[QUOTE=bd3m]Hat einer von euch Urlaub und kann das kurz machen ;P[/QUOTE]Soviel zum Thema eigentlich ganz Easy… :wink:
Apropos „eigentlich“: Urlaub habe ich zu diesen Jahreszeiten eigentlich erst wieder nächstes Jahr bzw. zwischen Weihnachten und Neujahr.

Unmöglich ist das natürlich nicht, speziell wenn die Infrastruktur dahinter schon so weit ausgebaut ist, dass man die nötigen Informationen bekommt. (Aber Urlaub hab’ ich heute auch nicht ;))