Das folgende Diagramm veranschaulicht ein Problem, das ich begegnet ein Manhattan Diagramm erstellen:Overlapping Liniensegmente
Die Box meisten der Linie umgibt [(tx, midy) - (sx, midy)] das hat eine bestehende Linie überlappt (dargestellt durch psegment
im folgenden Code). Ich habe die überlappenden Pfeilspitzen (und Schwänze) entfernt und bin ein bisschen ratlos, wie man nach Überlappungen sucht. Hier
ist der problematische Code:
Line2D.Double segment = new Line2D.Double(sx, midy, tx, midy);
// Associate the middle-y point with the bounds of the target object.
// On subsequent draws of targets with a similar mid-y, make sure that
// there are no overlapping lines.
//
if(midPointMap.put(midy, segment) != null) {
//if(midy == 90) {
// New Line.
//
System.err.printf("NEW: (%3.2f, %3d)-(%3.2f, %3d)\n", sx, midy, tx,
midy);
for(Line2D.Double psegment : midPointMap.getValues(midy)) {
// Previous Line.
//
System.err.printf("OLD: (%3.2f, %3d)-(%3.2f, %3d)\n",
psegment.getX1(), midy, psegment.getX2(), midy);
}
//}
}
// Line for the bus.
//
result.moveTo(sx, midy);
result.lineTo(tx, midy);
Hier ist ein weiteres Beispiel Bild, das Ihnen eine Vorstellung von dem Manhattan-Layout zu geben:
In der Figur unmittelbar über die Linie zwischen Dialog und Fenster wurden überlappt (bei diesem Zoom nicht ganz sichtbar). Das Bild zeigt, wie es mehrere Unterklassen geben kann, und so muss das Erkennen von Überlappungen mehrere Ziele (tx, ty) für mehrere Quellen (sx, sy) entlang derselben Mitte-y-Linie berücksichtigen.
midPointMap
Die Variable ist ein Hash-Set, das mehrere Werte pro Schlüssel enthalten:
private MultiValueMap<Integer, Line2D.Double> midPointMap =
new MultiValueMap<Integer, Line2D.Double>();
Diese Karten Mitte Y-Wert gegen einen Satz von Liniensegmenten.
Irgendwelche Ideen, wie man die Linie nicht zeichnet, wenn sie ein vorhandenes Liniensegment überlappt?
Update # 1
Beachten Sie, dass Liniensegmente für jeden "Bus" sind in keiner bestimmten Reihenfolge gegeben.
Wenn Sie in das Diagramm hineinzoomen, werden sie sehr offensichtlich. Ziel ist es, eine für das Auge angenehme Grafik zu erzeugen. Überlappende Linien beeinträchtigen das Diagramm. –
Ich sollte hinzufügen, dass je mehr Elemente verdoppeln, desto dunkler werden die neu gezogenen Zeilen. Bis zu dem Punkt, wo die Linien auch ohne Zoomen anders aussehen. Es gibt keine Möglichkeit von aA - bB. –
Die Schritte 1 und 2 sind angesichts der Einschränkungen der API der grafischen Bibliothek nicht möglich. Schritt 3 würde in einer kritischen Schleife zu lange dauern (midPointMap gruppiert Liniensegmente entlang desselben y-Achsenwerts). Schritt 4 ist im Grunde das Problem: Wie würden Sie es implementieren? Zum Beispiel hat jedes Segment zwei X-Positionen, so dass Sie "seine X-Position" nicht mit den Endpunkten eines längeren Segments vergleichen können. Außerdem können die Segmente nicht nach Länge sortiert werden. –