ich habe ein problem, mit dieser VisualGraph klasse. wenn ich ein
VisualGraph erstelle und ihm nodes hinzufüge und edges, funktioniert
alles wunderbar. sobald ich aber versuche einen vorhandenen graphen
anzeigen zu lassen kommt ne fehlermeldung. wenn ich also versuche:
[code]
...
Graph gr = new AdjMatrix();
//addsomeNodesAndEdges
....
Graph vgr = new VisualGraph(gr);
[code]
kommt das hier:
Exception in thread "main" java.lang.RuntimeException: No visual node
found for the given node identifier.
at vorgaben.VisualGraph.addVisualEdge(VisualGraph.java:177)
at vorgaben.VisualGraph.addAllNodes(VisualGraph.java:122)
at vorgaben.VisualGraph.<init>(VisualGraph.java:110)
at vorgaben.VisualGraph.<init>(VisualGraph.java:95)
at aufgabe5_8.GraphMaker.main(GraphMaker.java:161)
ich habe im kommentar von VisualGraph gelesen, dass wenn die getNodes()
und getAdjacentNodes() murks machen , dass man dann aus einem
vorhandenen graph keinen visuellen machen kann. nun bin ich mir aber
ziemlich sicher , das diese methoden das machen , was sie sollen.. was
tun?
also getestet habe ich sie ja schon , und haben bis jetzt auch immer
die erwarteten ergebnisse geliefert.
ps: was soll getAdjacentNodes() genau machen ... alle knoten über
eingehende kanten liefern oder ausgehende oder beide? .. hab schon
alle fälle durch damit geht der VsGraph aber trozdem nicht , egal
welche variante ich wähle.
mfg dustin bensing ... fröhliches fest und guten rutch!
ich hab mich mal ein wenig in der VisualGraph klasse umgesehen.
folgendes ist mir aufgefallen.
[code]
private void addAllNodes() {
for (int startNode : graph.getNodes())
{
addVisualNode(startNode);
for (int targetNode : graph.getAdjacentNodes(startNode))
{
addVisualEdge(startNode,targetNode,graph.getWeight(startNode,targetNode));
}
}
}
......
private void addVisualEdge(int startNodeNumber, int targetNodeNumber,
int weight) {
// determine the visual nodes for the given node identifier
Node start = visualNodes.get(startNodeNumber);
Node target = visualNodes.get(targetNodeNumber);
if ((start == null) || (target == null)) {
throw new RuntimeException("No visual node found for the
given node identifier.");
}
// paint edge
panel.addEdge(start,target,weight);
}
[code]
in der funktion addAllNodes() wird in der for schleife, der erste
knoten geholt. danach wird sie dem "szenegraphen" (visuelNodes)
hinzugefügt. in der zweiten, verschachtelten for schleife, wird ein
knoten geholt, der zu dem startNode adjazent ist geholt und in der
addVisualEdge() wird dann versucht eine kante zweischen diesen beiden
im "szenegraphen" zu erstellen. meiner meinung, kann das doch gar nicht
gehen!
Node target = visualNodes.get(targetNodeNumber); muss scheitern, denn
es wurde bis jetzt nur startNode zu visuelNodes hinzugefügt targetNode
kann nicht das ergebnis dieses aufrufes werden.
das zeigt auch ein versuch mit :
[code]
private void addVisualEdge(int startNodeNumber, int targetNodeNumber,
int weight) {
// determine the visual nodes for the given node identifier
Node start = visualNodes.get(startNodeNumber);
Node target = visualNodes.get(targetNodeNumber);
/*if ((start == null) || (target == null)) {
throw new RuntimeException("No visual node found for the
given node identifier.");
}*/
if(start == null)
throw new RuntimeException("startNodeNumber = null");
if(target == null)
throw new RuntimeException("targetNodeNumber = null");
// paint edge
panel.addEdge(start,target,weight);
}
[code]
liefert mir , das target null ist .. was, wie ich finde ja auch zu
erwarten ist .. laut implementation. wenn ich addAllNodes()
folgerdermaßen abändere ... dann funktioniert es bei mir bestens
[code]
private void addAllNodes() {
for (int startNode : graph.getNodes())
{
addVisualNode(startNode);
}
for (int startNode : graph.getNodes())
{
for (int targetNode : graph.getAdjacentNodes(startNode))
{
addVisualEdge(startNode,targetNode,graph.getWeight(startNode,targetNode));
}
}
}
[code]
ob das jetzt guter stil ist oder nicht, sei mal dahin gestellt .. es
erscheint mir aber logicher erstmal alle nodes zu visualNodes
hinzuzufügen und dann kanten zwischen ihnen zu erstellen ... weil es
ja sein kann , das man kanten zwischen zwei knoten erstellt, die ncoh
nicht vorhanden sind in visualNodes.
bitte um aufklärung
mfg dustin bensing
Erstmal Entschuldigung für den Fehler.
> wenn ich addAllNodes()
> folgerdermaßen abändere ... dann funktioniert es bei mir bestens
> [code]
> private void addAllNodes() {
> for (int startNode : graph.getNodes())
> {
> addVisualNode(startNode);
> }
>
> for (int startNode : graph.getNodes())
> {
> for (int targetNode : graph.getAdjacentNodes(startNode))
> {
>
> addVisualEdge(startNode,targetNode,graph.getWeight(startNode,targetNode));
> }
> }
>
> }
> [code]
>
> ob das jetzt guter stil ist oder nicht, sei mal dahin gestellt .. es
> erscheint mir aber logicher erstmal alle nodes zu visualNodes
> hinzuzufügen und dann kanten zwischen ihnen zu erstellen ... weil es
> ja sein kann , das man kanten zwischen zwei knoten erstellt, die ncoh
> nicht vorhanden sind in visualNodes.
Genau das ist die Lösung für das Problem. Und meiner Meinung nach, gibt
auch keine "schönere" Lösung.
tschö
Jörg
Auf der Info3-Webseite gibt es jetzt auch eine Version, bei der dieser
Fehler behoben wurde.
tschö
Jörg
[...]
Genieß doch mal die Ferien Junge ;-P
Gruß Nico