2015-09-05 155 views
0

我打算使用d3.js围绕其中心旋转矩形。 我的代码是使用d3.js围绕其中心的奇怪的矩形旋转

var svg = d3.select("body") 
 
    .append("svg").attr("width", 200).attr("height", 200).append("rect") 
 
    .attr("x", 50) 
 
    .attr("y", 50) 
 
    .attr("fill", "black") 
 
    .attr("width", 100) 
 
    .attr("height", 100) 
 
    .transition() 
 
    .ease("linear") 
 
    .duration(1000) 
 
    .attr("transform", "rotate(180,100,100)");
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

它旋转,涉及到其原始x,矩形的y坐标,但 不旋转过程中围绕其中心旋转。

正确的代码,我在网络上找到的是

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

 
var rect = svg.append("rect") 
 
    .attr("x", 50) 
 
    .attr("y", 50) 
 
    .attr("width", 100) 
 
    .attr("height", 100); 
 

 
rect.transition().duration(5000) 
 
    .attrTween("transform", rotTween); 
 

 
function rotTween() { 
 
    var i = d3.interpolate(0, 360); 
 
    return function(t) { 
 
     return "rotate(" + i(t) + ",100,100)"; 
 
    }; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

这个矩形围绕其中心旋转正确。但是我看不出两个代码之间有什么区别。有什么不同?

+0

可能重复[D3.js动画旋转(HTTP:/ /stackoverflow.com/questions/13313043/d3-js-animate-rotation) –

+1

在您的示例中,补间将适用于所有旋转和平移的参数。这就是你摆动效果的原因。 矩形既是平移又是旋转的。在这个例子中,你已经把_return旋转(“+ i(t)+”,100,100)“; _你可以看到只有旋转角度在tween中受到影响。 – Cyril

回答

0

正如在注释中,你可以清楚地看到差异,当您检查属性...

var log = d3.ui.log("#log").style("vertical-align", "top"), 
 
\t logTween = d3.ui.log("#logTween").style("vertical-align", "top"), 
 
    stoppedTween = false, 
 
    stopped = false; 
 
log.writeLine("translate\t\trotate") 
 
logTween.writeLine("translate\t\trotate") 
 

 
var rect = d3.select("body") 
 
    .insert("svg", "#log").attr("width", 200).attr("height", 100).append("rect") 
 
    .attr("x", 20) 
 
    .attr("y", 20) 
 
    .attr("fill", "black") 
 
    .attr("width", 40) 
 
    .attr("height", 40); 
 

 
rect.transition() 
 
    .ease("linear") 
 
    .duration(1000) 
 
    .attr("transform", "rotate(180,100,100)") 
 
    .each("start", function() { 
 
    d3.timer(function() { 
 
     var t = d3.transform(rect.attr("transform")); 
 
     log.writeLine([t.translate.map(f).join(","), f(t.rotate)].join("\t")) 
 
     return stopped; 
 
    }) 
 
}) 
 
    .each("end", function() { 
 
    stopped = true 
 
}); 
 
var svg = d3.select("body").insert("svg", "#logTween").attr("width", 100).attr("height", 100); 
 

 
var rectTween = svg.append("rect") 
 
    .attr("x", 20) 
 
    .attr("y", 20) 
 
    .attr("width", 40) 
 
    .attr("height", 40); 
 

 

 
rectTween.transition().duration(1000) 
 
    .ease("linear") 
 
    .attrTween("transform", rotTween) 
 
    .each("start", function() { 
 
    d3.timer(function() { 
 
     var t = d3.transform(rectTween.attr("transform")); 
 
     logTween.writeLine([t.translate.map(f).join(","), f(t.rotate)].join("\t")) 
 
     return stoppedTween; 
 
    }) 
 
}) 
 
    .each("end", function() { 
 
    stoppedTween = true 
 
}); 
 

 

 
function rotTween() { 
 
    var i = d3.interpolate(0, 360); 
 
    return function(t) { 
 
     return "rotate(" + i(t) + ",40,40)"; 
 
    }; 
 
} 
 

 
function f(x) { 
 
    return d3.format(" >6.1f")(x) 
 
}
div {white-space: pre;} 
 
svg {overflow: visible;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js" charset="UTF-8"></script> 
 
<script src="https://rawgit.com/cool-Blue/d3-lib/master/Output/log/log.js"></script> 
 
<div id="log"></div> 
 
<div id="logTween"></div>