计算两个角度差(3d游戏)

时间:2014-02-28 03:27:07

标签: vb.net math geometry angle

我想在3D游戏中记录角度移动的速度。 所以我们有X轴,我们在没有边界的情况下从0-360移动,当我们在359时进一步移动我们再次击中0。

游戏将0-360存储在-180-180而不是0-360 为了计算速度,我必须记录两个阶段并比较它与时间的差异,以获得移动速度。

但我如何得到差异呢? 与80-120的差值是= 40我们可以通过减去它们来计算。 但是从-175到175的差异是= 10,但我该如何计算呢?因为减去它们会给-180,但差别实际上是10。

4 个答案:

答案 0 :(得分:0)

只需为每个值添加180,然后取差值的绝对值。

Dim delta = Math.Abs((180 + final) - (180 + initial))

编辑:不确定您是否总是想要正值,并且您想要区分方向,例如如果一个方向上的运动是270度,那么实际上是另一个方向上的90度。我认为你实际上需要更清楚地定义问题,因为它现在可以解释了。

答案 1 :(得分:0)

一种方法是使用一点三角法。我不完全确定VB的做法是什么,所以我只使用伪代码。如果您假设a1=175a2=-175,这应该有用。

θ1 ← a1 * π / 180
θ2 ← a2 * π / 180
δ ← acos( cos(θ1)*cos(θ2) + sin(θ1)*sin(θ2) ) * 180 / π

如果你反对使用三角法,你可以改用一些条件

if a1 < 0 then
    θ1 ← 360 - ((-a1) mod 360)
else
    θ1 ← a1 mod 360

if a2 < 0 then
    θ2 ← 360 - ((-a2) mod 360)
else
    θ2 ← a2 mod 360

δ ← ( MAX(θ1, θ2) - MIN(θ1, θ2) ) mod 360
if δ > 180 then
    δ ← 360 - δ

这两个角都将返回δ两个角度之间的最小角度(即它将在​​[0, 180]范围内)。使用第二种方法可能会获得更好的性能,尽管可能还需要检查一些边缘情况。

答案 2 :(得分:0)

angle1angle2-179...180范围内,差异应该返回数字中绝对值最小的

(angle2-angle1)+k*360

其中k随整数变化。所以差异(175 - ( - 175))= 350其他一些相关的候选人是-730,-370,-10,710。显然,追求的结果将是-10。

第一项的差异范围一般是-359 ... 359,所以为了得到没有符号不确定性的结果,在第一步中加上360 + 180 = 540并计算现在保证的正余数mod 360

diff = (angle2-angle1+540) mod 360

插入的360在mod操作下取消,180给出了+1的移位,必须在最终结果中移除

diff = diff - 180
根据需要,

现在在-180 ...... 180范围内。


在示例中,计算为

diff = (175-(-175)+540) % 360 - 180
     =  890 % 360 -180
     =  170 - 180
     =  -10

根据需要。

反过来说,交换175和-175,

diff = (-175-175+540) % 360 - 180
     = (-350+540) % 360 - 180
     = 190 % 360 - 180
     = 190 - 180
     = 10

答案 3 :(得分:0)

我做了一个解决方案:

Private Function Calcdif(ByVal firstAngle As Single, ByVal secondAngle As Single) As Single
    Dim difference As Single = secondAngle - firstAngle
    Select Case difference
        Case Is < -180
            difference += 360
        Case Is > 180
            difference -= 360
    End Select
    If secondAngle = firstAngle Then
        Return 0
    Else
        Return (Math.Abs(difference))
    End If
    End
End Function