У меня есть объект под названием точка, который я могу перемещать по экрану с помощью мыши. Этот объект имеет вектор, отображаемый через него (_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
}