структуры данных — расщепление и слияние кинетических выпуклых оболочек в переполнении стека

примечание: я не уверен, относится ли этот вопрос к этому вопросу, при необходимости перейдите на соответствующий сайт stackexchange.

Я занимаюсь разработкой многопользовательской игры.

Что я хочу сохранить в своем коде: 2d кластеры.

Что такое кластеры: они представляют собой совокупность пользователей (выпуклая оболочка вокруг пользователей).

Что такое пользователь: у пользователя есть позиция x, y и конверт вокруг него, на который он может влиять. Конверт в идеале может быть кругом, радиус которого — насколько он может видеть. Каждый пользовательский конверт в кластере должен пересекаться хотя бы с одним другим конвертом в том же кластере.

На рисунке у меня 4 кластера.
На втором и третьем рисунках показано, как будут формироваться новые кластеры при перемещении пользователей.
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

По мере перемещения пользователей кластеры будут разделяться или объединяться, чтобы сохранить вышеуказанное свойство.

Я хочу знать, является ли «кинетическая выпуклая оболочка» правильной областью, где я должен искать решение для реализации такого обслуживания кластера в моем игровом коде на С ++.

Примечание: Также я читаю о кинетических выпуклых оболочках прямо сейчас, и я еще не закончил это, но я думаю, что это имеет отношение к формированию выпуклой оболочки вокруг фиксированного набора точек. Мне это нужно, но мне также нужно разделить корпус на два или более, когда конверт пользователя внутри корпуса не пересекается с конвертом других в том же корпусе. Например, А на третьем рисунке выше.

0

Решение

Из твоего описания я не понимаю, зачем тебе нужны выпуклые корпуса.

На третьем рисунке пустое пространство между B и F будет внутри выпуклой оболочки. Сам корпус будет от B до F.

http://i.stack.imgur.com/8CG97.png

(Примечание: оболочка конвертов будет касаться конвертов B и F. Это сложнее вычислить, но легко аппроксимировать.)

Если такая информация полезна для вашей игры, то выпуклые корпуса подходят именно вам! Если кинетические выпуклые оболочки не поддерживают расщепление / слияние, вам просто нужно пересчитать выпуклые оболочки. Но с таким небольшим количеством очков, это не должно быть дорогой операцией в любом случае. По крайней мере, это не для некинетических оболочек.

0

Другие решения

Не специалист по этому вопросу, но, похоже, вам нужно проверять пересечения при каждом перемещении пользователя (проверяйте только перемещающегося пользователя). Если конверт пользователя перестал пересекаться с пользователями из того же корпуса, вам необходимо перестроить корпус. Вам также необходимо проверить, пересекается ли конверт пользователя с конвертом другого пользователя. Если это так — вам нужно перестроить как старые, так и новые корпуса (возможно, объединяя их).

РЕДАКТИРОВАТЬ: уточнение

По сути, при каждом перемещении пользователя вам нужно будет проверить, каков статус перемещающегося пользователя:

  • если конверт этого пользователя перестал пересекаться с конвертом другого пользователя — исключить пользователя из оболочки
  • если конверт этого пользователя начал пересекаться с конвертом другого пользователя
    1. если этот пользователь не является частью какого-либо другого корпуса, добавьте его в корпус другого пользователя
    2. если этот пользователь является частью другого корпуса — объединить корпуса
0