Я также искал то же самое, и я нашел подобную тему: Force chart d3.js inside a triangle.
most voted answer имеет метод обнаружения столкновений внутри треугольника, а также предлагает обобщенную версию, чтобы заставить ее работать с полигоном. Вы можете увидеть его в this demo.
Одна вещь, которую ответ не упоминает, и который может быть вам полезен, - это вычислить центр ваших разных полигонов, чтобы сделать разные силовые макеты внутри этих полигонов, и я бы предложил использовать для этого polygonCentroid.
var polygon = require('d3-polygon');
var polygon_data = [ [0,0], [10, 0], [10, 10], [0, 10]]; // a small box
var centroid = polygon.polygonCentroid(polygon_data); // [5, 5]
Я определенно хотел увидеть этот многоугольник ограничение в качестве признака в d3, но это может быть слишком специфичны:/
Update:
Просто небольшая коррекция: proprosed решение принимает отчет о центроиде многоугольника вопреки тому, что я сказал. Виноват.
Update 2:
Я создал блок с реализацией для обнаружения полигонов столкновения: http://bl.ocks.org/pbellon/4b875d2ab7019c0029b636523b34e074.
Он использует обнаружение столкновений, упомянутое в ответе SO, с которым я связан & Я использовал его для создания «силы», как forceCollide на d3.v4.
Это не идеально, но у меня было много проблем, чтобы настроить, как узлы могут быть отбиты с границы полигона ... Если у кого-то есть предложения, я был бы рад их услышать!
Обнаружение столкновений довольно сложно и не часто полезно при визуализации данных, поэтому у D3 нет встроенного для него. Возможно, вам стоит изучить [Box2D] (http://box2d.org/) - есть [порт JavaScript через emscripten] (https://github.com/kripken/box2d.js/). – Anko
Для довольно простых случаев, таких как сдерживающие узлы в ромбе или что-то в этом роде, я уверен, что вы сами можете сами определить векторы. Если вам нужны произвольные вогнутые додекаэдры или что-то еще, это будет немного больно. Насколько вам нужна эта функция? : D – Anko
Эй, спасибо, спасибо. Я думаю, что я могу быть слишком буквальным с терминами обнаружения столкновения; более или менее просто нарисовать их в форме, как показывает пример D3. Тот, о котором я упоминал, является отличной основой; но часть, с которой я столкнулся с трудностями, заключается в случайном ограничении точек в пределах многоугольника, а не в простом прямоугольнике, а также для распространения - не кластеризации точек. Это по-прежнему принципиально отличается от возможностей D3? – Zach