Kurze Version
Gibt es ein Entwurfsmuster für die Verteilung von Fahrzeugetiketten in nicht überlappender Weise, um sie so nah wie möglich an dem Fahrzeug zu platzieren, auf das sie sich beziehen? Wenn nicht, ist eine der von mir vorgeschlagenen Methoden praktikabel? Wie würden Sie das selbst umsetzen?
Erweiterte Version
In dem Spiel, das ich schreibe, habe ich eine Vogelperspektive meiner Luftfahrzeuge. Ich habe auch neben jedem der Fahrzeuge ein kleines Etikett mit Schlüsseldaten über das Fahrzeug. Dies ist ein Screenshot:
Da die Fahrzeuge nun in unterschiedlichen Höhen fliegen könnten, könnten sich ihre Symbole überlappen. Ich möchte jedoch nicht, dass sich die Beschriftungen überschneiden (oder dass sich die Beschriftungen von Fahrzeug 'A' mit dem Symbol von Fahrzeug 'B' überschneiden).
Gegenwärtig kann ich Kollisionen zwischen Sprites erkennen und schiebe das anstößige Etikett einfach entgegen der Richtung des ansonsten überlappenden Sprites weg . Dies funktioniert in den meisten Situationen, aber wenn der Luftraum überfüllt ist, kann das Etikett sehr weit vom Fahrzeug weggeschoben werden, selbst wenn es eine alternative "intelligentere" Alternative gibt. Zum Beispiel bekomme ich:
B - label
A -----------label
C - label
Wo wäre es besser (= Etikett näher am Fahrzeug) zu bekommen:
B - label
label - A
C - label
EDIT: Es muss auch berücksichtigt werden, dass es neben dem Fall überlappender Fahrzeuge auch andere Konfigurationen geben kann, in denen sich die Fahrzeugkennzeichnungen überlappen können (die ASCII-Kunstbeispiele zeigen zum Beispiel drei sehr nahe Fahrzeuge, in denen das Etikett von A
das Symbol von überlappen würde B
und C
).
Ich habe zwei Ideen, wie ich die gegenwärtige Situation verbessern kann, aber bevor ich Zeit damit verbringe, sie umzusetzen, habe ich mir überlegt, mich an die Community zu wenden, um Rat zu holen (schließlich scheint es ein "häufig genug auftretendes Problem" zu sein, dass ein Entwurfsmuster dafür existieren könnte).
Für das, was es wert ist, sind hier die zwei Ideen, an die ich gedacht habe:
Slot-isierung des Label-Space
In diesem Szenario würde ich den gesamten Bildschirm in "Slots" für die Etiketten unterteilen. In diesem Fall wird für jedes Fahrzeug immer das Etikett in das nächstgelegene Leerzeichen gesetzt (leer = keine anderen Sprites an dieser Stelle).
Spiralige Suche
Ab der Position des Fahrzeugs auf dem Bildschirm würde ich versuchen, das Etikett in zunehmenden Winkeln und dann in zunehmenden Radien zu platzieren, bis eine nicht überlappende Position gefunden wird. Etwas auf der ganzen Linie von:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...