Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Operador Modulo
Autor Mensaje
Responder citando   Descargar mensaje 
Mensaje Operador Modulo 
 
Buenas!.

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:

359.9  % 360 daría 359.9


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:

This operator does not evaluate the true mathematic modulo


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)
 


En gambas lo hice de esta forma:

Public Function WrapAngulo(angulo As Float) As Float
  
  Dim partentera As Integer
  
  partentera = Fix(angulo)  
  
  Return Abs(angulo - (partentera \ 360) * 360)
  
End
 


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
 


Ejemplo de un funcionamiento normal: La nave va girando.

 naverotandomostrandogrados

Pero si no controlo con una condicional que llegue a 0 y el problema al usar un valor absoluto ocurre esto:

 problemaconelrestoyvalorabsoluto

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:

Abs(angulo - (partentera \ 360) * 360)


"Cero patatero forever!"

Parece que en este ejemplo le interesa que la nave se desplace lentamente.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Modulo De Clase Y Modulo Estandar Shell General 5 Martes, 28 May 2013, 12:56 Ver último mensaje
jsbsan
No hay nuevos mensajes El Operador LIKE De SQL jsbsan Bases de Datos 10 Jueves, 12 Febrero 2015, 20:53 Ver último mensaje
jsbsan
No hay nuevos mensajes ¿ Fallo Del Operador Ternario IIF ? Shell General 8 Sabado, 06 Junio 2015, 09:03 Ver último mensaje
Shell
No hay nuevos mensajes A Vueltas Con El Operador Ternario IIF Shell General 9 Miercoles, 02 May 2018, 08:17 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron