2016-01-08 2 views
1

Я заметил this фантастический пример расположения кластера D3. Вместо того, чтобы иметь ограничивающий прямоугольник; можно ли скопировать их в многоугольник? http://codepen.io/zslabs/pen/MKaRNJ - пример формы многоугольника, но я ищу дополнительное преимущество обнаружения столкновений, а также способ отображения данных. Спасибо!D3: Макет кластерной силы в полигоне

Update

https://github.com/d3/d3-shape выглядит интересной библиотекой о создании этих форм, я до сих пор не видел пример построения и распространения в пределах определенного многоугольника.

. 
+0

Обнаружение столкновений довольно сложно и не часто полезно при визуализации данных, поэтому у D3 нет встроенного для него. Возможно, вам стоит изучить [Box2D] (http://box2d.org/) - есть [порт JavaScript через emscripten] (https://github.com/kripken/box2d.js/). – Anko

+0

Для довольно простых случаев, таких как сдерживающие узлы в ромбе или что-то в этом роде, я уверен, что вы сами можете сами определить векторы. Если вам нужны произвольные вогнутые додекаэдры или что-то еще, это будет немного больно. Насколько вам нужна эта функция? : D – Anko

+0

Эй, спасибо, спасибо. Я думаю, что я могу быть слишком буквальным с терминами обнаружения столкновения; более или менее просто нарисовать их в форме, как показывает пример D3. Тот, о котором я упоминал, является отличной основой; но часть, с которой я столкнулся с трудностями, заключается в случайном ограничении точек в пределах многоугольника, а не в простом прямоугольнике, а также для распространения - не кластеризации точек. Это по-прежнему принципиально отличается от возможностей D3? – Zach

ответ

2

Я также искал то же самое, и я нашел подобную тему: 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.

Это не идеально, но у меня было много проблем, чтобы настроить, как узлы могут быть отбиты с границы полигона ... Если у кого-то есть предложения, я был бы рад их услышать!

Смежные вопросы