как перевести путь svg

У меня есть svg спидометра. Я хочу создать анимацию. Есть игла, сделанная из дорожки. Я сгруппировал этот путь, чтобы я мог переводить или преобразовывать. Это метр/стрелка, которая должна двигаться в соответствии с заданным пользователем значением. Если пользователь указывает значение от 0 до 25, игла должна быть в первом срезе и так далее. Но я понятия не имею, как двигать стрелку, состоящую из пути.

Я создал jsbin этого

http://jsbin.com/danefehiro/1/edit?html,js,output

Вот код

<input type="text" id="speedValue" />
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 344.996 344.996" xml:space="preserve">
<g>
    <path fill="rgb(132, 219, 255)" d="M7.5,243.337h52.227c0-31.141,12.622-59.334,33.03-79.741l-36.93-36.93
        C25.968,156.525,7.5,197.774,7.5,243.337z"/>
    <path fill="rgb(84, 192, 235)" d="M55.827,126.666l36.93,36.93c20.408-20.408,48.6-33.03,79.741-33.03V78.339
        C126.935,78.339,85.685,96.807,55.827,126.666z"/>
    <circle style="fill:#51B3DA;" cx="172.498" cy="243.337" r="23.32"/>
    <path fill="rgb(255, 209, 92)" d="M337.496,243.337h-52.227c0-31.141-12.622-59.334-33.03-79.741l36.93-36.93
        C319.028,156.525,337.496,197.774,337.496,243.337z"/>
    <path fill="rgb(255, 112, 88)" d="M289.169,126.666l-36.93,36.93c-20.408-20.408-48.6-33.03-79.741-33.03V78.339
        C218.061,78.339,259.311,96.807,289.169,126.666z"/>
    <g id="meter">
        <path fill="#40596B" id="needle" d="M175.884,220.29c10.162,1.482,18.179,9.5,19.661,19.662l44.785-64.447L175.884,220.29z"/>
    </g>
</g>
</svg>


  var speedValue = document.querySelector('#speedValue');
  var needle = document.querySelector('#needle');
  var meter = document.querySelector('#needle');
  speedValue.addEventListener("click", function(event){
    var value = event.target.value;
    // if value is in between 1 - 25, the needle
    // should be on first block, if 25 - 50, then
    // the needle should be on second slice and if
    // 50  - 75, then on 3rd slice and if 75 - 100
    // then on last slice
    if (value >= 0 && value <= 25) {
      meter.setAttribute("transform", "rotate(45)");
    } else if(value > 25 && value <= 50) {
      meter.setAttribute("transform", "rotate(90)"); 
    } else {
      meter.setAttribute("transform", "rotate(180)"); 
    }
  });

person pythonBeginner    schedule 23.05.2017    source источник


Ответы (1)


person    schedule
comment
Спасибо за решение. Как вычислить идеальный градус для перемещения? Как вы могли знать, что -112,5 градусов точно приходится на первый срез и т. д.? Есть ли математический расчет? Я пришел с факультета управления, поэтому мне трудно понять анимационную часть, такую ​​​​как перевод, трансформация. - person pythonBeginner; 24.05.2017
comment
Ваш спидометр разделен на 4 сегмента по 180 градусов, так что вы правильно поняли, что каждый сегмент равен 180/4 = 45 градусов. Но я полагаю, вы хотите указать его на центр каждого сегмента, а половина сегмента составляет 45/2 = 22,5 градуса. Поскольку график стрелки метра начинается с 135 градусов, вам придется вычесть 135 градусов для всего. Следовательно, для первого сегмента стрелка указывает на 22,5 - 135 = -112,5 градусов. После этого +45 градусов для каждого последующего сегмента. - person Moobie; 24.05.2017
comment
Происхождение преобразования устанавливается в соответствии с центром круга, соединяющим иглу. ‹circle style=fill:#51B3DA; cx=172.498 cy=243.337 r=23.32/› Кстати, не забудьте принять мой ответ, поставив галочку, если он работает! - person Moobie; 24.05.2017
comment
Спасибо за объяснение. Если я хочу использовать элемент animateTransform svg, то значение from должно быть 172.498, 243.337? Каким должно быть значение to? Если ему следует присвоить степень, то я понимаю, но не знаю о происхождении, например, от значения. - person pythonBeginner; 24.05.2017
comment
Почему бы вам не попробовать код самостоятельно? ;) Для справки я добавил в код ‹animateTransform attributeName=transform type=rotate from=0 172,498 243,337 to=360 172,498 243,337 dur=10s repeatDur=indefinite/›, и вы можете наблюдать за результатом. jsbin.com/pigefujane/edit?html,js,output - person Moobie; 24.05.2017
comment
Значение, которое я предоставил, не работало. Я должен предоставить значение случайным образом, чтобы увидеть, что работает. Вот почему я хотел воспользоваться советом по пониманию алгоритма вычисления x, y и градусов. Я отметил это как работающее и полезное. Спасибо еще раз - person pythonBeginner; 24.05.2017
comment
Кстати... jsbin.com/losapicixo/1/edit?html, js,output Изменен прослушиватель обратно на клик, потому что с анимацией keyup будет выглядеть странно. - person Moobie; 24.05.2017