примечание: я не уверен, относится ли этот вопрос к этому вопросу, при необходимости перейдите на соответствующий сайт stackexchange.
Я занимаюсь разработкой многопользовательской игры.
Что я хочу сохранить в своем коде: 2d кластеры.
Что такое кластеры: они представляют собой совокупность пользователей (выпуклая оболочка вокруг пользователей).
Что такое пользователь: у пользователя есть позиция x, y и конверт вокруг него, на который он может влиять. Конверт в идеале может быть кругом, радиус которого — насколько он может видеть. Каждый пользовательский конверт в кластере должен пересекаться хотя бы с одним другим конвертом в том же кластере.
На рисунке у меня 4 кластера.
На втором и третьем рисунках показано, как будут формироваться новые кластеры при перемещении пользователей.
По мере перемещения пользователей кластеры будут разделяться или объединяться, чтобы сохранить вышеуказанное свойство.
Я хочу знать, является ли «кинетическая выпуклая оболочка» правильной областью, где я должен искать решение для реализации такого обслуживания кластера в моем игровом коде на С ++.
Примечание: Также я читаю о кинетических выпуклых оболочках прямо сейчас, и я еще не закончил это, но я думаю, что это имеет отношение к формированию выпуклой оболочки вокруг фиксированного набора точек. Мне это нужно, но мне также нужно разделить корпус на два или более, когда конверт пользователя внутри корпуса не пересекается с конвертом других в том же корпусе. Например, А на третьем рисунке выше.
Из твоего описания я не понимаю, зачем тебе нужны выпуклые корпуса.
На третьем рисунке пустое пространство между B и F будет внутри выпуклой оболочки. Сам корпус будет от B до F.
http://i.stack.imgur.com/8CG97.png
(Примечание: оболочка конвертов будет касаться конвертов B и F. Это сложнее вычислить, но легко аппроксимировать.)
Если такая информация полезна для вашей игры, то выпуклые корпуса подходят именно вам! Если кинетические выпуклые оболочки не поддерживают расщепление / слияние, вам просто нужно пересчитать выпуклые оболочки. Но с таким небольшим количеством очков, это не должно быть дорогой операцией в любом случае. По крайней мере, это не для некинетических оболочек.
Не специалист по этому вопросу, но, похоже, вам нужно проверять пересечения при каждом перемещении пользователя (проверяйте только перемещающегося пользователя). Если конверт пользователя перестал пересекаться с пользователями из того же корпуса, вам необходимо перестроить корпус. Вам также необходимо проверить, пересекается ли конверт пользователя с конвертом другого пользователя. Если это так — вам нужно перестроить как старые, так и новые корпуса (возможно, объединяя их).
РЕДАКТИРОВАТЬ: уточнение
По сути, при каждом перемещении пользователя вам нужно будет проверить, каков статус перемещающегося пользователя: