2011-01-20 54 views
0

所以我相信這個答案會很簡單,我會讀它,並立即開始史詩般的facepalming,但現在我花了整整一天想知道爲什麼這不工作,我只是找不到問題...對象中的負數/正數反轉?

我試圖建立一個簡單的(應該是無論如何)系統圍繞一箇中心軸旋轉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>'); 
} 

現在,你希望看到: 一個: 開始: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

但是,相反你會得到這樣的:

一個: 開始: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

我三重檢查數學和在2D中圍繞原點旋轉點的準確率爲100%。我甚至在PHP中重新創建了這個測試,並且它完美地工作。我無法弄清楚的是,爲什麼heck JS是a)搞砸了變量賦值和b)沒有得出正確的結果?

任何人誰可以幫助可以放心,我必問他們有捂臉帕特里克爵士將引以爲傲的洞察力;)

回答

2

等一下 - 當不可在計算pos.top之前,您可以保存pos.left,以便您可以使用舊的pos.left該計算值?

+0

噢,我的天啊,謝謝你!哈哈!好主我看了這一百萬次,從未想過我用這個變量覆蓋變量來計算第二點的事實!好神人謝謝你和傑夫在那裏你會在我完成了在這裏面對我的臉後,在新聞中讀到關於我的消息...... – Brian 2011-01-20 17:29:36

1

在你的「變種味精= ...」語句,你打印點[ k] .left兩次,並且從不打印點[k] .top。

1

開始捂臉:

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財產