2012-10-15 34 views
2

交叉乘積的大小描述了用於構建交叉乘積的兩個向量(u,v)描述的平行四邊形的符號區域,它有其用途。這個相同的大小可以計算爲u乘以u和v之間角度的正弦的幅度的倍數: || u |||| v || sin(theta)。我可以在不計算角度的情況下找到餘弦值的正弦值嗎?

現在U(歸一化)和v(歸一化)的點積給出u和v之間的角度的餘弦值:== COS(THETA)的點(正常化(U),歸一化(V))

我希望能夠得到與餘弦值有關的符號正弦值。這是相關的,因爲正弦波和餘弦波的PI/2不同步。我知道1的平方根減去餘弦值的平方給出了無符號正弦值: sin(theta)== sqrt(1-(cos(θ)*cosθ) 其中cos(θ)I mean 。點積不角度

但是隨之而來極性符號計算(+/-)需要THETA作爲角度: (COS(希塔+ PI/2))>或==或如果非要執行ACOS功能我還不如干脆做叉積,找到幅度。

有沒有可以添加到一個餘弦值,以獲得其相關的正弦值已知比例或步?

+4

你要知道哪個象限THETA是其他明智總有一個給定的正弦/餘弦兩種可能的角度值。請注意,這個問題也適用於ArcSin和ArcCos,所以這不是一個解決方案。 – RBarryYoung

+0

我可以看到矢量的象限是已知的(如果(+,+,+),則(x,y,z),如果(+, - , - )則(x,-y,-z)等)的世界空間,但是計算一個旋轉空間(逆旋轉矩陣和確定符號)看起來會使交叉乘積值成爲更便宜的選擇。 – ste3e

+1

這是2D還是3D?在2D中,您可以得到交叉乘積 - 從而得到正弦的符號 - 用兩次乘法和一次減法。在3D中,角度符號的問題是任意的,除非您將任意方向定義爲「向上」。 – Joni

回答

1

對於每個可能的餘弦,如果相應的角度不受限制,兩個符號都可能用於正弦。

如果知道角度在[0,pi]之間,則正弦必須爲正或零。

如果你想知道平行四邊形的面積,總是採取積極分支sin(x) = sqrt(1 - cos(x)^2)。如果你有兩個向量,直接使用交叉積或點積,而不是另一個並進行轉換。如果你有兩個向量,直接使用交叉積或點積,而不是另一個進行轉換。

+0

我只關心幅度是正值,零值還是負值,因爲它是有用的,決定了一個點是否按照給定的方向依次存在......該區域與我所需要的無關。如果可能的話,我正在尋找一種更有效的方法來獲取此有符號值,而不是跨產品和幅值計算。 – ste3e

+1

如果您只關心正面,負面或零,則可以使用未歸一化向量的叉積。 – phkahler

-2

我想我找到了解決方案。 v perp

cos(b) == sin(a) 

v_parallel = dot(normalize(u), v) // the projection of v on u 

v_perp = normalize(v) - v_parallel 

cos(b) = dot(normalize(v), v_perp) // v_perp is already normalized 

因此,

u cross v = magnitude(u) * magnitude(v) * cos(b) 
+0

這是一個解決方案嗎?你說你想要比「跨產品和量級計算」更好的方法。 – Beta

+0

你說|⊥| = 1,但你定義⊥=/|| - ∥。由於|/||| = 1,相減/ || - ∥不能是1 - 你*做*必須歸一化⊥。另外,這有什麼用處呢?我雖然想從'罪(a)'轉到'cos(a)',但你在這裏有'sin(apple)== cos(orange)'。 –

0

幅度在我看來,像一個複雜的方式去atan2身份:

d = · = ||||cosθ 
c = |×| = ||||sinθ (with 0° < θ < 180°) 

tanθ = ·/|×| 
    θ = atan2(c·sgn(c|z), d) (= four quadrant) 

其中sgn(c|z)是Z-的符號c中的分量(除非和兩者都與xz或yz平面完全平行,那麼它的y分量和xc的符號分別)。

現在,從基本的trig公司的身份,

r = √(x²+y²) 

cos(atan2(y,x)) = x/r 
sin(atan2(y,x)) = y/r 

因此,

sinθ = c·sgn(c|z)/√(c²+d²) 
cosθ = d/√(c²+d²)