2016-06-01 13 views
1

Ich bin dabei, eine "Paint" -Anwendung in Java, bestehend aus rechteckigen Knoten und ungerichteten Kanten zu schreiben. Das Problem ist, dass der Anfang der Kante in der Mitte des Rechtecks ​​liegt, mit dem die Kante verbunden ist, und das Ende der Kante in der Mitte des anderen Rechtecks ​​liegt, mit dem diese Kante verbunden ist.Zeichnen Dinge in der richtigen Reihenfolge, Java

Um zu vermeiden, den Schnittpunkt zwischen dem Rechteck und der Kante zu zeichnen, zeichne ich zuerst Kanten und anschließend Knoten, so dass sie oben auf den Kanten platziert werden, wodurch die Schnittmenge versteckt wird.

Das Problem tritt auf, wenn ein anderer Knoten, der dieser Kante nicht entspricht, entlang der Kante platziert wird. Da in diesem Szenario Kanten zuerst gezeichnet werden, erscheint der Knoten oben auf der Kante. Das will ich aber nicht. Ich möchte, dass die Kante oben auf dem Knoten angezeigt wird.

Bilder: how it is und how it should be

Die umfassendste Weg, ich dieses Problem beheben denken kann wäre Knoten zuerst zu ziehen und danach die Kanten zeichnen, um die Schnittpunkte der Kante mit den beiden Knoten zu vermeiden es verbunden ist, . Allerdings ist das auf dem Papier schwierig, weil ich Kanten unter Verwendung von drawLine zeichne, und ich habe keine Möglichkeit, nach Überschneidungen zu suchen.

Deshalb zeichne ich zuerst Kanten, aber dann taucht das Problem auf, das ich erwähnte. Irgendwelche Ideen?

+0

Das Problem ist nur lösbar, wenn Knoten so etwas wie eine Priorität haben, dann können Sie sortiert nach Priorität der Knoten zeichnen; Rendern Sie zuerst die Verbindungen des Knotens, und rendern Sie dann den Knoten. Wiederholen Sie den Vorgang für den folgenden Knoten.Wenn es kein Ordnungskriterium gibt, gibt es keine einzige Lösung, die richtig ist - oder vielmehr kann jede Lösung als richtig angesehen werden. – Durandal

Antwort

0

Was Sie brauchen, ist eine Lösung für Problem # 1. Sie müssen die Endpunkte der Kante von der Mitte des Rechtecks ​​weg verschieben. Auf diese Weise müssen Sie nicht zuletzt die Knoten zeichnen und automatisch Ihre Frage lösen.

Meine vorgeschlagene Lösung in Schritt 2 funktioniert nur, wenn die Verbindungsknoten links und rechts voneinander sind, sonst benötigen Sie etwas mehr fortgeschrittene Mathematik, die ich in Schritt 2.1 gestartet habe.

Schritt 1: eine Kante ist nicht mehr als zwei Point s wo ein Point ist nur ein x und y Wert. Finden Sie das linke und das rechte Ende der Kante, indem Sie die x jeder Kante vergleichen. Wir speichern dies zur Vereinfachung als xLeft, xRight, yLeft und yRight. Vielleicht hast du etwas anderes dafür, aber du hast die Idee. Schritt 2: Bewegen Sie die xLeft halbe Breite des Rechtecks ​​nach rechts und subtrahieren Sie die halbe Breite des Rechtecks ​​von xRight.

(Optional) Schritt 2.1: Wenn zwei Verbindungsknoten übereinander liegen, können Sie den Winkel mit Math.atan2(yRight-yLeft, xRight-xLeft) berechnen. Wenn der Wert im unteren Spektrum liegt (zwischen -3pi/4 und -pi/4) addiere und subtrahiere die Hälfte der Höhe des Rechtecks ​​auf die jeweiligen y-Werte. Sie können damit herumspielen, um die Mathematik und Logik für alle 4 Richtungen zu erstellen, wenn Sie möchten.

Schritt 3: Zeichnen Sie die neuen Kanten, nachdem Sie die Knoten gezeichnet haben. Die Kanten sind jetzt mit den Kanten Ihrer Rechtecke verbunden.

Fühlen Sie sich frei, Fragen zu stellen, obwohl ich schlage vor, Sie versuchen, dies zuerst in Code zu setzen.

Verwandte Themen