2014-01-03 3 views
5

У меня проблема с тем, что D3 выполняет правильную чистку при выполнении масштабирования.Масштабирование и чистка в градиенте силы d3

У меня есть jsFiddle, созданный здесь http://jsfiddle.net/Gwp25/2/, показывающий сеть с некоторыми фиктивными данными, которые я нашел в другом месте. Следующее действие - это. Увеличьте (используя колесико мыши), затем включите чистку. После этого очистите узлы. Выбранные узлы отключены - некоторые из области кисти. Вот соответствующая часть кода, касающаяся выбора узлов в пределах кисти.

  .on("brush", function() { 
       var extent = d3.event.target.extent(); 
       console.log(extent); 
       d3.selectAll(".node").select("circle").classed("selected", function(d) { 
        return d.selected = (extent[0][0] <= x_scale(d.x) && x_scale(d.x) < extent[1][0] 
          && extent[0][1] <= d3.tran(d.y) && y_scale(d.y) < extent[1][1]); 
       }); 
      }) 

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

Любые идеи?

+0

Несмотря на то что вы учитываете масштаб, когда вы рисуете свою кисть, ваша верхняя левая координата вашего выбора мыши (для кисти) больше не совпадает с верхней левой координатой вашего холста, которая была увеличено изображение. Вы также не учитываете масштаб в переводе, поэтому, когда вы увеличиваете его масштаб, это происходит медленно. – Elijah

+0

Вы имеете в виду для узла? Я просто изменил это на node.attr («transform», function (d) { return "translate (" + d.x + "," + d.y + ") шкала (" + scale_val + ")"; }); но это вообще не помогает. Я решил решить эту проблему с помощью панорамирования, это немного раздражает так медленно, и я думал, что проблема связана с масштабом, поскольку она сбрасывается, когда я использую слайдер, который я реализовал, чтобы помочь в масштабировании. Любая идея о том, как получить скорректированное значение для верхнего левого в D3? – Eamonn

+0

http://jsfiddle.net/Gwp25/4/ - это с добавленной шкалой. – Eamonn

ответ

3

Я считаю, что у меня есть рабочий вариант того, что вы ищете: http://jsfiddle.net/Gwp25/8/

Вы были близки по реализации. Я объясню, что я изменил, чтобы заставить его работать.

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

var x_scale = d3.scale.linear().domain([0, chartWidth]).range([0, chartWidth]); 
var y_scale = d3.scale.linear().domain([0, chartHeight]).range([0, chartHeight]); 

Теперь brush также принимает в качестве параметров весов. Здесь вы ошибочно ставите оригинальные шкалы идентичности. Поэтому, несмотря на то, что график был увеличен и подкрашен, вы использовали один и тот же масштаб для сопоставления точек с вновь увеличенным графиком.

Для правильной настройки весов вы можете получить доступ к шкалам поведения масштабирования, позвонив по телефону: zoom.x() или zoom.y().

После того, как вы это сделали, остальное - соус.

Примечание: Я немного взломал код, чтобы получить доступ к вашей функции масштабирования в toggleBrushing, сделав ее глобальной переменной. Я не рекомендую держать его таким образом, но я не хотел делать тяжелый рефакторинг. Удачи, надеюсь, что это поможет!

+0

Спасибо за объяснение и помощь! Кажется, я все еще немного борюсь с весами. Мне пришлось взломать способ получить код онлайн, чтобы проиллюстрировать проблему. Реализация более структурирована в моей кодовой базе. Другая вещь, которую я не совсем понимаю, - это заикающийся эффект при панорамировании. @Elijah упомянул, что я не учитываю масштаб при переводе на масштабирование. Я думаю, что я нахожусь в реализации на минуту, но, очевидно, что-то не так. Есть идеи по этому поводу? Тогда я там думаю. – Eamonn

+0

Хм, дрожь немного озадачивает. Я подумаю об этом; на первый взгляд я не уверен, в чем проблема. –

+0

Спасибо, Бен! Очень признателен. – Eamonn

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