2014-04-08 2 views
1

미터 차트의 운동 애니메이션을 보려고합니다. 그러나 화음을 찍는 동안 화음의 뾰족한 끝은 타원의 둘레를 벗어납니다. 이 fiddle은 제가 직면 한 문제를 설명합니다.스냅 svg 미터 차트 애니메이션

예상 출력 : 애니메이션을 적용하는 중에 뾰족한 끝 부분이 타원 안에 잘 들어 있어야합니다.

여기서는 snap.svg 라이브러리를 사용하여 코드를 움직입니다. 나는이 애니메이션을 달성하기 위해 노력하고이를 통해

코드는 다음과 같습니다

var snapper = Snap("svg"); 

Snap.animate([-230],[0], 
function(val){ 
    snapper.select("#meter").attr({ 
     "transform":"scale(1 1) rotate(" + val[0] + " 242.5 208)" 
    }); 
},10000,mina.linear); 

어떤 도움에 감사드립니다.

미리 감사드립니다.

+1

미터의 크기를 조절할 수있는 각도의 기능을 알아야합니다. 당신의 바이올린의 무의미한 부분을 제거하고 선형 값으로 실험했지만 정확한 것은 아닙니다. 하지만 그것은 출발점 일 수 있습니다 : http://jsfiddle.net/helderdarocha/9H5eg/1/ – helderdarocha

+0

나는 이것을 시도 : http://jsfiddle.net/tejaspchordiya/9H5eg/2/. 여기에서, 나의 경우에는 바늘의 크기를 조절하려고 할 때마다 바늘이 ​​중심을 바꾼다. 나는 값이 딱딱하다 (즉, "+ val [0] +"242.5 208). 어디서 잘못 알 수 있습니까? –

+1

점 0,0 기준으로 축척을 계산해야합니다.http://jsfiddle.net/9H5eg/3/ – Ian

답변

2

이것은 완전한 대답은 아니지만 문제를 조사하는 것입니다.

먼저 표준화 된 값 (회전하려는 중심을 0,0으로 지정)을 사용하여 바늘을 그린 다음 translate를 사용하여 그래픽을 디스플레이 중앙으로 이동해야합니다. 이렇게하면 회전하기가 더 쉽습니다. 예를 들어 :

이제
<use xlink:href="#meter" transform="translate(241.88,198.1)" /> 

는 기원 0,0과 관련하여 확장 할 수 화면을 이동하지 않습니다

<defs> 
<g id="meter"> 
     <line x1="4.24" y1="-9.195" x2="194.35" y2="25.935"/> 
     <line x1="0" y1="9.195" x2="194.35" y2="25.935"/> 
     <line x1="0" y1="9.195" x2="-9.89" y2="-1.555"/> 
     <line x1="4.24" y1="-9.195" x2="-9.89" y2="-1.555"/> 
</g> 
</defs> 

그런 다음 당신은 당신이 그것을 회전 할 장소에 그리기 . scale 인수 변환으로 @Ian에 의해 제안

또한 중심을 추가 동일한 결과를 얻을 수는 좌표

scale(1 1 241.88 198.1) 

다른 문제는 더 복잡하다. 바늘의 길이는 곡선의 각 점에 대한 반경이어야합니다. 반지름이있는 경우 비율에 비례하여 크기를 조절합니다. 반경은 각도의 함수로 계산할 수 있지만, 호가 아닌 베 지어 곡선을 사용하므로 사소한 공식이 아닙니다. 확실하지는 않지만 아크에 베 지어를 근사하는 함수를 가진 SVG 라이브러리가 있다고 생각합니다. 그 문제 (특정 각도에 대한 베 지어 곡선에서 반경 좌표를 얻는 방법)를 별도의 질문 (여기 또는 수학 스택 교환에서)으로 제기 할 수 있습니다.

다음은 근사값 (90 도만 적용)이며 사인 및 로그 함수를 기반으로 한 보정을 사용합니다. 정확한 것을 필요로하지 않으면 그것은 당신을 위해 일할 수도 있습니다. 필자는 SVG를 단순화하고 필수적인 부분 만 보관했습니다.

var snapper = Snap("svg"); 
Snap.animate([-100,0.72,0.89],[-10,1,1], 
    function(val) { 
     var dim = val[1]; 
     var corr = (Math.sin(2*(val[0]+10)*Math.PI/180))*Math.log(val[2]); 

     snapper.select("#meter").attr({ 
     "transform":"scale("+(dim-corr)+" "+(dim-corr)+") rotate(" + val[0] + " 0 0)" 
     }); 
    }, 10000, mina.linear); 

여기에서 확인하십시오 : JSFiddle. 이를 시작점으로 사용하고 문제에 적응 시키십시오.

+0

건배 @helderdarocha. 그런 상세하고 유익한 답변을 주셔서 감사합니다. 이것은 정말로 많은 도움이되었습니다. 나는 당신의 제안에 따라 계량기 차트 애니메이션을 부분적으로 구현했으며 최대한 빨리 피리어드를 추가 할 것이다. 지금은이 [붙박음 오전] [이전 질문] (http://stackoverflow.com/questions/22863758/how-do-i-clockwise-animate-pie-chart-onload-in-svg/22865355#22865355). 저의 최근 코멘트를 확인하십시오. –