不同的浏览器中使用相同的math结果
编辑:因为铬已经更新浏览器 – 这个问题是一些多余的,因为他们已经修复了一个内部的错误,这意味着这个问题不再发生。
我有一个锚定在canvas中心的圆圈animation。
圆越大,运动越不稳定。 但不仅如此,对于我来说,至less在Chrome浏览器到Firefox的情况下会更糟。
math是在这个函数中完成的:
function update(deltaTime){ var centerX = canvas.width/2; var centerY = canvas.height/2; i.currentAngle = (i.currentAngle || 0) + (deltaTime/1000 * i.rotationSpeed); if(i.currentAngle>2*Math.PI){ i.currentAngle-=2*Math.PI; } ix = centerX + (i.radius*i.factor) * Math.cos(i.currentAngle); iy = centerY + (i.radius*i.factor) * Math.sin(i.currentAngle); }
这是工作示例中的代码:
http://jsfiddle.net/96QDK/
Chrome输出:
Firefox输出:
火狐似乎是最接近我的目标,但铬只是古怪。
为什么我会得到这样不同的结果? 我应该提一下,我问过几个人他们看到了什么,而且每个人都看到了不同的错误。
问题不在于Javascriptmath; 这是与canvas 。
function bigCircle(angle) { var radius = 5000; //the bigger, the worse var x = canvas.width/2 + radius*Math.cos(angle); var y = canvas.height/2 + radius*Math.sin(angle); ctx.beginPath(); ctx.arc(x, y, radius, 0, 2 * Math.PI); ctx.lineWidth = 2; ctx.stroke(); }
请注意,数字与Firefox中的数字完全相同 ,但Chrome中的红色弧线显然不正确。
有趣的是,这适用于所有Math.PI / 4
倍数的angular度,但在这些值之间的值是closures的(因此OP的例子中起伏的行为)。
我已经logging了铬错误#320335 。
编辑:它看起来像是在2012年5月第一次报告,是由Skia库中的错误引起的。
现在已经解决了。
不给你一个答案,但有趣的是在Chrome浏览器中有一个math问题
i.currentAngle => 0.0; (deltaTime/1000 * i.rotationSpeed) = 0.025; i.currentAngle + (deltaTime/1000 * i.rotationSpeed) = 2215385637.025;
如果您将单个部分从Update()变为Draw(),以便您可以使用
var current = i.currentAngle; var delta = (deltaTime/1000 * i.rotationSpeed); ctx.fillText(("angle == " + current+ " delta " + delta),10,50);
你得到(0.025和0)打印出来
如果你然后改变
var current = i.currentAngle; var delta = (deltaTime/1000 * i.rotationSpeed); i.currentAngle = current + delta; ctx.fillText(("angle == " + i.currentAngle + " delta " + delta),10,50);
你会得到一个疯狂的大的价值。
但如果你这样做
var newval = current + delta; ctx.fillText(("angle == " + newval + " delta " + delta),10,50);
那么newval的值约为0.025,这是你所期望的。
奇怪的是,如果你然后做到以下几点
var newval = current + delta; i.currentAngle = newval ctx.fillText(("angle == " + newval + " delta " + delta),10,50);
那么newval现在是完全疯狂的价值….