Ограничение групп узлов силового макета областью элемента SVG в d3

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

Мой код:

        var width = 600;
        var height = 600;

        var svgContainer = d3.select("body").append("svg")
                .attr("width", width)
                .attr("height", height);

        var force = d3.layout.force()
                .gravity(.05)
                .distance(100)
                .charge(-100)
                .size([width, height]);

        var cir_arr = [];
        for (var i = 3; i > 0; i--) {
            cir_arr.push(i);
        }

        var circles = svgContainer.selectAll("circle")
                .data(cir_arr)
                .enter()
                .append("circle")
                .attr("cx", width/2)
                .attr("cy", height/2)
                .attr("r", function(d) {
                    return 50*d;
                })
                .attr("fill", "white")
                .attr("stroke", "black")
                .attr("stroke-width", 3);

Я понятия не имею, с чего даже начать. Является ли использование силового макета лучшим вариантом здесь? Извините, если вопрос недостаточно конкретен. Мне просто нужно знать, возможно ли то, что я предлагаю, с моей текущей настройкой.

Спасибо


person user2740614    schedule 12.10.2015    source источник
comment
Вы ищете что-то вроде CirclePacking?   -  person Gilsha    schedule 12.10.2015
comment
Вы можете поместить граничное ограничение в свою тиковую функцию таким образом, что, если узел находится за пределами полосы радиуса группы (например, [rg0, rg1]), затем верните его обратно. Шаг упрощения состоит в том, чтобы получить позиции узлов в полярных координатах. (на самом деле вам нужен только компонент r), это можно сделать, добавив геттер r к элементам данных вашего узла. Затем вы можете добавить или вычесть радиус узла, чтобы проверить, не выходит ли он за пределы допустимого диапазона для группы.   -  person Cool Blue    schedule 12.10.2015