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

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

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

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

Ответы [ 3 ]

2 голосов
/ 20 января 2011

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

1 голос
/ 20 января 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

1 голос
/ 20 января 2011

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

...