Расчет ATAN не выполняется, когда значения масштабируются - PullRequest
1 голос
/ 13 мая 2011

Im animating sprites w javacript - эти спрайты состоят из контейнера DIV, а firstChild является IMG с абсолютным позиционированием. Изображение состоит из 16 вертикальных видов / углов объекта. Когда объект перемещается из A в B, функция ATAN2 вычисляет style = top: значение, соответствующее направлению, в котором движется объект. Все это работает, за исключением другого аспекта спрайта - они могут изменять свой размер. Размер спрайта по умолчанию составляет 24 пикселя (в ширину), и это работает с ATAN2, но как только спрайт становится больше, вычисление смещает рамку спрайта. Ниже приведен код, x1 - y1 - позиции from и to, а s - размер (ширина). значение 128 является максимальным размером - и значения в скобках имеют допустимый спрайт, и последнее вычисление предполагает это, затем вычисляет фактический размер с помощью * (s / 128) ...

function P_angle(x1,x2,y1,y2,s)
{
var v=parseInt(Math.atan2(x2-x1,y2-y1)/(Math.PI/180)+180)
return (v>348.75?0:v>326.25?-128:v>303.75?-256:v>281.25?-384:v>258.75?-512:v>236.25?-640:v>213.75?-768:v>191.25?-896:v>168.75?-1024:v>146.25?-1152:v>123.75?-1280:v>101.25?-1408:v>78.75?-1536:v>56.25?-1664:v>33.75?-1792:v>11.25?-1920:0)*(s/128);
}

1 Ответ

1 голос
/ 13 мая 2011

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

Огромное условное выражение в вашем второмлиния округляет угол до ближайшего кратного 22,5 градусов, оборачивая и отображая на отрицательные кратные 128, затем умножает его на s, деленное на 128 ... было ли это изначально рассчитано на спрайты 128 пикселей?В любом случае, вы просто должны быть в состоянии сделать это:

function P_angle(x1,x2,y1,y2,s)
{
    return s*(Math.round(Math.atan2(x2-x1,y2-y1)*(8/Math.PI)-8)%16);
}

Вы не говорите, насколько велико смещение с вашим исходным кодом, но я подозреваю, что это вызвано ошибками округления при делении на 128-фактори что вам просто повезло, что все округлилось правильно для 24-пиксельных спрайтов.С версией здесь вы наверняка вернете точное кратное s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...