【发布时间】:2014-08-27 23:39:46
【问题描述】:
我正在尝试对具有相同段数的 2 条路径进行补间。我在这里使用 Mike Bostock 描述的方法:https://gist.github.com/mbostock/3916621:
svg.append("path")
.attr("transform", "translate(180,150)scale(2,2)")
.attr("d", d0)
.call(transition, d0, d1);
function transition(path, d0, d1) {
path.transition()
.duration(2000)
.attrTween("d", pathTween(d1, 4))
.each("end", function() { d3.select(this).call(transition, d1, d0); });
}
function pathTween(d1, precision) {
return function() {
var path0 = this,
path1 = path0.cloneNode(),
n0 = path0.getTotalLength(),
n1 = (path1.setAttribute("d", d1), path1).getTotalLength();
// Uniform sampling of distance based on specified precision.
var distances = [0], i = 0, dt = precision / Math.max(n0, n1);
while ((i += dt) < 1) distances.push(i);
distances.push(1);
// Compute point-interpolators at each distance.
var points = distances.map(function(t) {
var p0 = path0.getPointAtLength(t * n0),
p1 = path1.getPointAtLength(t * n1);
return d3.interpolate([p0.x, p0.y], [p1.x, p1.y]);
});
return function(t) {
return t < 1 ? "M" + points.map(function(p) { return p(t); }).join("L") : d1;
};
};
}
它给出了非常好的结果,但是我面临一个愚蠢的问题。 我想找到一种方法将我的第一个路径中的一个片段关联到第二个路径中的另一个片段以获得更好的补间。
例如,这里:http://jsfiddle.net/2brqoo5p/1/ 2 路径具有相似的形状,但补间比它可能的复杂得多。有没有办法解决这个问题?
非常感谢
【问题讨论】:
-
也许你可以弄清楚如何用与
d1相同的术语绘制第一条路径d0。 IE。指定d0使用一系列曲线和直线,其顺序与它们在d1中出现的顺序完全相同,但点的数值不同。因为d0是一个圆,所以每条线都将在它之前的曲线结束的同一点结束(即,线的长度为 0)。这样 d3 可能“知道”如何正确插入它。