Отрицательные/положительные числа в объекте инвертируют себя?

Так что я уверен, что ответ на этот вопрос будет чем-то простым, и я прочитаю его и немедленно начну эпический фейспалм, но на данный момент я провел целый день, задаваясь вопросом, почему, черт возьми, это не работает, и я просто могу' не найди проблему...

Я пытаюсь построить простую (во всяком случае, так должно быть) систему для вращения 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 а) испортил присвоение переменных и б) не дает правильных результатов?

Любой, кто может помочь, может быть уверен, что я приветствую их понимание фейспалмом, которым сэр Патрик гордился бы;)


person Brian    schedule 20.01.2011    source источник


Ответы (3)


Подождите секунду, разве вы не должны сохранить pos.left перед вычислением pos.top, чтобы можно было использовать старое значение pos.left в этом вычислении?

person Pointy    schedule 20.01.2011
comment
о боже спасибо! ХА-ХА! Господи, я просмотрел это более миллиона раз и никогда не думал о том, что я перезаписываю переменную, прежде чем использовать ее для вычисления второй точки! Боже мой, спасибо вам и Джеффу, вы будете читать обо мне в новостях после того, как я закончу фейспалмировать свое лицо здесь ... - person Brian; 20.01.2011

В ваших операторах «var msg = ..." вы печатаете точки[k].left дважды и никогда не печатаете точки[k].top.

person Jeff Ames    schedule 20.01.2011

Начать фейспалм:

for( var k in points ){
    var msg = 'Start: X:'+points[k].left+' Y:'+points[k].left+'<br />';
    points[k] = doRotate(points[k]);
    var msg = msg+'End: X:'+points[k].left+' Y:'+points[k].left+'<br />';
    document.write( '<p>'+k+':<br />'+msg+'</p>' );
}

должен прочесть

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>' );
}

Вы печатаете свойство left для Y, когда вы должны печатать свойство top

person Dancrumb    schedule 20.01.2011