2014-12-05 4 views
1

Мне нужно получить кратчайшее направление между двумя углами. Например, если Ang1 равен 5, а Ang2 - 355, то я хочу, чтобы он вернулся, мне нужно вычесть Ang1 для перехода на Ang2.Получение кратчайшего угла пути

У меня есть код, который скажет мне кратчайшее расстояние, но не кратчайшее направление.

функция getShortAngle (a1, a2)

{ 
var angle = (Math.abs(a1 - a2))%360; 


if(angle > 180) 

    angle = 360 - angle; 

return angle; 
}; 

trace(getShortAngle(360, 720)); 

Или в SmallBASIC:

Sub GetShortestpath 
angle = Math.Remainder((Math.abs(a1 - a2)),360) 
if angle > 180 Then 
angle = 360 - angle 
EndIf 
Return = angle 
EndSub 

Спасибо за любую помощь!

ответ

1

Несомненно, это просто настройка направления, на основе которого вы выбираете.

Если вы работаете вне угла/направления от a1 к a2, следующий псевдокод должен дать вам то, что вам нужно:

# precondition: [a1,a2] >= 0 
angle = ((a2 % 360) - (a1 % 360) + 360) % 360 
direction = CLOCKWISE 
if angle > 180: 
    angle = 360 - angle 
    direction = ANTICLOCKWISE 

В тех случаях, когда разница составляет точно 180 °, он предпочитает направление по часовой стрелке.

Прощайте сложное выражение, получая угол, это просто для того, чтобы вы получили значение от 0 до 359 независимо от относительных положений и операций вашего оператора с модулем с отрицательными номерами.

Вы можете greately упростить, если вы сделаете предпосылкой более ограничительный характер, обеспечивая a1 и a2 ограничены диапазоном 0..359:

# precondition: 0 <= [a1,a2] <= 359 
angle = (a2 - a1 + 360) % 360 
+0

Это должно сделать это! Благодаря! – Zock77

Смежные вопросы