Оригинальный код и визуализация расположена по адресу:http://bl.ocks.org/Guerino1/6aa3861bcbe96c343103Каков наилучший способ правильного перехода прямоугольников, вперед и назад, по горизонтали и бесконечности в D3?
Я пытаюсь цепь переходов для прямоугольников. Когда я переход, я считаю, я перезаписью «х» атрибут, используя код:
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;
}
})
Проблема, кажется,, что приведенный выше код не перезаписывает «х» значение, когда переход выполненный в первый раз. Когда я перехожу через отладчик, в следующий раз, когда я перехожу к функции 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");
Мой вопрос: Какой самый лучший способ правильно переходить прямоугольники, взад и вперед по горизонтали, до бесконечности?
вы можете взглянуть на презентации Скотта Мюррея по переходам: http://alignedleft.com/projects/2014/easy-as-pi/ – ee2Dev
совет был очень хороший. Я скорректировал код на основе учебника, и он работает правильно. Я скопировал и вставил исправленный код ниже. Спасибо за вашу помощь. –