2017-03-03 74 views
1

我在下面的代碼中有一個奇怪的錯誤。向下滾動查看圖像以參考此問題。在下面的圖片中找到的程序使用javascript在畫布中繪製,所以請注意,x和y座標都是正的,所以y座標相對於圖形是顛倒的。旋轉向量時出現錯誤,通過調整旋轉創建新向量

let rotateVectors = (vs, t) => { 
     return sortVectors(Object.keys(vs).map(v => { 

     console.log(vs[v].vector.direction); 
     let rateOfRotation = -.01 * (Math.random() * (5-1)+1); 
     let vector = vs[v].vector 
     let p = vector.magnitude; 
     let c = vector.coords; 
     let x = c.x*Math.cos(rateOfRotation) - c.y*Math.sin(rateOfRotation); 
     let y = c.x*Math.sin(rateOfRotation) + c.y*Math.cos(rateOfRotation); 
     return vector(cartesian2dCoordinate(x,y)) 
     })); 
    } 

上述方法稱爲上一個循環來緩慢地旋轉由一些隨機量矢量,地圖函數返回一個新矢量這需要的x,y座標,或二維笛卡爾對描述上升和運行的矢量。

rotateVectors返回vs對象中所有向量的排序列表(按角度排序,度數爲)。

let vectorDirection = (c) => { 
    //THE ZERO VECTOR 
    if(c.x === 0 && c.y === 0) return 0; 

    //cardinal directions, vertical and horizontal 
    else if(c.x === 0) return c.y > 0 ? .5 : 1.5; 
    else if(c.y === 0) return c.x > 0 ? 0:Math.PI; 

    //q3 
    else if(c.x< 0 && c.y < 0) return (1+ (Math.atan(-1*((c.y * -1)/c.x)))); 
    //q2 
    else if(c.x < 0 && c.y > 0) return (Math.PI/180)*(180 + toDegrees(Math.atan((c.y * -1)/c.x))); 
    //q4 
    else if(c.y < 0 && c.x > 0) return (Math.PI/180)*(toDegrees(Math.atan((c.y * -1)/c.x))); 
    //q1 
    else return Math.atan(c.y*-1/c.x); 
} 

該函數根據其象限返回矢量角度的弧度。

Traversal zone 1

在圖像中的一個,任何給定的矢量將從紅色標記x平面周圍旋轉,一路到-y垂直柱。 S->電子。

traversal zone 2, reversed direction

在圖像中的兩個,所述載體奇蹟般地從E平面到S平面瞬間移動,並且行進以相反的方向。 S-> E,於是矢量傳回圖像1中的-X平面「S」。

我比較新來繪製與載體的東西。我記得學校有點觸動,但我很久沒有用過它了。有沒有人有一個想法可能會發生在這裏?爲什麼我的矢量傳送,改變方向,爲什麼沒有矢量穿過圖像2的S左邊的空區域,並且從圖像1的S下降?

+0

http://imgur.com/a/Skp5O 空區圖像。沒有向量遍歷圖的這個部分。 –

+0

你應該使用vectorDirection中的atan2函數,而不是每個象限都有一個案例 – samgak

+0

哇......該死的。我向上帝發誓,我昨晚嘗試了一切,但沒有發生任何事。它現在按預期工作。 –

回答

1

感謝samgak在評論中的回答。我用這段代碼替換了原始的vectorDirection函數。它按預期工作。矢量以預期的方向旋轉,並以預期的速率旋轉。

let vectorDirection = (c) => { 
//THE ZERO VECTOR 
    if(c.x === 0 && c.y === 0) return undefined; 
    else return Math.atan2(-1*c.y,c.x) 

}