我正在嘗試用相同數量的段補間2條路徑。我使用的邁克·博斯托克這裏介紹的方法:https://gist.github.com/mbostock/3916621:d3js - 2條路徑之間的轉換
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路徑具有相似的形狀,但補間比它可能要複雜得多。有沒有辦法來解決這個問題?
非常感謝
也許你可以弄清楚如何繪製第一條路徑'd0',其條款與'd1'相同。即按照與d1中出現的順序相同的順序,使用一系列曲線和直線指定'd0',但點的數值不同。由於'd0'是一個圓,所以每條線將結束於其結束之前的曲線的同一點(即線的長度爲0)。這樣d3可能「知道」如何正確插入它。 – meetamit 2014-08-28 04:27:23