Алло,
У меня проблемы с написанием функции:
float turnToRequestedHeading(float initialHeading, float requiredHeading, float turnRate)
Я продолжаю думать, что должен быть умный способ сделать это, но это ускользает от меня.
Все значения приведены в радианах, заголовки от -PI до + PI, а скорость поворота от -0,5 до + 0,5.
Если requiredHeading меньше, чем turnRate от первоначального заголовка, тогда он должен вернуть требуемый заголовок
В противном случае он должен вернуть initialHeading + или - turnRate, в зависимости от того, что ближе к требуемому заголовку.
Есть идеи? Я застреваю, когда заголовки находятся по обе стороны от прямой, например, -3 и + 3.
ОБНОВЛЕНИЕ: Вот некоторые тестовые коды и тестовые данные (см. Мой ответ для моего кода ниже):
private void turnToRequestedHeadingTest(float initialHeading, float requiredHeading, float turnRate, float expectedResult) {
if (Math.round(turnToRequestedHeading(initialHeading*PIf/180, requiredHeading*PIf/180, turnRate*PIf/180)*180/PIf) != expectedResult) {
/*DEBUG*/Log.i(this.getClass().getName(), "test(initial="+initialHeading+", required="+requiredHeading+", rate="+turnRate+") Expected "+expectedResult+", Returns "+(Math.round(turnToRequestedHeading(initialHeading*PIf/180, requiredHeading*PIf/180, turnRate*PIf/180)*180/PIf)));
}
}
/*DEBUG*/Log.i(this.getClass().getName(), "turnToRequestedHeading tests:");
turnToRequestedHeadingTest( 0, 0, 0, 0);
turnToRequestedHeadingTest( 0, 0, 25, 0);
turnToRequestedHeadingTest( 10, 15, 25, 15);
turnToRequestedHeadingTest( 20, 55, 25, 45);
turnToRequestedHeadingTest( 85, 95, 25, 95);
turnToRequestedHeadingTest( 150,-170, 25, 175);
turnToRequestedHeadingTest( 170, 177, 25, 177);
turnToRequestedHeadingTest( 170,-175, 25,-175);
turnToRequestedHeadingTest( 175,-100, 25,-160);
turnToRequestedHeadingTest( 175, 0, 25, 150);
turnToRequestedHeadingTest( 180, 0, 25, 155);
turnToRequestedHeadingTest(-170,-100, 25,-145);
turnToRequestedHeadingTest(-100, -80, 25, -80);
turnToRequestedHeadingTest( -30, -15, 25, -15);
turnToRequestedHeadingTest( -30, 15, 25, -5);
turnToRequestedHeadingTest( -20, -5, 25, -5);
turnToRequestedHeadingTest( -20, 5, 25, 5);
turnToRequestedHeadingTest( -20, 15, 25, 5);
turnToRequestedHeadingTest( 10, 180, 25, 35);
turnToRequestedHeadingTest( 10,-160, 25, -15);
turnToRequestedHeadingTest( 170, 0, 25, 145);
turnToRequestedHeadingTest( 170, -15, 25,-165);
turnToRequestedHeadingTest(-170, 5, 25,-145);
turnToRequestedHeadingTest( -10, 160, 25, 15);
turnToRequestedHeadingTest( -10,-150, 25, -35);
turnToRequestedHeadingTest( 10,-170, 25, -15);
turnToRequestedHeadingTest( 0, 180, 25, 25);
turnToRequestedHeadingTest( -10, -15, 25, -15);
turnToRequestedHeadingTest( -20, -55, 25, -45);
turnToRequestedHeadingTest( -85, -95, 25, -95);
turnToRequestedHeadingTest(-150, 170, 25,-175);
turnToRequestedHeadingTest(-170,-177, 25,-177);
turnToRequestedHeadingTest(-170, 175, 25, 175);
turnToRequestedHeadingTest(-175, 100, 25, 160);
turnToRequestedHeadingTest(-175, 0, 25,-150);
turnToRequestedHeadingTest( 170, 100, 25, 145);
turnToRequestedHeadingTest( 100, 80, 25, 80);
turnToRequestedHeadingTest( 30, 15, 25, 15);
turnToRequestedHeadingTest( 30, -15, 25, 5);
turnToRequestedHeadingTest( 20, 5, 25, 5);
turnToRequestedHeadingTest( 20, -5, 25, -5);
turnToRequestedHeadingTest( 20, -15, 25, -5);
turnToRequestedHeadingTest( -10,-180, 25, -35);
turnToRequestedHeadingTest( -10, 160, 25, 15);
turnToRequestedHeadingTest(-170, 0, 25,-145);
turnToRequestedHeadingTest(-170, 15, 25, 165);
turnToRequestedHeadingTest( 170, -5, 25, 145);
turnToRequestedHeadingTest( 10,-160, 25, -15);
turnToRequestedHeadingTest( 10, 150, 25, 35);
turnToRequestedHeadingTest( -10, 170, 25, 15);
// More tests
turnToRequestedHeadingTest( 0, 15, 25, 15);
turnToRequestedHeadingTest( 0, 60, 25, 25);
turnToRequestedHeadingTest( 0, -15, 25, -15);
turnToRequestedHeadingTest( 0, -60, 25, -25);
turnToRequestedHeadingTest( 180, 165, 25, 165);
turnToRequestedHeadingTest( 180, 100, 25, 155);
turnToRequestedHeadingTest( 180,-165, 25,-165);
turnToRequestedHeadingTest( 180,-100, 25,-155);
turnToRequestedHeadingTest(-180, 165, 25, 165);
turnToRequestedHeadingTest(-180, 100, 25, 155);
turnToRequestedHeadingTest(-180,-165, 25,-165);
turnToRequestedHeadingTest(-180,-100, 25,-155);
turnToRequestedHeadingTest( 25, 0, 25, 0);
turnToRequestedHeadingTest( 25, -25, 25, 0);
turnToRequestedHeadingTest( -25, 0, 25, 0);
turnToRequestedHeadingTest( -25, 25, 25, 0);
turnToRequestedHeadingTest( 155, 180, 25, 180);
turnToRequestedHeadingTest( 155,-155, 25, 180);
turnToRequestedHeadingTest(-155, 180, 25,-180);
turnToRequestedHeadingTest(-155, 155, 25,-180);
turnToRequestedHeadingTest( 155,-180, 25,-180);
turnToRequestedHeadingTest(-155,-180, 25,-180);
Я думаю, что мои тестовые данные теперь охватывают все случаи ...
-Frink