Подтвердить что ты не робот

Вращение вращения D3.js

У меня возникают проблемы, когда я пытаюсь правильно выполнить анимацию вращения, используя библиотеку D3.js. Проблема связана с точкой, в которой я хочу повернуть элемент.

Вот скрипка, которую я сделал, чтобы показать, что я имею в виду (в замедленном темпе): http://jsfiddle.net/74mCb/

Кажется, что источник проблемы лежит здесь:

.attr("transform", "rotate(-60, 150,130)");

И затем я поворачиваю его так:

.attr("transform", "rotate(40 150,130)");

Я хотел бы, чтобы прикладом иглы оставалось на месте (чтобы быть центром вращения), может кто-нибудь объяснить, что я делаю неправильно?

Спасибо!

4b9b3361

Ответ 1

Это немного сложно понять (я не совсем понимаю это сам), но D3 нуждается в некоторой помощи, зная, как интерполировать между двумя строками, представляющими ваше вращение.

function turnNeedle()
{

    needle
      .transition()
      .duration(2000)
      .attrTween("transform", tween);

    function tween(d, i, a) {
      return d3.interpolateString("rotate(-60, 150, 130)", "rotate(60, 150, 130)");
    }

}

d является базой данных, i является индексом, a является атрибутом в случае, если вы хотите сделать это с помощью данных.

http://jsfiddle.net/SHF2M/

Ответ 2

Здесь я думаю, что происходит: за спецификацию SVG, преобразование

rotate(40 150,130)

эквивалентно:

translate(150,130) rotate(40) translate(-150, -130)

Похоже, что D3 анимирует перевод, а также поворот - внутреннее представление d3.transform rotate(40 150,130) представляет собой компонент поворота + компонент перевода, поэтому оба включены в переход.

Самое простое исправить здесь - нарисовать иглу в начале координат, перевести ее с внешним элементом g в правильное положение, а затем повернуть ее:

var needle = svg
  .append("g")
    .attr("class", "needle")
    .attr("transform", "translate(150 , 130)")
  .append("path")
    .attr("class", "tri")
    // your path may have been prettier
    .attr("d", "M-3 0 L0 -130 L3 0 S3 5 0 5 S-3 5 -3 0 Z")
    .attr("transform", "rotate(-60)");

затем

needle
    .transition()
    .duration(2000)
    .attr("transform", "rotate(40)");

См. рабочую скрипту: http://jsfiddle.net/nrabinowitz/74mCb/1/