Krótka wersja
Czy istnieje wzór projektowy do dystrybucji etykiet pojazdów w sposób nienakładający się na siebie, umieszczając je jak najbliżej pojazdu, którego dotyczą? Jeśli nie, to czy jakakolwiek metoda, którą sugeruję, jest wykonalna? Jak sam byś to wdrożył?
Rozszerzona wersja
W grze, którą piszę, widzę z lotu ptaka moje powietrzne pojazdy. Obok każdego pojazdu mam również małą etykietę z kluczowymi danymi na temat pojazdu. To jest zrzut ekranu:
Ponieważ pojazdy mogły latać na różnych wysokościach, ich ikony mogą się nakładać. Jednak nie chciałbym, aby ich etykiety nakładały się (lub etykieta z pojazdu „A” nie pokrywała się z ikoną pojazdu „B”).
Obecnie mogę wykryć kolizje między duszkami i po prostu odpycham obraźliwą etykietę w kierunku przeciwnym do pokrywającego się inaczej duszka . Działa to w większości sytuacji, ale gdy przestrzeń powietrzna jest zatłoczona, etykieta może zostać odsunięta bardzo daleko od pojazdu, nawet jeśli istnieje alternatywna „inteligentniejsza” alternatywa. Na przykład otrzymuję:
B - label
A -----------label
C - label
gdzie byłoby lepiej (= etykieta bliżej pojazdu), aby uzyskać:
B - label
label - A
C - label
EDYCJA: Należy również wziąć pod uwagę, że oprócz nakładających się pojazdów, mogą istnieć inne konfiguracje, w których etykiety pojazdów mogą się nakładać (przykłady ASCII-art pokazują na przykład trzy bardzo bliskie pojazdy, w których etykieta A
oznaczałaby ikonę B
i C
).
Mam dwa pomysły, jak poprawić obecną sytuację, ale zanim poświęciłem czas na ich wdrożenie, pomyślałem o zwróceniu się do społeczności po poradę (w końcu wydaje się, że jest to „dość powszechny problem”, że może istnieć wzorzec projektowy).
Oto, co warto, oto dwa pomysły, o których myślałem:
Slot-isation przestrzeni na etykiety
W tym scenariuszu podzieliłem cały ekran na „miejsca” na etykiety. Wówczas każdy pojazd zawsze miałby etykietę umieszczoną w najbliższym pustym (pusty = brak innych duszków w tym miejscu).
Wyszukiwanie spiralne
Z położenia pojazdu na ekranie starałbym się umieszczać etykietę pod rosnącymi kątami, a następnie z rosnącymi promieniami, aż do znalezienia nie nakładającej się lokalizacji. Coś poniżej:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...