2017-09-12 1 views
2

d3.js를 사용하여 게이지 바늘을 애니메이션하려고하지만 이상한 애니메이션이 생깁니다. 인터넷에서 일부 검색을했는데 문제를 해결하기 위해 어떤 솔루션을 사용할 수 있는지 파악할 수 없었습니다. 당신이 경로를 다시 그리는 대신 transform="rotate()"을 적용 할 경우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 질문을 볼 수있는 X를 계산하고 Y 예를 들어, 전환하는 동안 조정하는 customTween (https://stackoverflow.com/questions/30849961/d3-js-tween-arc-를 작성하는 것입니다 d3-js-arc) 및 관련 블록 (http://bl.ocks.org/mbostock/5100636) –

+0

고맙습니다. http : : //bl.ocks.org/mbostock/5100636 –

+0

거의 중복됨 : [* "D3 SVG 변환 회전 전환이 이상하게 작동 함 *] (/ q/40244530). – altocumulus

답변

1

당신은 너무 쉽게 당신의 인생을 만들 수 있습니다.

표준 d3.interpolateTransformSvg은 예상치 못한 방식으로 작동하므로 사용자 정의 트윈 기능을 제공해야합니다.

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

마지막 코멘트에 덧붙여 나는 쉬운 "수정"이 있다고 생각하지 않습니다. 변환의 변환을 위해 값은 먼저 단일 변환 행렬로 통합되며이 변환 행렬은 다음으로 [decomponsed]됩니다 (https://www.w3.org/TR/css-transforms-1/#decomposing-a-2d-matrix). 대응하는 변환 함수 회전 중심에 대한 * 명시 적 * 정보는 분해 된 값에서 암시 적으로 * 사용할 수 있으므로이 단계를 따라 손실됩니다. – altocumulus

관련 문제