elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Necesito una mano para calcular distancias XY
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Necesito una mano para calcular distancias XY  (Leído 6,789 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Necesito una mano para calcular distancias XY
« Respuesta #10 en: 23 Octubre 2016, 21:38 pm »

no está en sexagesimale, sino en radian XD casualmente media vuelta era 3.1416 grados cuando un circulo tiene incluso 2 pi de perimetro jejeje

hombre te has dado cuenta de detalles base de la ciencia rapido jejeje, en poco seguro das con turing u otro teorema de otra ciencia XD

exito con el programa ;)

Eaaa!! tienes razón, no sabía eso, por eso cuando dejaba funcionando la animación, despues de un minuto aprox la imagen de la nave se desfasaba un poco con respecto al planeta y daba la impresión que la nave se acostaba sobre el planeta en ves de estar de pie xD, me dije... creo que es un poco mas que 3.1 , despues leí tu post y bingo! era PI xD, asi que he modificado el script reemplazando 3.1 por pi y funciona mucho mejor:

Código
  1. Float alpha = -(((( ((Double)Math.PI).floatValue() * 2.0F) * angle_percent) / 100.0F) - ((Double)Math.PI).floatValue());

Como pi no es perfecto supongo que si dejo la animación varios dias temrinaré con la nave desfasada con respecto al planeta, eso pasó porque comenté la línea que hacia módulo de 360 para que despues de 360 vuelva a cero, pero da problemas cuando necesito invertir el valor (para hacer que gire en sentido contrario), pero ese es un problema mucho menor y solucionable.

Lo que haré para prevenir el desface es descomentar la función de módulo para que solo funcione entre 0 y 360 y buscar otro alternativo para invertir los valores dependiendo de la orientación.

Muchas gracias otraves :)


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Necesito una mano para calcular distancias XY
« Respuesta #11 en: 23 Octubre 2016, 21:45 pm »

usa un if para volver alfa a 0 si alfa mayor que PI, así el defecto como mucho será un salto de (suponiendo pi a 3.1400000) 0.0016... cosa que es imperceptible :P y no acumulativo (porque alfa vuelve a 0)



En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Necesito una mano para calcular distancias XY
« Respuesta #12 en: 23 Octubre 2016, 22:00 pm »

Asi es, tienes razón, el valor modular en ambos sentidos siempre es el mismo porque el resto es igual con valor negativo y valor positivo.

Código
  1.            // CW o CCW
  2.            if(clock_wise) {
  3.                this.angle += (diff_millisecond / 10);
  4.                if(this.angle > 360)
  5.                    this.angle = 0.0F;
  6.            }else{
  7.                this.angle -= (diff_millisecond / 10);
  8.                if(this.angle < 0)
  9.                    this.angle = 360.0F;
  10.            }
  11.  
  12.            // El valor modular es el mismo en ambos sentidos asi que deja de funcionar
  13.            // el sentido de rotación dinámico
  14.            // this.angle = (this.angle % 360);

Me di cuenta que también tendré que agregar la diferencia, por ejemplo si de 359 pasa a 361 entonces el grado debe quedar en 1 y no en 0 jajaja

Código
  1.            // CW o CCW
  2.            if(clock_wise) {
  3.                this.angle += (diff_millisecond / 10);
  4.                if(this.angle >= 360)
  5.                    this.angle = 0.0F + (this.angle - 360);
  6.            }else{
  7.                this.angle -= (diff_millisecond / 10);
  8.                if(this.angle <= 0)
  9.                    this.angle = 360.0F + this.angle;
  10.            }
  11.  
  12.            // El valor modular es el mismo en ambos sentidos asi que deja de funcionar
  13.            // el sentido de rotación dinámico
  14.            // this.angle = (this.angle % 360);

Si el grado es 365 entonces queda en 0 + (365 - 360) = 5 grados, el problema es cuando la cantidad de grados ha aumentado mas de una vuelta completa en un lagg, por ejemplo que de 1 grado haya llegado a 800, entonces: 0+(800-360)=440 entonces debo volver a disminuir el valor, en ese caso podría utilizar un resto o el módulo y vuelvo al mismo problema xD, creo que usar condicionales no era una buena opción a menos que use un while para recorrer todas las posibles disminuciones y el uso de CPU se va a elevar considerablemente cuando tenga muchos objetos, asi que trataré de pensar como voltear el valor aun usando módulo.

Saludos.
« Última modificación: 23 Octubre 2016, 22:08 pm por WHK » En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Necesito una mano para calcular distancias XY
« Respuesta #13 en: 23 Octubre 2016, 22:14 pm »

Listo, ahora si quedó bien:

Código
  1.            // CW o CCW
  2.            if(clock_wise) {
  3.                this.angle += (diff_millisecond / 10);
  4.                 if(this.angle >= 360)
  5.                     this.angle = 0.0F + (this.angle % 360);
  6.            }else{
  7.                this.angle -= (diff_millisecond / 10);
  8.                if(this.angle <= 0)
  9.                     this.angle = 360.0F + (this.angle % 360);
  10.            }

He usado el módulo a modo de diferencia sobre el calculo real basado en condicionales, de esa manera puedo invertir el valor de la rotación sin tener el problema del desface ni desbordamiendo numérico :D

Acá va el código completo de la función de rotación:

Código
  1.    /**
  2.      * Actualiza la posición de los objetos
  3.      */
  4.    @Override
  5.    public synchronized void update() {
  6.        super.update();
  7.  
  8.        /**
  9.          * Control de frames.
  10.          * Controla los frames dependiendo del tiempo transcurrido,
  11.          * esto prefieve en desface por lagg.
  12.          */
  13.        if (last_millisecond == null) {
  14.            this.last_millisecond = Calendar.getInstance().getTimeInMillis();
  15.        }
  16.  
  17.        Long current_millisecond = Calendar.getInstance().getTimeInMillis();
  18.        Long diff_millisecond = current_millisecond - this.last_millisecond;
  19.        this.last_millisecond = current_millisecond;
  20.  
  21.  
  22.        /**
  23.          * Contexto.
  24.          * Calcula el grado de inclinación de los objetos y todo aquello
  25.          * que sea necesario para calcular distancias y posicionamiento.
  26.          */
  27.        if(!this.launched) {
  28.            // CW o CCW
  29.            if(clock_wise) {
  30.                this.angle += (diff_millisecond / 10);
  31.  
  32.                // Previene el desbordamiento (solo de 0 a 360)
  33.                if(this.angle >= 360)
  34.                    this.angle = 0.0F + (this.angle % 360);
  35.            }else{
  36.                this.angle -= (diff_millisecond / 10);
  37.  
  38.                // Previene el desbordamiento (solo de 360 a 0)
  39.                if(this.angle <= 0)
  40.                    this.angle = 360.0F + (this.angle % 360);
  41.            }
  42.  
  43.            // El valor modular es el mismo en ambos sentidos asi que deja de funcionar
  44.            // el sentido de rotación dinámico
  45.            // this.angle = (this.angle % 360);
  46.  
  47.        }else{
  48.            this.diameter_rotation_ship = this.diameter_rotation_ship + (diff_millisecond / 12);
  49.        }
  50.  
  51.  
  52.        /**
  53.          * Controlador.
  54.          * Controla el posicionamiento de los objetos para ser dibujado.
  55.          */
  56.  
  57.        // Cambia el tamaño
  58.        this.matrix.setScale(1, 1);
  59.  
  60.        // Rota la imagen a partir de su centro y base inferior vertical
  61.        this.matrix.postRotate(this.angle, this.image.getWidth() / 2, this.image.getHeight());
  62.  
  63.        // % del angulo de 0 a 360
  64.        Float angle_percent = ((this.angle * 100.0F) / 360);
  65.  
  66.        // -3.1415 a 3.1415 (-pi a pi)
  67.        // PI es la posición de grado 0 de inclinación y -PI es 360 grados, por lo cual 0 es 180 grados
  68.        // comenzando desde el punto superior vertical y centro horizontal.
  69.        // Calcula el porcentaje entre -pi y pi, en ves de esto se usa pi*2 y luego se resta pi.
  70.        Float alpha = -(((( ((Double)Math.PI).floatValue() * 2.0F) * angle_percent) / 100.0F) - ((Double)Math.PI).floatValue());
  71.  
  72.        // Añadidura de espacio en dirección hacia el grado de rotación del circulo principal
  73.        Float horizontal_padding = ((Double)Math.sin(alpha)).floatValue();
  74.        Float vertical_padding = ((Double)Math.cos(alpha)).floatValue();
  75.  
  76.        // Cantidad de espacio añadido (desde el centro hacia el borde del circulo principal,
  77.        // es la mitad del diametro o su radio)
  78.        horizontal_padding *= (this.start_circle.getWidth() / 2);
  79.        vertical_padding *= (this.start_circle.getHeight() / 2);
  80.  
  81.        // Posiciona el objeto al centro del circulo
  82.        this.matrix.postTranslate(
  83.                this.start_circle.getLeft() + (this.start_circle.getWidth() / 2) - (this.image.getWidth() / 2) + horizontal_padding,
  84.                this.start_circle.getTop() + (this.start_circle.getHeight() / 2) - this.image.getHeight() + vertical_padding
  85.        );
  86.    }
« Última modificación: 23 Octubre 2016, 23:01 pm por WHK » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines