Как лучше всего правильно перемещать прямоугольники вперед и назад, по горизонтали и бесконечно в D3?

Исходный код и визуализация находятся по адресу: http://bl.ocks.org/Guerino1/6aa3861bcbe96c343103

Я пытаюсь связать переходы для прямоугольников. При переходе я считаю, что перезаписываю атрибут «x», используя код:

      rectangle.transition()
        .ease("linear")
        .duration(1500)
        .attr("x", function(){ 
          if(x == orig_x){
            var retVal =  dataSet.svgWidth-Number(width);
            return retVal;
          }
          else{
            var retVal = Number(orig_x);
            return retVal;
          }
        })

Похоже, проблема заключается в том, что приведенный выше код не перезаписывает значение "x" при первом выполнении перехода. Когда я прохожу через отладчик, в следующий раз, когда я прохожу через функцию flip(), «x» по-прежнему устанавливается в исходное значение, хотя кажется, что retValue возвращал другое значение в последний раз (для этого конкретного прямоугольника) . ПРИМЕЧАНИЕ. Я использую разные цвета, чтобы быть уверенным, что работаю с одинаковыми прямоугольниками.

Этот код заключен в функцию под названием «flip()», которая вызывается циклом while, предназначенным для переключения значения «x» туда и обратно между исходным значением «x» (хранящимся в «orig_x») и ширина холста svg минус исходная ширина прямоугольника. Намерение — это визуализация, которая заставляет прямоугольники продолжать смещаться «горизонтально» вперед и назад.

Исходный набор данных:

  var dataSet7 = [];
    dataSet7.svgWidth = 400;
    dataSet7.svgHeight = 95;
    dataSet7.r1 = {"x": 0, "y": 0, "w": 50, "h": 30, "color": "Red"};
    dataSet7.r2 = {"x": 10, "y": 30, "w": 150, "h": 30, "color": "Yellow"};
    dataSet7.r3 = {"x": 20, "y": 60, "w": 90, "h": 30, "color": "Blue"};

Раздел HTML, который заменяется диаграммой:

      <td class="td_tableBody" colspan="1">
        <div class="div_RootBody">
          <h3 class="h3_Body">Continuous Transition</h3>
          <p>Transitions the x-axis continuously.</p>
          <div id="simple_rectangle9"></div>
        </div>
      </td>

Для вызываемой функции:

      function drawRectangle9( dataSet, selectString ) {

function flip(){
      var rectangle = d3.select(this);
      var width = rectangle.attr("width");
      var x = rectangle.attr("x");
      var orig_x = rectangle.attr("orig_x");
          // Just for debug info...
          var y = rectangle.attr("y");
          var height = rectangle.attr("height");
          var color = rectangle.attr("color");
      rectangle.transition()
        .ease("linear")
        .duration(1500)
        .attr("x", function(){ 
          if(x == orig_x){
            var retVal =  dataSet.svgWidth-Number(width);
            return retVal;
          }
          else{
            var retVal = Number(orig_x);
            return retVal;
          }
        })
    };

    // Extract Rectangles from dataSet
    var rectangles = [];
      rectangles[0] = dataSet.r1;
      rectangles[1] = dataSet.r2;
      rectangles[2] = dataSet.r3;

    var svgContainer = d3.select(selectString).append("svg:svg")
        .attr("width", dataSet.svgWidth)
        .attr("height", dataSet.svgHeight);

    var arrayOfRectangles = svgContainer.selectAll("rect")
        .data(rectangles)
      .enter().append("svg:rect")
        .attr("class", "rect_flip1")
        .attr("x", function(d){ return d.x; })
        .attr("orig_x", function(d){ return d.x; })
        .attr("y", function(d){ return d.y; })
        .attr("width", function(d){ return d.w; })
        .attr("height", function(d){ return d.h; })
        .attr("color", function(d){ return d.color; })
        .style("fill", function(d){ return d.color; });

    var i = 0;
    while(i++ < 10){
      var rectangles = d3.selectAll(".rect_flip1")
      rectangles.each(flip);
    }

  }

Вызов функции, которая выполняет вышеуказанную функцию:

drawRectangle9(dataSet7, "#simple_rectangle9");

Мой вопрос: как лучше всего правильно перемещать прямоугольники вперед и назад по горизонтали бесконечно?


person Information Technology    schedule 28.01.2016    source источник
comment
вы можете взглянуть на презентацию Скотта Мюррея о переходах: alignedleft.com/projects/2014 /легко-как-пи   -  person ee2Dev    schedule 29.01.2016
comment
Совет был очень хорошим. Я исправил код на основе учебника, и он работает правильно. Я скопировал и вставил исправленный код ниже. Спасибо за вашу помощь.   -  person Information Technology    schedule 29.01.2016


Ответы (1)


Совет от ee2Dev был хорошим, но не конкретным. Ниже приведен конкретный код, который устраняет проблему.

Решение состоит в том, чтобы создать функцию, которая зацикливается на самой себе, используя метод ".each("end", flip)". Затем запустите функцию одним вызовом этой функции (например, "flip();").

  function drawRectangle9( dataSet, selectString ) {

    // Extract Rectangles from dataSet
    var rectangles = [];
      rectangles[0] = dataSet.r1;
      rectangles[1] = dataSet.r2;
      rectangles[2] = dataSet.r3;

    var svgContainer = d3.select(selectString).append("svg:svg")
        .attr("width", dataSet.svgWidth)
        .attr("height", dataSet.svgHeight);

    var arrayOfRectangles = svgContainer.selectAll("rect")
        .data(rectangles)
      .enter().append("svg:rect")
        .attr("class", "rect_flip1")
        .attr("x", function(d){ return d.x; })
        .attr("orig_x", function(d){ return d.x; })
        .attr("y", function(d){ return d.y; })
        .attr("width", function(d){ return d.w; })
        .attr("height", function(d){ return d.h; })
        .attr("color", function(d){ return d.color; })
        .style("fill", function(d){ return d.color; });

    var flip = function(){
      var selectedRectangles = d3.selectAll(".rect_flip1");
      selectedRectangles.transition()
        .ease("linear")
        .duration(1500)
        .attr("x", function(d,i){ 
            var rect = d3.select(this)
            var x = rect.attr("x")
            var orig_x = rect.attr("orig_x")
            var width = rect.attr("width")
          if(x == orig_x){
            var retVal = dataSet.svgWidth-width;
            return retVal;
          }
          else{
            var retVal = orig_x;
            return retVal;
          }
        })
        .each("end", flip);
    };

    flip();

  }
person Information Technology    schedule 29.01.2016