2013-12-22 28 views
1

我遇到了一些关于角度的问题。我有一个角度A和另一个角度B,我想动画A最短的方式,以便它达到B.对我来说,第一个困惑是角度从0到180,从0到-180。不确定这是什么优点。无论如何,我会给出例如:添加或减去一个角度达到一个角度的最短路径

float a = -35; 
float b = 90; 

每次更新我想要么加1或减一个1度,直到它到达B,我想确保它去最近的路。

这是我的代码,这似乎是工作。但它看起来效率不高:

b += 360; 
if (b > a) { 
    if (b - a < 180) { 
     a += 1; 
    } else { 
     a -= 1; 
    } 
} else { 
    if (a - b < 180) { 
     a -= 1; 
    } else { 
     a += 1; 
    } 
} 

有没有更好/更简单的方法来做到这一点?

+0

为什么你不包含这个必须驻留的循环,所以我们有一个完整的工作示例来玩。 –

+2

使用模运算。并且在循环开始之前计算一次方向,而不是每次迭代。 –

+0

@OliCharlesworth OP使用浮点数,所以模算术不是一个明显的选项。 –

回答

3

所以你想要从ab的最短路线。

因为我们正在寻找一个差异让减:

float d = a-b; 

如果结果的值大于180,然后我们要减去360

if (d > 180) { 
    d -= 360; 
} else if (d<-180) { 
    d += 360; 
} 

现在d是总距离旅行。您可以将其与0进行比较以查看要走哪条路。你也可以做更好的事情,比如更大的d。例如,以使其始终移动的方式10%(注意,这个系列将永远不会结束,因为它会通过小金额,所以你需要应付那种情况下不断接近):

a += d/10; 

您还需要如果您想要流畅的动画,请考虑帧速率。

如果您将tpf(每帧时间)计算为一秒的浮点部分。

long frameTook = lastFrame - System.currentTimeMillis(); 
long lastFrame = System.currentTimeMillis(); 
float tpf = frameTook/1000; 

你现在可以做一个恒定的动画(其中degreesPerFrame是动画的速度)使用:

float move = degreesPerFrame * tpf; 

检查我们不打算搬过去的目标,如果我们只是在转移到它。

if (move > FastMath.abs(d)) { 
    a = b; 
} else { 
    if (d>0) { 
     a+=move; 
    } else { 
     a-=move; 
    } 
}