Ir para o conteúdo

Normalização de Ângulos

Normalizar um ângulo significa assim em termos grosseiros, substituir um ângulo por outro 'equivalente' que esteja dentro de limites predefinidos. Por exemplo, 0º, em termos prácticos é o mesmo que 360º ou 720º.

Se quisermos virar o nosso robot, por exemplo, para oeste podemos mandá-lo virar para a direita segundo um angulo de 270-orientação do nosso robot, (oeste corresponde a 270º). Se o nosso robot estiver virado, por exemplo, para os 5º, então vai rodar: 265º para a direita. Isto funciona, mas seria melhor se ele rodasse 95º para a esquerda, poupava-se muito mais tempo. A forma mais facil de conseguir isto é trabalhar com ângulos normalizados entre -180º e 180º em vez de 0-360º. Desta forma evitam-se rotações superiores a 180º.

Olhando para o código-fonte do robot sample.tracker que é distribuido juntamente com o robocode, podem ver uma função que faz exactamente isso:

public double normalRelativeAngle(double angle) {
        if (angle > -180 && angle <= 180) {
            return angle;
        }
        double fixedAngle = angle;

        while (fixedAngle <= -180) {
            fixedAngle += 360;
        }
        while (fixedAngle > 180) {
            fixedAngle -= 360;
        }
        return fixedAngle;
    }

Para quem prefere trabalhar em radianos há uma boa notícia: o pacote robocode.utils já traz uma função de normalização de ângulos.

Utils.normalRelativeAngle(double angle)

Recorrendo a esta função, facilmente se implementa uma função análoga que receba argumentos em graus, bastando para isso reduzir o ângulo normalizado:

public double normalRelativeAngle2(double angle){
      return Math.toDegrees(Utils.normalRelativeAngle(angle));
}