Uno de los ejemplos que he estado haciendo en Python para luego convertirlo a gambas, hace uso del operador modulo.
Pero observo que en Python el operador trabaja tambien con número decimales y no solo enteros. ( Esto en parte puede llevar a errores ).
Si en Python hiciera:
Citar:
En el ejemplo se va restando 0.1 y se actualiza el angulo.
Cosa que en gambas no es posible, ya que espera valores enteros.
Así que me fui al método tradicional.. cómo conseguimos el resto en una división.
La ayuda en gambas que no tiene por que corresponderse el operador mod o de resto con el verdadero resto de una división. Vaya!.
Citar:
http://gambaswiki.org/wiki/lang/mod
Como estoy trabajando con grados y ángulos mi idea es que si pasa de los 360º nunca salga de ese valor, 360º.
En Python puedo usar esta función:
def envolver_angulo(angulo):
return abs(angulo % 360)
return abs(angulo % 360)
En gambas lo hice de esta forma:
Para mi sorpresa es que siendo programas casi idénticos el resultado fue distinto en el caso de Gambas.
Llega un momento que angulo se queda en 0.1 y casi cero y el objeto permanece inmóvil, obligándome a usar
una condicional para que cuando el angulo sea 0.1, se asigne a angulo 360.
Public Function WrapAngulo(angulo As Float) As Float
Dim partentera As Integer
partentera = Fix(angulo)
Return Abs(angulo - (partentera \ 360) * 360)
End
......
Public Sub DibujarNave()
'Codigo añadido para solucionar problema cuando el angulo llega a ser = 0.1 grados
If angulo = 0.1 Then angulo = 360
angulo = WrapAngulo(Round(angulo - 0.1, -1))
'angulo = angulo - 0.1
'angulo += 0.1
posicion.X = Cos(Rad(angulo)) * radio
posicion.Y = Sin(Rad(angulo)) * radio
Paint.DrawImage(nave, Lienzo.w / 2 + posicion.x - nave.w \ 2, Lienzo.h / 2 + posicion.y - nave.h \ 2)
End
Dim partentera As Integer
partentera = Fix(angulo)
Return Abs(angulo - (partentera \ 360) * 360)
End
......
Public Sub DibujarNave()
'Codigo añadido para solucionar problema cuando el angulo llega a ser = 0.1 grados
If angulo = 0.1 Then angulo = 360
angulo = WrapAngulo(Round(angulo - 0.1, -1))
'angulo = angulo - 0.1
'angulo += 0.1
posicion.X = Cos(Rad(angulo)) * radio
posicion.Y = Sin(Rad(angulo)) * radio
Paint.DrawImage(nave, Lienzo.w / 2 + posicion.x - nave.w \ 2, Lienzo.h / 2 + posicion.y - nave.h \ 2)
End
Ejemplo de un funcionamiento normal: La nave va girando.
Pero si no controlo con una condicional que llegue a 0 y el problema al usar un valor absoluto ocurre esto:
Y de ahí no pasa sin la condicional añadida.
Si tienes un angulo que es 0.1 no tiene parte entera por lo tanto:
Citar:
"Cero patatero forever!"
Parece que en este ejemplo le interesa que la nave se desplace lentamente.
Saludos