Foros - Stratos
Programadores => Código de la Semana => Mensaje iniciado por: ethernet en 24 de Marzo de 2003, 12:02:53 AM
Este es un código en apariencia sencillo, pero muy util. Es una función
que sirve para realizar incrementos a una variable que almacena un
ángulo. Se establecen dos topes para los valores válidos de ese ángulo,
de tal manera que nunca podrá ser menor que un mínimo ni mayor que un
máximo establecido.
El código es muy versatil, ya que no funciona restringiendo los valores
de ángulos no válidos, sino comprobando el valor original y el valor
después del incremento.
Por ejemplo, poniendo un valor mínimo de -1 y un valor máximo de 1, el
ángulo solo tendrá un arco de giro de 2 grados; pero poniendo los
límites a la inversa, mínimo 1 y máximo -1, el arco de giro será de 358
grados.
Un ejemplo típico de su uso es el de la cámara de un FPS, donde el giro
en el eje X está limitado a -90º (mirar hacia abajo) y 90º (mirar hacia
arriba).
Parece una tonteria de función, pero tiene su cosa para que funcione con
CUALQUIER límite de ángulos. Por lo menos yo me estuve machacando la
cabeza muchas horas hasta que conseguí esta solución tan sencilla. Si a
alguien le parece que sobra algo o que falta algo que lo diga en voz alta....
un saludo
fiero
//Devuelve un valor entre -180.0 y 180.0
float negAng(float angulo)
{
angulo=fmod(angulo,360);
if(angulo>180) angulo-=360;
if(angulo<-180) angulo+=360;
return(angulo);
}
//Devuelve un valor entre 0.0 y 360.0
float posAng(float angulo)
{
angulo=fmod(angulo,360);
if(angulo<0) angulo+=360;
return(angulo);
}
//Suma un incremento a un angulo y devuelve un valor entre 0.0 y 360.0
//dentro de los límites
bool sumarAngulo(float *angulo,float incremento,float topemin,float topemax)
{
bool encontradoTope=0
float ang,topeMAX,topeMIN;
topeMAX=negAng(topemax);
topeMIN=negAng(topemin);
ang=negAng(*angulo);
if(incremento>0)
{
if(ang>topeMAX) ang-=360;
ang+=incremento;
if(ang>topeMAX)
{
ang=topemax;
encontradoTope=1;
}
*angulo=posAng(ang);
}
else if(incremento<0)
{
if(ang<topeMIN) ang+=360;
ang+=incremento;
if(ang<topeMIN)
{
ang=topemin;
encontradoTope=1;
}
*angulo=posAng(ang);
}
return encontradoTope;
}
//Ejemplo de uso
float rotacionCamaraX=0;
float limiteAbajo=-50;
float limiteArriba=60;
sumarAngulo(&rotacionCamaraX,-10,limiteAbajo,limiteArriba);
Éste código fue enviado por fiero
Si quieres enviar tu propio código hazlo a eth_cotd@lycos.es
No teneis cama? xDD