Doppelt zeichnen vermeiden?

23

Bekanntes Mitglied
Hallo,

ich zeichne rekursiv einen Objektgraph und nun hab ich das Problem, dass ich öfter mal Linie doppelt zeichne. Kann mir jemand erklären wie man dieses Problem minimieren kann?

Der Objektgraph besteht aus Objekten die untereinander in Beziehung stehn. Jedes Objekt ist bereits auf einem Panel positioniert d.h. es gibt X und Y Koordinaten. Jedes Objekt hat mehrere Kinder. Es wird bei einem Objekt angefangen und dann wird vom 1. Kind eine Verbindung (Nicht direkt, sondern mit 2 Kanten) zum Parent gezeichnet. Alle nachfolge Kindobjekte werden dann als Pfad mit dem 1. verbunden.

Danach wird das selbe für die Kinder gemacht.

Viele Grüße
 
B

Beni

Gast
Nur eine Idee: Knoten ordnen (z.b. auch nach x/y) und Verbindung nur zeichnen, falls Start < Ende.
 

Marco13

Top Contributor
Etwas zu schwamminge Beschreibung, als dass man "DIE" Antwort geben könnte. Notfalls beim Traversieren sowas wie
Java:
class Connection
{
    Object a, b;
    
    public int hashCode() { return a.hashCode() ^ b.hashCode(); }
    public boolean equals(Object object)
    {
        ...
        return 
            (a.equals(other.a) && b.equals(other.b)) || 
            (a.equals(other.b) && b.equals(other.a));
    }
}
und diese Connections in ein HashSet packen und dann alles zeichnen, was in den HashSet liegt.
 

23

Bekanntes Mitglied
ok werde ich mal versuchen.

Mal ein Pfad

x y
50,50
80,60
40,40

Das sind nun 3 Punkte d.h. 3 Objekte und der Pfad geht von 50,50 zu 80,60 dann von 80,60 zu 40,40

Wenn ich mir in einer HashMap die Punkte merke, gäbe es dann die Möglichkeit irgendwie bei jedem weiteren Punkt zu schauen ob der bereits Teil eines Pfades ist?
 

Marco13

Top Contributor
Und dann...? Ein Knoten kann doch vermutlich z.B. auch 3 Kanten haben. Einfach aufzuhören, wenn man einen Punkt schon hatte, könnte evtl. nicht reichen...
 

23

Bekanntes Mitglied
Java:
class Node {
 int x;
 int y;
 List<Node> nodes = new ArrayList<Node>(); //Zyklus frei
}

Die Nodes sind bereits in einer MxN Matrix (Anderer Algo) angeordnet... in einer Zelle der Matrix können beliebig viele Nodes enthalten sein, Die Matrix kann je nach Auflösung die Nodes umbrechen...
 
B

Beni

Gast
Wenn ich mir in einer HashMap die Punkte merke, gäbe es dann die Möglichkeit irgendwie bei jedem weiteren Punkt zu schauen ob der bereits Teil eines Pfades ist?

Wenn die Verbindungen in beide Richtungen gehen, sollte sowas funktionieren. Dann würde der Code ungefähr so aussehen.

Code:
Für alle Knoten x
  Falls x nicht in Set  // eigentlich immer true, wenn es keine Zyklen gibt
    Für alle y verbunden mit x
      Falls y nicht in Set
        x-y zeichnen
    x in Set speichern

Das funktioniert natürlich nicht, wenn es Verbindungen gibt, die nur einem Knoten bekannt sind.

[Edit, das war wohl zu spät]
 
Zuletzt bearbeitet von einem Moderator:

23

Bekanntes Mitglied
Also,

ich habe bereits eine Optimierung drin und zwar:

Wenn die Node A z.B. in [1,1] liegt und sagen wir 3 Kindernodes in [0,0] und 4 in [2,2] dann gibt es erstmal kein Problem. Dann wird von Kante Oben eine Verbinding zum 1. Kind in [1,1] gezeichnet. Die Kinder sind dann als Pfad direkt verbunden. Von Kante Rechts wird eine Verbindung zum 1. Kind in [2,2] gezeichnet.

So das Problem ensteht wenn die Rekursion eins tiefer geht und zwar: Beispiel hätte das 4. Kind in [0,0] wieder Kinder würde quasi die gleiche Zeichenlogik nochmal durchgespielt und dabei wird dann in komplexen Beziehung leider mal was doppelt gezeichnet.
 

23

Bekanntes Mitglied
Würde es was bringen wenn ich eine Adjazenzmatrix erstellen würde?
Es wäre kein Problem die Parents einer Node zu finden (Eine Node kann N Kinder und N Parents haben)
 

23

Bekanntes Mitglied
Etwas zu schwamminge Beschreibung, als dass man "DIE" Antwort geben könnte. Notfalls beim Traversieren sowas wie
Java:
class Connection
{
    Object a, b;
    
    public int hashCode() { return a.hashCode() ^ b.hashCode(); }
    public boolean equals(Object object)
    {
        ...
        return 
            (a.equals(other.a) && b.equals(other.b)) || 
            (a.equals(other.b) && b.equals(other.a));
    }
}
und diese Connections in ein HashSet packen und dann alles zeichnen, was in den HashSet liegt.

Kannst du das noch genauer ausführen?

Also wie soll icj genau vorgehen? Danke
 

Marco13

Top Contributor
WIe sind denn "Verbindungen" im Moment repräsentiert? Hat einfach jedes Objekt eine Liste von Children? Willst du (mal ganz direkt gefragt) einfach nur einen Graphen zeichnen?
 

23

Bekanntes Mitglied
Ja genau jede Node hat eine List mit Kindern und Parents.
Es sollen immer die Kinder gezeichnet werden und dann deren Kinder usw.

Es ist allerdings kein Baum, da die Nodes schon in einer Matrix angeordnet sind.
 

Marco13

Top Contributor
Alles schrecklich unpräzise, und ich bin übermüdet, aber wenn die Knoten eh schon einer Matrix angeordnet sind, malt man einfach alle Verbinungen, die in dem Teil oben rechts oder unten links (bzgl. der Diagonalen der Matrix) stehen...? Wenn nicht muss ich morgen nochmal schauen...
 

23

Bekanntes Mitglied
Hi,

ja das mache ich auch schon jedoch ist die Matrix groß d.h. eine Node in einer Celle kann Verbindungen in mehr als nur die acht direkten Nachbarn haben :)
 

23

Bekanntes Mitglied
Hi,

sorry für die späte Antwort. Also stellt euch ein Schachbrett vor wie hier: http://www.schach-lernen.de/grafik/schach.gif

Das ist das Raster mit Zeilen und Spalten d.h. es gibt Zellen. In einer Zelle können mehere Nodes enthalten sein.

Die Breite der Spalten wird berechnet d.h. alle Spalten sind z.B. 400Pixel breit. Eine Node ist z.B. 150Pixel breit. Die Anordnung der Nodes in den Zellen ist von links nach rechts mit Umbruch.

Die Einsortierung der Nodes in das Raster wird von einem eigenen Algo vorgenommen.

Wie bereits erwähnt haben die Nodes Kinder und Eltern => Beziehungen. Wenn man nun eine Node auswählt sollen alle Kindbeziehungen "schön" eingezeichnet werden. Wenn ein Kind auch Kinder hat soll dies ebenfalls gezeichnet werden. Im Prinzip wie ein Baum jedoch das die Nodes halt nicht wie ein Baum gelayoutet sind da sie sich ja in dem Raster befinden.

Breite, Höhe des Raster, Höhe der Zeilen, Breite der Spalten, Breite, Höhe, Position der Nodes sind alle verfügbar.


Beim Zeichnen sollte es nach Möglichkeit keine Überschneidungen geben und wenn das die Beziehung zu lässt können auch Wege verbunden werden, d.h. wenn in Zelle [2,0] die Elternnode liegt und in [0,1] und [1,1] jeweils Kinder dann könnte man auch einen Weg zeichnen bis zu einem gewissen Punkt der dann verzweigt zu den Kindnodes...

Ich hoffe nun ist es verständlicher
 

Marco13

Top Contributor
Es scheint sehr schwierig zu sein... Hat das Schachbrett (HEY, das Hat ja 8x8 Felder! Und alle Quadratisch!) irgendwas mit dem Problem der doppelt gezeichneten Linien zu tun? Poste am besten mal ein KSKB mit einer Zeile
Code:
// Hier das wird doppelt gemacht, soll aber nur einmal gemacht werden
 

23

Bekanntes Mitglied
Es gibt nur das Einsortieren und das ist wirklich nicht sehenswert...

Es geht ja drum eine Lösung zu finden...

Ein Ansatz ist:

Für jedes Kind eine Linie mit zwei Kanten zuzeichen (Also von Parent zu Kind)
und am Parent und auch Kind die Anzahl der Eingänge bzw. Ausgänge zu merken...
Weiterhin könnte man Kinder die in gleichen Zellen liegen direkt miteinandern verbinden d.h. Kind D,B,C sind untereinander verbunden und B ist mit der Parent Node verbunden.
 

Marco13

Top Contributor
Sorry, aber ... das wäre schon fast eine Umfrage wert, "Weißt du was hier gemeint ist?", und ich tippe auf >90% "Nein". Jetzt kommen noch abstrakte Begiffe wie "Schönheit" dazu, und dicke Bretter wie "Überschneidungsfreiheit" - bisher ging es ja nur darum, dass du ausführlichst
Code:
private void drawStuff(Node node)
{
    for (Node child : node.getChildren())
    {
        drawLine(node, child);
        drawStuff(child);
    }
}
beschrieben hast, und nicht gesagt hast, warum das nicht das ist, was du suchst.

Ich glaube, ich bin raus... :bahnhof:
 

Marco13

Top Contributor
Auch wenn manche Menschen es als unhöflich empfinden, eine Frage mit einer Gegenfrage zu beantworten: Was verstehst du denn an den vorgeschlagenen Lösungen nicht?
 

André Uhres

Top Contributor
Hallo 23,

ich glaube nicht, dass sich Überschneidungen vermeiden lassen, oder dass so was überhaupt schön aussehen kann. Ich würde wahrscheinlich einfach die Knoten mit passenden Farben einfärben und keine Linien zeichnen. Ich meine, nur den Vater und seine direkten Kinder einfärben, wobei erkennbar sein muss, ob eine Kind ein Blatt ist oder nicht. So kann man, wenn nötig, Unterknoten auf und zu klappen, um einen Pfad zu verfolgen.

Gruß,
André
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Bei einem Baum lassen sie sich natürlich vermeiden. Die sekundäre Frage wäre, wie aufwändig das im speziellen Fall ist. Die primäre Frage wäre: Geht es überhaupt um einen Baum? (Ja, nodes mit parents und children, aber dann noch die Linien und da Kindeskinder und überhaupt ist das ja in einem Schachbrett angeordnet ... sorry, ich kapier's einfach nicht - mal' vielleicht mal ein Bild.... )
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
R Swing JPanel doppelt gezeichnet AWT, Swing, JavaFX & SWT 1
A Swing JSlider erscheint doppelt AWT, Swing, JavaFX & SWT 2
Weltall 7 Swing JPanels werden doppelt gezeichnet AWT, Swing, JavaFX & SWT 6
Weltall 7 AWT Maus-Events werden doppelt ausgeführt AWT, Swing, JavaFX & SWT 12
T JFrame doppelt nutzen? AWT, Swing, JavaFX & SWT 3
A Prob:Tabelle bei Zellensprung: Letzte zeile doppelt sichtbar AWT, Swing, JavaFX & SWT 7
C JList, valueChanged wird doppelt ausgeführt? <<closed AWT, Swing, JavaFX & SWT 2
M ListSelectionListener wird doppelt durchlaufen AWT, Swing, JavaFX & SWT 4
S Anderes Look'n'Feel = JTextArea doppelt so gross! AWT, Swing, JavaFX & SWT 13
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben