Так что я уверен, что ответом на этот вопрос будет что-то простое, и я прочитаю его и сразу же начну эпическую маску лица, но в данный момент я провел целый день, задаваясь вопросом, какого черта это не работает, и я просто не могу найти проблему ...
Я пытаюсь создать простую (в любом случае, предполагаемую) систему для поворота 2d точек вокруг центральной оси, но я обнаружил две проблемы, которые пока не имеют для меня никакого смысла.
Проблема 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>' );
}
Теперь вы ожидаете увидеть:
а:
Начало: X: 32 Y: 32
Конец: X: 32 Y: -32
б:
Начало: X: -32 Y: 32
Конец: X: -32 Y: -32
с:
Начало: X: -32 Y: -32
Конец: X: -32 Y: 32
d:
Начало: 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
с:
Начало: X: -32 Y: -32
Конец: X: -32 Y: -32
d:
Начало: X: 32 Y: 32
Конец: X: -32 Y: -32
Я трижды проверил математику, и она на 100% точна, чтобы вращать точки вокруг начала координат в 2D. Я даже пересоздал этот тест в PHP, и он отлично работает. Что я не могу понять, так это то, почему, черт возьми, JS а) испортит присвоение переменных и б) не дает правильных результатов?
Любой, кто может помочь, может быть уверен, что я приветствую их проницательность лицевым пальцем, которым сэр Патрик будет гордиться;)