Я участник небольшого, но довольно общительного онлайн-форума, и просто для забавы мы составили график того, кто кого встречал в реальной жизни.Вот как это выглядело сравнительно недавно.(Цвет - это «расстояние» от выбранного в данный момент пользователя, например, желтый - это тот, кто встречал кого-то, кто их встречал. И нет, я не Зак.) Извинения за выцветшие линии, они, кажется, не имеюточень хорошо выдержал процесс загрузки SO.
Он генерируется как SVG, с большим блоком JSON, определяющим, кто кого встретил.Положение (x, y) каждого элемента на диаграмме жестко закодировано в этом JSON.До сих пор было довольно легко справиться с ситуацией, когда кто-то встречает кого-то другого - в худшем случае, может быть, два или три человека должны быть перетасованы, но для этого требуется редактировать координаты вручную.И теперь, когда европейские и североамериканские контингенты встречаются, и некоторые на периферии появляются на встречах, весь ад разваливается ...
Мы можем приложить некоторые усилия, чтобы сделать все узлы перетаскиваемыми, что сделало бы работу по перестановке немного менее утомительным.Но кажется более разумным позволить компьютеру позаботиться о их расположении, тем более что проблема будет усложняться только с увеличением числа членов.
Итак, кто-нибудь знает алгоритм размещения этих узлов на диаграмме, основанный нана каких других узлах они связаны?
В идеале было бы
- минимизировать или избегать длинных ссылок
- избегать того, чтобы линии проходили под несвязанными узлами
- , принимая во внимание тот факт, что хорошо-связанные узлы больше
- делают все возможное, чтобы показать более широкие отношения "все эти ребята встретились друг с другом" (например, большой круг внизу в значительной степени является результатом одной встречи, хотя на диаграмме нетИдея , когда встречались два человека)
, но если это приблизит нас к этому, то это прогресс.
И какое настоящее имя дляэти графики?Я считаю, что они называются «ссылочными диаграммами», но я не получаю хороших результатов от Google, использующего это имя или что-либо еще, о чем я могу думать.
Мы, вероятно, реализуем это в PHP или Javascript,но сейчас вопрос о том, как начать подходить к проблеме, является более серьезным вопросом.
Редактировать: Уже есть несколько хороших ответов.Я был бы очень заинтересован в фактическом алгоритме (ах), который используется, а также в инструментах, которые выполняют эту работу.