Укороченная версия
Существует ли шаблон дизайна для распределения этикеток транспортных средств непересекающимся образом, размещая их как можно ближе к транспортному средству, к которому они относятся? Если нет, то является ли какой-либо метод, который я предлагаю, жизнеспособным? Как бы вы реализовали это сами?
Расширенная версия
В игре, которую я пишу, у меня есть вид с высоты птичьего полета моих летательных аппаратов. У меня также есть рядом с каждым из транспортных средств небольшая табличка с ключевыми данными об автомобиле. Это фактический скриншот:
Теперь, когда машины могли летать на разных высотах, их значки могли перекрываться. Однако я бы не хотел, чтобы их ярлыки перекрывали друг друга (или ярлык транспортного средства «А» перекрывал значок транспортного средства «В»).
В настоящее время я могу обнаружить столкновения между спрайтами и просто оттолкнуть поврежденную метку в направлении, противоположном спрайту, перекрывающемуся в противном случае . Это работает в большинстве ситуаций, но когда воздушное пространство переполнено, этикетка может отодвинуться очень далеко от своего транспортного средства, даже если была альтернатива «умнее». Например я получаю:
B - label
A -----------label
C - label
где было бы лучше (= наклейка ближе к автомобилю) получить:
B - label
label - A
C - label
РЕДАКТИРОВАТЬ: Следует также учитывать, что помимо случая перекрытия транспортных средств, могут быть другие конфигурации, в которых метки транспортных средств могут перекрываться (примеры ASCII-искусства показывают, например, три очень близких транспортных средства, в которых метка A
будет перекрывать значок B
и C
).
У меня есть две идеи о том, как улучшить существующую ситуацию, но прежде чем тратить время на их реализацию, я подумал обратиться к сообществу за советом (в конце концов, это кажется «достаточно общей проблемой», что шаблон проектирования для него может существовать).
Для чего это стоит, вот две идеи, о которых я думал:
Слотация пространства метки
В этом сценарии я бы разделил весь экран на «слоты» для надписей. Тогда у каждого транспортного средства всегда будет метка, расположенная в ближайшем пустом (пусто = других спрайтов в этом месте нет).
Спиральный поиск
Начиная с местоположения транспортного средства на экране, я попытался бы разместить метку под увеличивающимися углами, а затем с увеличивающимися радиусами, пока не будет найдено неперекрывающееся местоположение. Что-то по линии:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...