我想在3D游戏中记录角度移动的速度。 所以我们有X轴,我们在没有边界的情况下从0-360移动,当我们在359时进一步移动我们再次击中0。
游戏将0-360存储在-180-180而不是0-360 为了计算速度,我必须记录两个阶段并比较它与时间的差异,以获得移动速度。
但我如何得到差异呢? 与80-120的差值是= 40我们可以通过减去它们来计算。 但是从-175到175的差异是= 10,但我该如何计算呢?因为减去它们会给-180,但差别实际上是10。
答案 0 :(得分:0)
只需为每个值添加180,然后取差值的绝对值。
Dim delta = Math.Abs((180 + final) - (180 + initial))
编辑:不确定您是否总是想要正值,并且您想要区分方向,例如如果一个方向上的运动是270度,那么实际上是另一个方向上的90度。我认为你实际上需要更清楚地定义问题,因为它现在可以解释了。
答案 1 :(得分:0)
一种方法是使用一点三角法。我不完全确定VB的做法是什么,所以我只使用伪代码。如果您假设a1=175
和a2=-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)
angle1
和angle2
在-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