Flash CS5 Перемещение объекта по кругу на 1 градус за раз

У меня есть объект под названием точка, который я могу перемещать по экрану с помощью мыши. Этот объект имеет вектор, отображаемый через него (_v1) с использованием центра сцены и «точки» s x, y местоположения, чтобы нарисовать вектор (обратите внимание, что все это работает нормально). Моя проблема возникает, когда я настраивал кнопку, которая просто устанавливает значение true, если вы ее нажимаете. Идея этой кнопки заключается в том, что при нажатии, в каком бы месте ни находилась «точка», она перемещается на 1 градус по часовой стрелке по кругу вокруг центра сцены (все это происходит в frameHandler, поэтому я могу продолжать нажимать кнопку, чтобы это продолжается по сцене). Код, который я использую, основан на выражении if, указанном ниже:

if(clockwisePressed) {
    var v1angle:Number = _v1.angle;
    v1angle++; //increase the angle by 1 degree
    if(v1angle>180) {
        v1angle -= 360;
    }
    //Now just move the crosshair and get it ready to be redrawn
    point.x = centerX - _v1.m * Math.cos(v1angle);
    point.y = centerY - _v1.m * Math.sin(v1angle);
    clockwisePressed = false; //remove button pressed boolean
}

Итак, что здесь происходит, это то, что для clockwisePressed было установлено значение true, поэтому это срабатывает. Мой вектор (_v1) настроен так, чтобы сообщать мне угол (уже преобразованный из радианов в градусы), но это значение только для чтения. Поэтому я назначаю его (_v1.angle) v1angle, чтобы я мог с ним повозиться, и увеличил его на 1, так что я двигаюсь по часовой стрелке вокруг центра сцены. Затем я просто проверяю, попадает ли он в диапазон от -180 до 180 (если я отслеживаю _v1.angle вокруг сцены, 0 градусов слева, 90 градусов прямо вверх, 180 градусов справа и -90 прямо вниз). Теперь, используя формулу, полученную мной из этого потока, но преобразованную для работы с 0 градусов указывает влево, а значение Y увеличивается по мере продвижения вниз по ступени, я придумал

x = centerX - radius * cos(angle)
y = centerY - radius * sin(angle)

Теперь, когда я делаю образец диаграммы на бумаге и использую эти значения на своем калькуляторе, это работает как шарм. Если я вставлю угол, радиус и центр, я получу точку прямо на моем круге, который я рисую на листе миллиметровой бумаги. Однако, когда я на самом деле пробую это со вспышкой, «точка» прыгает по всей сцене. (Обратите внимание, что _v1.m - это просто величина вектора между центром сцены и «точкой», которая совпадает с радиусом).

Итак, я отслеживаю все, и значения cos и sin не кажутся правильными. Например, если мой угол равен -1,9581, и я беру его cos на своем калькуляторе, я получаю что-то вроде линии 0,9994, но мигает Math.cos (угол) как -0,3777. Разве использование Math.cos (-1.9581) не то же самое, что ввод -1.9581 в ваш калькулятор и нажатие cos?

Итак, в случае с моим примером выше мой point.x изменился с 139,95 до 261,3. Довольно большой скачок на 1 градус. Итак, я не понимаю, что вызывает такой резкий сбой этого кода. Я что-то здесь делаю не так?

ОБНОВЛЕНИЕ: Если кто-то, кто ищет в этой теме, заинтересован, ниже приведен исправленный код, который работает:

if(clockwisePressed) {
    var v1RadAngle:Number = Math.atan2(_v1.vy, _v1.vx); //get angle in radians
    v1RadAngle += 0.0174; //increase the angle by ~1 degree more or less
    //Now just move the crosshair and get it ready to be redrawn
    point.x = centerX - _v1.m * Math.cos(v1RadAngle); //_v1.m = radius
    point.y = centerY - _v1.m * Math.sin(v1RadAngle);
    clockwisePressed = false; //remove button pressed boolean
}

person FlashNoob468    schedule 02.08.2011    source источник


Ответы (1)


Триггерные функции во Flash ожидают ввода в радианах, но вы используете градусы. Перед использованием необходимо преобразовать значение градуса в радианы:

var angle:Number = -1.9581;
var radAngle:Number = angle * Math.PI / 180;
trace(Math.cos(radAngle)); // 0.9994160815411552
person shanethehat    schedule 02.08.2011
comment
Ух ... ты хочешь сказать, что я был слишком эффективен для вспышки? РЖУ НЕ МОГУ. Думал, что я был умным, выполняя все преобразования и тому подобное, чтобы упростить задачу. Я могу просто оставить его в радианах, и мне даже не нужен чек, чтобы изменить его с 180 на -179. Спасибо, что еще раз спасли меня. - person FlashNoob468; 02.08.2011