に:明確にする。円を描く。特定の座標から円を描き始めます。今度は別の座標から始まる円を描きましょう。d3では、トゥイーンのパス位置を動的に変更することは可能ですか?
私はSVGグリフから派生したパスデータを再生していて、d3js tweenを使用してパス間の変更をアニメートしています。
この例では、1から9,0まで数えてから繰り返します。
http://jsfiddle.net/chrisloughnane/HL2ET/
あなたがトランジションの一部を見ることができるように
は、他の人のように素敵ではありません。次のパスのパスを閉じる線を描きます。 (私はそれを推測しています)これは、新しい形状の計算が行われたときに、パスの開始点と終了点が非常に離れている場合に発生します。それが動作するとき、それはとてもいいです。醜い行に誰かが解決策を提案できますか?パスデータなし
CODEは
svg.append("path")
.attr("transform", "translate(150,300)scale(.2,-.2)")
.style("stroke", "red")
.style("fill", "gray")
.style("stroke-width", "9")
.attr("d", d0)
.call(transition, digits[0], digits[position]);
function transition(path, d0, d1) {
position++;
if(position==10)
{
position=0;
}
path.transition()
.duration(2000)
.attrTween("d", pathTween(d1, 4))
.each("end", function() { d3.select(this).call(transition, d1, digits[position]); });
}
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://bl.ocks.org/mbostock/3081153が正常に動作としてあまりにもクロームモバイルに失敗しました。
次のステップは、この効果を文章に適用することです。
うーん興味深い問題:
は、詳細は画像を参照してください。補間のp0とp1のポイントをマッチングさせるためのより良いアルゴリズムの必要性があるように見えます。ユークリッド距離に基づいてポイントを合わせるためにGale-Shapleyを試してみたいかもしれません。私は最良のアルゴリズムは、交差点を生じさせない2つの点の間の補間を優先させるアルゴリズムだと思う。それをどうやって行うかわからない。 –