Так что я уверен, что ответ на этот вопрос будет чем-то простым, и я прочитаю его и немедленно начну эпический фейспалм, но на данный момент я провел целый день, задаваясь вопросом, почему, черт возьми, это не работает, и я просто могу' не найди проблему...
Я пытаюсь построить простую (во всяком случае, так должно быть) систему для вращения 2d-точек вокруг центральной оси, но пока я обнаружил 2 проблемы, которые не имеют для меня никакого смысла.
Проблема 1: Положительные/отрицательные числа, присвоенные входному объекту, переворачиваются случайным образом. Проблема 2: Математика вращения верна, но результаты никакие.
Вот код для воспроизведения этой проблемы:
function doRotate(pos){
//convert angle to radians
var ang = 90 * Math.PI / 180;
//rotate points
pos.left = Math.round(pos.left * Math.cos(ang) + pos.top * Math.sin(ang));
pos.top = Math.round(pos.top * Math.cos(ang) - pos.left * Math.sin(ang));
return pos;
}
var points = {
'a':{left:32,top:32},
'b':{left:-32,top:32},
'c':{left:-32,top:-32},
'd':{left:32,top:-32}
};
for( var k in points ){
var msg = 'Start: X:'+points[k].left+' Y:'+points[k].top+'<br />';
points[k] = doRotate(points[k]);
var msg = msg+'End: X:'+points[k].left+' Y:'+points[k].top+'<br />';
document.write( '<p>'+k+':<br />'+msg+'</p>' );
}
Теперь вы ожидаете увидеть: a: Начало: X:32 Y:32 Конец: X:32 Y:-32
b: Начало: X:-32 Y:32 Конец: X:-32 Y:-32
c: Начало: X:-32 Y:-32 Конец: X:-32 Y:32
г: Начало: X:-32 Y:32 Конец: X:32 Y:32
Но вместо этого вы получаете это:
а: Начало: X:32 Y:32 Конец: X:32 Y:32
b: Начало: X:-32 Y:-32 Конец: X:32 Y:32
c: Начало: X:-32 Y:-32 Конец: X:-32 Y:-32
d: Начало: X:32 Y:32 Конец: X:-32 Y:-32
Я трижды проверил математику, и она на 100% точна для вращения точек вокруг начала координат в 2D. Я даже воссоздал этот тест на PHP, и он отлично работает. Чего я не могу понять, так это почему, черт возьми, JS а) испортил присвоение переменных и б) не дает правильных результатов?
Любой, кто может помочь, может быть уверен, что я приветствую их понимание фейспалмом, которым сэр Патрик гордился бы;)