2017-09-12 20 views
2

d3.jsを使用してゲージ針をアニメートしようとしていますが、奇妙なアニメーションになります。私はインターネットからいくつかの検索を行っていますが、問題を解決するためにどのような解決方法を使うことができないのか分かりません。d3.jsを使用してゲージ針をアニメーション化する

Codepen

function createNeedle(sampleAngle){ 
    topX = centerX - Math.cos(sampleAngle) * triLength 
    topY = centerY - Math.sin(sampleAngle) * triLength 

    leftX = centerX - 10 * Math.cos(sampleAngle - Math.PI/2) 
    leftY = centerY - 10 * Math.sin(sampleAngle - Math.PI/2) 

    rightX = centerX - 10 * Math.cos(sampleAngle + Math.PI/2) 
    rightY = centerY - 10 * Math.sin(sampleAngle + Math.PI/2) 


    return " M " + leftX + " " + leftY + " L " + topX + " " + topY + " L " + rightX + " " + rightY; 

    } 

    //animate the needle 
    d3.select('.moveNeedle') 
    .attr('d', createNeedle(sampleAngle1)) 
    .transition() 
    .duration(2000) 
    .attr('d', createNeedle(sampleAngle2)); 
+0

あなたはこのSO質問(https://stackoverflow.com/questions/30849961/d3-js-tween-arc-を参照してください例えば、XとYは、遷移中の座標を計算するためにcustomTweenを作成することになりますd3-js-arc)と関連ブロック(http://bl.ocks.org/mbostock/5100636) –

+0

ありがとう、私はhttpにしたがってそれを修正する方法を考え出します:/ /bl.ocks.org/mbostock/5100636 –

+0

ほぼ重複しています:[* "D3 SVG変換回転遷移が変わった" *(/ q/40244530)。 – altocumulus

答えて

1

あなたの代わりに、パスを再描画のtransform="rotate()"を適用する場合は、そんなに簡単にあなたの人生を作ることができます。

しかし、標準d3.interpolateTransformSvgが予期しない動作をするため、カスタムTween関数を指定する必要があります。

var topX = centerX - triLength, 
    topY = centerY, 

    leftX = centerX, 
    leftY = centerY + 10, 

    rightX = centerX, 
    rightY = centerY - 10; 

function rotateNeedle(sampleAngle){ 
    return "rotate(" + sampleAngle + "," + centerX + "," + centerY + ")"; 
} 

d3.select('.moveNeedle') 
    // only draw once 
    .attr('d', "M" + leftX + " " + leftY + " " + topX + " " + topY + " " + rightX + " " + rightY) 
    // supply angles in degrees! 
    .attr('transform', rotateNeedle(sampleAngle1)) 
    .transition() 
    .duration(2000) 
    .attrTween('transform', function() { 
     var i = d3.interpolate(sampleAngle1, sampleAngle2) 
     return function (t) { 
      return rotateNeedle(i(t)); 
     }; 
    }); 
+0

興味があれば、interpolateTransformSvgの奇妙な動作について[バグレポート](https://github.com/d3/d3-interpolate/issues/44)を提出しました – ccprog

+0

これは本当にバグではなくむしろ機能リクエスト。 D3には、原点以外の任意の中心を中心に回転を補間する手段がありません。私の[回答](https://stackoverflow.com/a/40245163/4235784)[* "D3 SVG変換回転遷移が変わった" *](/ q/40244530)を参照してください。 – altocumulus

+0

私の最後のコメントに加えて、簡単な "修正"があるとは思わない。変換の変換のために、値は最初に単一の変換行列に統合され、次に変換されます(https://www.w3.org/TR/css-transforms-1/#decomposing-a-2d-matrix)。対応する変換関数回転中心についての明示的な*情報は、分解された値で暗黙的*利用可能であるため、これらのステップに沿って失われます。 – altocumulus

関連する問題