AS3 Непрерывное значение от ползунка вращения - PullRequest
0 голосов
/ 28 октября 2011

У меня есть циферблат, который я перетаскиваю по кругу, чтобы дать мне показание от 0 до 1.

Примерно так:

dx = mouseX-centerX;
        dy = mouseY-centerY;
        rad = Math.atan2(dy,dx);

        rad += offset;

        Tweener.addTween(knob,{y:centerY - Math.cos(rad)*radius, time:.1,  transition:"easeOutSine"});
        Tweener.addTween(knob,{x:centerX + Math.sin(rad)*radius, time:.1,  transition:"easeOutSine"});
        knob.rotation = rad * 180 / Math.PI;

Эта работа великолепна, за исключением случаев, когда ползунок переходит от 359 градусов к 1 градусу, мое значение от 0 до 1 возвращается к нулю. (Что имеет смысл, так как значение основано на угле моего ползунка)

Я пытаюсь найти способ перемещения циферблата с 359 градусов до 361 и далее в основном.

У меня в голове: мне нужно проверить, не превышает ли следующее значение моего перетаскивания мышью точку 360 градусов и прибавить 360 к общей сумме, чтобы оно не возвращалось к нулю и продолжалось до 361 градуса.

Я просто не могу понять, как поместить это в код ...

1 Ответ

0 голосов
/ 28 октября 2011

На каждом кадре, когда вы вращаете ручку, проверьте изменение углового расстояния вместо прямого угла.

Сохраните угол предыдущего кадра и посмотрите, будет ли разница положительной или отрицательной.

var rad = Math.atan2(dy, dx);
var diff = rad - oldRad;
oldRad = rad;
if( diff > Math.PI )
  diff -= Math.PI * 2;
if( shortestAngle < -Math.PI )
  diff += Math.PI * 2;

diff должен содержать значение, которое, если оно повернуто вправо, является положительным (или отрицательным, если повернуто влево). Просто добавьте это к общему углу.

В коде могут быть некоторые ошибки (взятые из старого проекта), но в этом суть:)

Надеюсь, это поможет!

...