叉积的大小描述了用于构建交叉积的两个向量(u,v)描述的平行四边形的有符号区域,它有其用途。这个相同的幅度可以计算为u和v之间角度的正弦的v倍的u倍的大小: ||ü|||| v ||罪(THETA)。
现在u(标准化)和v(标准化)的点积给出了u和v之间角度的余弦: cos(theta)== dot(normalize(u),normalize(v))
我希望能够获得与余弦值相关的带符号正弦值。它是相关的,因为正弦和余弦波是PI / 2不同步。我知道1的平方根减去余弦值的平方值给出了无符号正弦值: sin(theta)== sqrt(1 - (cos(theta)* cos(theta)) 其中cos(theta)是指点积而不是角度。
但是伴随标志计算(+/-)要求θ为角度: (cos(theta + PI / 2))>或==或< 0 如果我必须执行acos功能,我不妨只做十字产品并找到幅度。
是否有已知的比率或步骤可以添加到余弦值以获得其相关的正弦值?
答案 0 :(得分:1)
对于每个可能的余弦,如果相应的角度不受限制,则两个符号都可以正弦。
如果你知道角度在[0,pi]
之间,那么正弦必须为正或零。
如果您想知道平行四边形的区域,请始终选择正分支sin(x) = sqrt(1 - cos(x)^2)
。负区域很少有意义(仅用于定义w.r.t.到平面的方向,例如背面剔除)
如果您有两个向量,请直接使用叉积或点积,而不是另一个并转换。
答案 1 :(得分:0)
对我而言,似乎是一种获取atan2
身份的复杂方式:
d = · = ||||cosθ
c = |×| = ||||sinθ (with 0° < θ < 180°)
tanθ = · / |×|
θ = atan2(c·sgn(c|z), d) (= four quadrant)
其中sgn(c|z)
是c中z分量的符号(除非两者都与xz或yz平面完全平行,然后分别是y分量和x分量的符号)。
现在,从基本的三角形身份,
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²)
答案 2 :(得分:-2)
我想我找到了解决方案。
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)