对于一个项目,我们试图在沿着直线路径旋转时将圆形成一条线(并且再次返回),就像轮胎在道路上滚动时旋转和平移,或者卷曲的前指延长并重新投入掌中。
在这个Fiddle中,我有一个静态SVG(顶部圆圈),它沿着线性黑色路径(在圆圈上方,模仿伸出的手指)旋转,这是在HTML中定义的。
我还使用d3生成一个由连接点组成的“圆圈”(如果你点击/圈中的@krisJamesC here,可以展开),并进行翻译和旋转 在单击紫色线时的函数moveAlongLine中:
function moveAlongLine() {
circle.data([lineData])
.attr("transform", "translate(78.5,0) rotate(-90, 257.08 70) ")
.duration(1000)
circle.on("click", transitionToCircle)
}
第一个问题是.duration(1000)
无法识别并在控制台中抛出Uncaught TypeError: Object [object Array] has no method 'duration'
,因此SVG中dur
的静态定义与动态设置之间存在差异在JS / D3中,但这是次要的。
另一个是变换属性应该像静态圆一样从彼此抽象出来吗?在静态圆中,平移是一个动画,旋转是另一个,它们只有相同的星和持续时间,因此它们一起动画。你会如何在d3中同时申请?
我无法获得的挑战是如何让它向上展开(并且还重新回滚),静态点是圆的顶部中心也与线上最左边的点相同。
这些似乎更好:
xsltproc
为我正确转换。这看起来很复杂但有潜力:
这看起来很复杂而且很笨重:
几点说明:
答案 0 :(得分:1)
我最终使用与问题中生成圆圈相同的功能,并做了一些思考,似乎我想要一个看起来像手指展开的动画像fiddle一样。这引导我在这个fiddle中实现所需的数学和思想。
答案是一个数组数组,每个嵌套数组都是一个处于不同状态的行,然后通过在点之间插值来设置动画。
var circleStates = [];
for (i=0; i<totalPoints; i++){
//circle portion
var circleState = $.map(Array(numberOfPoints), function (d, j) {
var x = marginleft + radius + lineDivision*i + radius * Math.sin(2 * j * Math.PI / (numberOfPoints - 1));
var y = margintop + radius - radius * Math.cos(2 * j * Math.PI / (numberOfPoints - 1));
return { x: x, y: y};
})
circleState.splice(numberOfPoints-i);
//line portion
var lineState = $.map(Array(numberOfPoints), function (d, j) {
var x = marginleft + radius + lineDivision*j;
var y = margintop;
return { x: x, y: y};
})
lineState.splice(i);
//together
var individualState = lineState.concat(circleState);
circleStates.push(individualState);
}
和动画
function all() {
for(i=0; i<numberOfPoints; i++){
circle.data([circleStates[i]])
.transition()
.delay(dur*i)
.duration(dur)
.ease("linear")
.attr('d', pathFunction)
}
}
function reverse() {
for(i=0; i<numberOfPoints; i++){
circle.data([circleStates[numberOfPoints-1-i]])
.transition()
.delay(dur*i)
.duration(dur)
.ease("linear")
.attr('d', pathFunction)
}
}
答案 1 :(得分:0)
(注意:这应该在评论中,但间距不够)
<path...
属性以符合您的口味。