2

叉积的大小描述了由用于构建叉积的两个向量 (u, v) 描述的平行四边形的有符号面积,它有其用途。这个相同的幅度可以计算为 u 的幅度乘以 v 的幅度乘以 u 和 v 之间的角度的正弦值:||u||||v||sin(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) 我的意思是点产品不是角度。

但是伴随符号计算 (+/-) 需要 theta 作为角度: (cos(theta + PI / 2)) > or == or < 0 如果我必须执行 acos 函数,我不妨只做叉积并找到大小。

是否存在可以添加到余弦值以获得其相关正弦值的已知比率或步长?

4

3 回答 3

1

对于每个可能的余弦,如果相应的角度不受限制,则正弦的两个符号都是可能的。

如果您知道角度介于 之间[0,pi],则正弦必须为正或零。

如果你想知道平行四边形的面积,总是取正分支sin(x) = sqrt(1 - cos(x)^2)。负区域很少有意义(仅用于定义平面的方向,例如用于背面剔除)

如果您有两个向量,请直接使用叉积或点积,而不是另一个并转换。

于 2012-10-15T21:15:46.403 回答
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²)
于 2012-10-16T13:50:40.143 回答
-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)
于 2012-10-16T00:25:12.583 回答