Javascript 缩放值时,ATAN计算失败
Im动画精灵w JavaScript-这些精灵由一个容器DIV组成,第一个子元素是一个绝对定位的IMG。图像由对象的16个垂直视图/角度组成。当对象从A移动到B时,ATAN2函数计算与对象移动方向相适应的style=top:值。除了雪碧的另一个方面——它们可以改变它们的大小之外,这一切都是有效的。精灵的默认大小为24px(宽),这在ATAN2中确实有效,但一旦精灵变大,计算就会使精灵的边框条发生偏移。下面是代码,x1-y1是起始位置和结束位置,s是大小(宽度)。值128是最大大小-带括号的值是允许的精灵值,最后一次计算假定这一点,然后使用*(s/128)计算实际大小Javascript 缩放值时,ATAN计算失败,javascript,math,Javascript,Math,Im动画精灵w JavaScript-这些精灵由一个容器DIV组成,第一个子元素是一个绝对定位的IMG。图像由对象的16个垂直视图/角度组成。当对象从A移动到B时,ATAN2函数计算与对象移动方向相适应的style=top:值。除了雪碧的另一个方面——它们可以改变它们的大小之外,这一切都是有效的。精灵的默认大小为24px(宽),这在ATAN2中确实有效,但一旦精灵变大,计算就会使精灵的边框条发生偏移。下面是代码,x1-y1是起始位置和结束位置,s是大小(宽度)。值128是最大大小-带括号的值是允
在第一行中,执行浮点计算并将结果传递给需要字符串参数的函数。。。隐式转换保存了您,但这很难看 第二行中的巨大条件将角度四舍五入到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
。。。隐式转换保存了您,但这很难看
第二行中的巨大条件将角度四舍五入到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
的精确倍数,因为方向与大小无关,所以v计算看起来是正常的。第二行只是坏消息——看不懂,效率不高,诸如此类。那是什么?v计算看起来不错,因为方向与大小无关。第二行只是坏消息——看不懂,效率不高,诸如此类。那是什么?我试过了,效果很好-非常感谢。。。你救了我一命,亲爱的-在进一步测试你的公式后,我发现物体离起始位置越远,它的精确度就越低。如果开始接近尾声,效果很好。现在这是一个奇怪的现象。。。你的意思是你的图像显示错误,还是它们没有对齐?在调用Math.atan2
时,仅点之间的距离是数字——将其结果(在-pi和+pi之间)映射到整数在任何距离上都应该是相同的。这不是对齐问题——我只是再次查看了它,它似乎很好——我想在出现明显错误之前,我会一直保留它。谢谢你的帮助…我试过了,效果很好-非常感谢。。。你救了我一命,亲爱的-在进一步测试你的公式后,我发现物体离起始位置越远,它的精确度就越低。如果开始接近尾声,效果很好。现在这是一个奇怪的现象。。。你的意思是你的图像显示错误,还是它们没有对齐?在调用Math.atan2
时,仅点之间的距离是数字——将其结果(在-pi和+pi之间)映射到整数在任何距离上都应该是相同的。这不是对齐问题——我只是再次查看了它,它似乎很好——我想在出现明显错误之前,我会一直保留它。谢谢你的帮助。。。