Ferramentas de Usuário

Ferramentas de Site


dev_geral:java:robocode:normalizar

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 manda-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 com 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 noticia: o pacote robocode.utils já trás 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));
}
Tópico de discussão no fórum: Normalizar ângulos
dev_geral/java/robocode/normalizar.txt · Última modificação em: 2018/05/14 21:37 (edição externa)