我需要用一些数据计算弧长:
-
Start
点坐标(Xs, Ys, Zs) -
End
点坐标(Xe, Ye, Ze) -
Center
点坐标(Xc, Yc, Zc) - 分量为(Xa, Ya, Za)的
Axis
矢量
Arc
从Start
点开始,在End
点结束,其半径等于DistanceBetween(Center, Start)
和DistanceBetween(Center, End)
,其方向由Axis
向量定义。
例子:
<>之前弧{开始{-18.123,-11.805,0},结束{-17.167,-0.553,0},中心{-9.421,-6,877,0},轴{0,0,-1}}之前注意:在这个例子中,圆弧是顺时针方向的
我的问题是:我可以计算大长度或小长度,但我无法根据轴的方向确定好的值。
假设您的数据都是自洽的(中心必须与起点和终点等距,轴应该垂直于包含起点、终点和中心的平面),弧长是角度start -> center -> end乘以半径(从中心到起点的距离,或等价地,从中心到终点的距离)的弧度度量。角度的度量可以通过余弦定律找到:C^2 = A^2 + B^2 - 2AB cos theta
,其中C
是从Start到End的距离,A
是从Center到Start的距离,B
是从Center到End的距离。在这种情况下,公式可以简化为C^2 = 2R^2 - 2R^2 cos theta
,可以解出cos theta
,然后取反余弦得到theta
。
如果我理解正确的话,你已经走了那么远,但问题是cos
的逆通常有两个值,对应于开始和结束之间的短弧和长弧,你不知道该选哪个。
如果你使用库函数arccos
,你会得到逆余弦的主干,它总是给出短角度。你需要另一种方法来确定正确的角度是长还是短。
我推荐的方法是使用叉乘。公式为
a x b = |a| |b| sin(theta) n
其中a
是矢量Start - Center, b
是矢量End - Center
, |a|=|b|=R
, n
是由坐标轴确定的单位矢量。根据余弦定律,你已经有了角度,所以你不需要计算arcsin
;现在你真正感兴趣的是sin(theta)
的符号。如果a x b
和n
在同一方向,sin(theta)>0
和你取由余弦定律决定的短弧。如果a x b
和n
在相反的方向,sin(theta)<0
,并且你取由余弦定律确定的长弧。
你可以通过取a x b
和n
的点积来判断它们是在相同的方向还是相反的方向。如果点积是正的,它们方向相同。