Autor Tema: Sugerencia para get_angle() y fget_angle()  (Leído 4645 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Conectado Erkosone

  • Hero Member
  • *****
  • Mensajes: 851
  • Karma: 51
    • Ver Perfil
Sugerencia para get_angle() y fget_angle()
« en: Febrero 05, 2013, 10:17:07 pm »
Hola buenas, tengo una sugerencia que creo que va a ayudar bastante a todos, la comento por que me parece que es algo bastante útil en todos los casos.


Actualmente en bennuGD como era en Div y Div2 las funciones que devuelven un angulo expresan su resultado en 2 rangos posibles:
de 0 a 260 grados "escalados claro.."
y
de 0 a -90 grados "también escalados".


El caso es que para cualquier operación de física básica es necesario disponer de un angulo de 0 a 360 grados "escalado también por supuesto".


Y la sugerencia es esta, que las funciones fget_angle() y get_angle() retornen valores siempre positivos, esto ayuda mucho en los cálculos cuando estamos haciendo juegos, en mi caso estoy liado con la mod_chipmunk y las explosiones, y lo que me sucede es que tengo que hacer una conversión del valor que me retornan estas funciones "si el angulo es negativo" y bueno.. no es que sea demasiado trabajo hacerlo.. pero claro.. uno piensa y ve que si esto lo hiciera directamente bennu pues es trabajo que nos ahorramos.




Yo lo hago así, si se pudiera incluir en las funciones sería de gran ayuda:



angulo_explosion_ = fget_angle(id_.x, id_.y, x, y);
if(angulo_explosion_ < 0)
   angulo_explosion_ = (90000 - angulo_explosion_*-1) + 260000;
end




La formula para retornar siempre grados positivos es:
Si el valor es positivo no se hace nada..
Si el valor es negativo entonces se hace esto:  angulo_positivo_resultante_de_un_angulo_negativo = (90000 - angulo_ * -1) + 260000;

Desconectado SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12457
  • Karma: 367
  • Sexo: Masculino
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #1 en: Febrero 05, 2013, 10:49:01 pm »
como es eso que retornan de -90 a 260?

nunca me di cuenta de eso...

por otro lado, no se porque complicas la formula...

por que haces -angulo*-1? si angulo es < 0 entonces simplemente has +angulo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Conectado Erkosone

  • Hero Member
  • *****
  • Mensajes: 851
  • Karma: 51
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #2 en: Febrero 05, 2013, 10:51:24 pm »
nop, eso fue lo primero que probé pero no funciona bien, por que no es un angulo del primer cuadrante, es del cuarto..
Es algo bien curioso jeje.. pruebalo y me cuentas, intenta hacer que un proceso rebote al colisionar con otro.. verás el problema con esto claramente ;)
« última modificación: Febrero 05, 2013, 10:54:48 pm por Erkosone »

Desconectado SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12457
  • Karma: 367
  • Sexo: Masculino
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #3 en: Febrero 05, 2013, 11:03:26 pm »
a ver... yo digo esto

angulo_explosion_ = 90000 + angulo_explosion + 260000;

bueno, mas bien digo

angulo_explosion_ = 350000 + angulo_explosion_;

pero vamos que eso tampoco esta bien... ya que te estan faltando 10 grados

la cosa es

if ( angulo_explosion_ < 0 ) angulo_explosion_ += 360000; end

eso es lo que va...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Desconectado SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12457
  • Karma: 367
  • Sexo: Masculino
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #4 en: Febrero 05, 2013, 11:05:01 pm »
explicacion matematica


angulo es negativo, tu restas... entonces:

- * - = +

y luego lo multiplicas por -1, con lo que vuelves a cambiar el signo al original... resumiendo, el - de la resta con el *-1 de la multiplicacion se cancelan a si mismos, y te queda +
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Conectado Erkosone

  • Hero Member
  • *****
  • Mensajes: 851
  • Karma: 51
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #5 en: Febrero 05, 2013, 11:12:58 pm »
Pues parece lógico jeje.. aveces me complico yo solo haciendo pruebas  :-[
La sugerencia sigue en pie, si crees que merece la pena que retorne angulos de entre 0 y 360000 por mi encantado ya que ese if no haría falta ;)

Desconectado SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12457
  • Karma: 367
  • Sexo: Masculino
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #6 en: Febrero 06, 2013, 06:48:47 am »
el problema es que para calculos donde necesitas saber el angulo mas cercano, haciendo un abs del angulo, se va a perder esa posibilidad

lo que me extraña es que retorne de -90 a 270...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Desconectado Arcontus

  • Full Member
  • ***
  • Mensajes: 173
  • Karma: 6
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #7 en: Marzo 02, 2013, 02:53:03 am »
La verdad es que a veces dificulta la programación, bueno a veces no, bastantes veces.

Creo que es una genial idea.


Desconectado Kloppix

  • Full Member
  • ***
  • Mensajes: 241
  • Karma: 14
  • Sexo: Masculino
    • Ver Perfil
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #8 en: Marzo 03, 2013, 09:44:02 am »
Para mantener los ángulos negativos o mayores a 360º en el rango 0-360000 lo que yo hice fué:

  #Define to360(numero) ((360000 + numero%360000)%360000);

con el caso de get_angle sería entonces usar algo como:

  direccion=to360(get_angle(id_otroProceso));

Ahora supongamos que tenemos un proceso con angulo variable y queremos saber el ángulo entre un segundo proceso y el ángulo que ya tiene el proceso principal. Por ejemplo una nave que puede rotar y que tiene un poder que dispara automaticamente a un enemigo.

direccion=to360(get_angle(id_otroProceso)-angle);

Desconectado Drumpi

  • Hero Member
  • *****
  • Mensajes: 6084
  • Karma: 156
  • Sexo: Masculino
  • Odio el periodo "entre proyectos"
    • Ver Perfil
    • La web de Drumpi
Re:Sugerencia para get_angle() y fget_angle()
« Respuesta #9 en: Mayo 11, 2013, 08:51:56 am »
Sé que esto es antiguo, pero...
Creo que lo de tener ángulos negativos tiene que ver con las comparaciones. Un ángulo de 300º es mayor que 0º, mientras que uno de -30º es menor que uno de 0º. Es más, parece que lo más correcto sería tener ángulos desde -179999 hasta 180000.

Pero bueno, es un poco divagar. Hasta las calculadoras científicas tienen problemas con esto. Y es que trabajar con ángulos es muy peliagudo, porque no estamos en un espacio lineal, sino circular, y te pongas como te pongas, problemas cón ángulos vas a tener siempre.
Intenta implementar un contador de vueltas usando el ratón respecto al centro de la pantalla, pero en el que no se pueda hacer trampas y haya que dar la vuelta en un único sentido.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)