Разные результаты с использованием одной и той же математики в разных браузерах
Edit: поскольку chrome обновил браузер-этот вопрос является некоторым, что избыточно, поскольку они исправили внутреннюю ошибку, которая означает, что эта проблема больше не возникает.
У меня есть анимация круга, привязанного к центру холста.
чем больше круг становится тем менее устойчивым движение. Но не только это, для меня, по крайней мере, это значительно хуже, в Chrome в Firefox.
математика делается в этом функция:
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;
}
i.x = centerX + (i.radius*i.factor) * Math.cos(i.currentAngle);
i.y = centerY + (i.radius*i.factor) * Math.sin(i.currentAngle);
}
это код в рабочем примере:
хром выходы:
Firefox И Выходы:
Firefox, кажется, ближе всего к тому, к чему я стремлюсь, но Chrome просто дурацкий.
почему я получаю такие разные результаты? Я должен упомянуть, что я спросил несколько человек, что они видят, и все видят по-разному количество неточностей.
2 ответа:
проблема не с математикой Javascript; это с холст.
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
но выключен для значений между ними (отсюда и волнообразное поведение в например, операция).EDIT: похоже, что это было впервые сообщено в мае 2012 года, и было вызвано ошибкой в Skia библиотека.
теперь он был разрешен как основные.
не дает вам ответа, но интересно, что в Chrome есть проблема с математикой
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 теперь совершенно сумасшедшее значение....