Как однозначно назначить цвет / рисунок линии на стороне клиента случайным пользователям в онлайн-приложении для рисования? - PullRequest
0 голосов
/ 08 апреля 2019

Я создаю мобильное онлайн-приложение для рисования в ReactNative. Пользователи могут присоединяться к комнатам, в которых может быть до 4 пользователей, где они могут рисовать вместе и видеть нарисованные фигуры друг друга на взаимно видимой доске.

Я бы хотел назначить каждому из 4 пользователей уникальный стиль, например,

// Styles are a mix of color and lineStyle to accommodate color blindness
const style1 = { color: "#fff", lineStyle: "dashed" }
const style2 = { color: "#0f0", lineStyle: "solid" }

Однако я хотел бы назначить эти стили на стороне клиента без необходимости централизованного управления и назначения стилей на сервере.

Стили могут быть предопределены из набора из 4 или более или могут генерироваться динамически. Комната должна обрабатывать пользователей, покидающих и воссоединяющихся (например, вручную или из-за отключений), а также уходящих пользователей и других присоединяющихся других пользователей. В любое время t никаким двум пользователям в данной комнате не должен быть назначен один и тот же стиль, и данный пользователь должен сохранять один и тот же стиль все время, пока он находится в комнате, и в идеале восстанавливать один и тот же стиль, если они покидают / воссоединяются в быстрой последовательности ( например, из-за отключения).

Я буду использовать что-то вроде Ably для передачи данных между клиентами.

Я мог бы использовать серверную часть Redis для поддержки уникальных карт того, у какого пользователя какой стиль, но я бы предпочел сделать это на стороне клиента для простоты разработки.

В идеале количество различных стилей должно быть небольшим - я не хочу связку случайных цветов, которые находятся на небольшом расстоянии друг от друга.

Итак, учитывая, что у меня есть комната R с 4 случайными пользователями user1, ..., user4, как я могу назначить стили каждому пользователю таким образом, который, скорее всего, будет уникальным и без коллизий?

1 Ответ

1 голос
/ 08 апреля 2019

Если стиль действительно является комбинацией color и lineStyle, то вы можете оценить вероятность столкновения, используя формулу проблемы дня рождения или парадокса дня рождения.

Обозначим N количество различных возможных стилей (например, с 8 colors и 5 lineStyle, у вас будет 5*8=40 возможных различных стилей).

Затем вы можете рассчитать вероятность того, что для k пользователей все они будут иметь разный стиль (обратите внимание, что вам нужно k<N, или затем просто P(X)=0):

P(X) = (1 - 1/N) * (1 - 2/N) * ... * (1 - (k-1)/N) = product_{i from 1 to k-1} (1 - i/n)

Вы можете понятьформула выглядит следующим образом:
Если есть 2 пользователя, вероятность того, что у них другой стиль, является вероятностью того, что user2 имеет стиль, отличный от user1 (эта вероятность составляет 1 - 1/N)
Для третьего пользователя,вам нужно, чтобы 1-й и 2-й пользователь отличались друг от друга по стилю, а у 3-го - другой, чем у 1-го и 2-го стилей.
И так далее, и так далее ...
Что даетприведенная выше формула.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...