[Matemáticas] Direcciones de giro con angulos.

bLaKnI

Buenas gente!
Vereis, tengo un problemilla que no se como cojones resolver.
Estoy programando una aplicación en la que girando a izquierda o derecha una determinada "ruedecilla", las imagenes de un directorio deben avanzar o retroceder en función de la dirección del giro.
Es decir, se carga el programa y se muestra la primera imagen. Giro un cuarto (o lo que sea) y se muestra la siguiente imagen. Otro trozo a la derecha y la siguiente imagen y visceversa, si la giro hacia la izquierda, se muestra la imagen anterior a la actual.
Ademas, esto no es importante, pero si se llega a la ultima se muestra la primera y lo mismo con la primera si se gira hacia la izquierda, que se muestra la ultima.

Bien, el tema es que dicha rueda, da valores entre 0 y 2PI, así que suponiendo que la rueda esta a 0, si la giro media vuelta hacia la derecha me da 3.14 y si la giro media vuelta mas a la derecha, da 6.28, pero si giro un poquito mas a la derecha, ya da 0 con algo, osea que no son valores acumulativos.

Necesito encontrar una forma de dictaminar si estoy girando hacia la derecha o hacia la izquierda!.
Si guardo un angulo anterior y uno actual y los comparo, puedo establecer que si el actual es mas pequeño que el anterior, he girado hacia la izquierda, y si el actual es mas grande que el anterior, he girado la rueda a la derecha.
El problema viene cuando resulta que el anterior es, por ejemplo 6.veintipoco, y el actual ya es 0 con algo, que aquí, resulta que el actual es mas pequeño que el anterior y el algoritmo comparativo contemplaria el caso de haber girado a la izquierda.
Esto crea un lio de la ostia con las imagenes que se muestran porque se pierde el orden momentaniamente.

Podria intentar hacer un liillo de condicionales y tal, pero no acudo aquí por eso.
Acudo, porque me gustaria saber si exsiste alguna forma de dictaminar la direccion de giro matemáticamente.

Mediante dos vectores, es posible conocer el angulo entre ellos y la direccion de giro de los vectores, por medio de producto vectorial y el aCos o aTan2, pero en este caso, no dispongo de vectores.
Es solamente algo que dice, rota tanto, rota tanto ahora, rota tanto esta vez y así continuamente...

Me hechais una manita pliz!?

Gracias nenes! :)

Light.

c0c0l0c0

No tiene sentido quere saber hacia donde ha girado conociendo solo dos angulos

MTX_Anubis

Lo llevas jodido. Si únicamente te devuelve el ángulo es imposible saber hacia donde gira.

Si estás en pi/4 y pasas pi/2 dime tú como sabes que has llegado a ese pi/2 yendo hacia la derecha o hacia la izquierda.

Hrym

En qué lenguaje programas? Has mirado si puedes usar radianes en vez de grados a la hora de calcular el angulo?

elkaoD

#3, viendo el ángulo menor? xD

MTX_Anubis

#4 Que yo sepa el programa se lo está devolviendo en radianes xD

#5 ein? Si yo puedo llegar a un ángulo en dos direcciones y el programa sólo me devuelve el valor del ángulo, no puedes saber en qué dirección ha llegado xD

Se podría hacer si tomara como ángulo el giro de la rudeda y no hacia dónde apunta ésta sobre un eje.

Supongamos que estamos en PI/2, 90º, si lo muevo hasta 180º, es imposible saber si he llegado ahí por la izquierda o por la derecha. Simplemente devolvería un 180º.

Claro, si yendo por la izquierda devolviera 270º y yendo por la derecha 90º entonces sería fácil hacerlo.

bLaKnI

Ahí está!
Anubis me ha entendido a la perfección!

Entonces podriamos hacer algo alternativo? Por ejemplo, se el punto en el que esta centrada la rueda. Es decir, su X,Y.

Si de alguna forma pudiera establecer con el angulo anterior un punto en la direccion del angulo, y a su vez con el angulo actual, una nueva dirección, entonces podria utilizar aTangente para los vectores que se definirian, no?

Ostia me tiene en ascuas esto...

B

Como diria mi prifesor de Fisica eso se hace con la regla del sacacorchos sin duda

bLaKnI

La de los 3 dedos? xD
No me sirve.

AzAzOtH

EDIT: lo he pensado mejor, y el que lo sepas de forma trigonométrica no te va a resolver el problema de que sepas en que sentido se ha hecho el giro, ya que puedes saber las coordenadas iniciales y finales, pero aún así vas a pode rformar dos posibles ángulos, y vas a seguir sin saber en qué sentido has girado.

iru_tx

0.67º

la regla del sacacorchos no es como el MO CA CO?

bLaKnI

#11 flameo fino! ;)

#10 y como coño lo podemos saber!? xD
Que dolor de cabeza me entra... :(

AzAzOtH

Puedes describir todos los datos que puedes conocer? Lo mismo hay algo q se nos esta escapando xD, con los datos que has dado yo te diría que esimposible (pero yo puedo estar equivocado perfectamente, claro)

borisuco

Necesitas saber un ángulo entre el inicial y el final. Por huevos.

Sí sólo tienes el inicial y el final, vas a tener una varación, pero no vas a saber por donde se ha llegado a eso.

O bien un ángulo en medio, o bien haces que sea acumulativo, es decir, qen vez de ir de 0 a 2PI, vaya de 0 a 2nPI (n € |K)

Guybrush_

¿Tienes alguna forma de detectar el "reseteo" del valor del ángulo? Es decir, ¿al sobrepasar 2π tienes algún aviso de que eso sucede?

¿Puedes sondear el ángulo de giro mientras la rueda gira? o ¿sólo puedes saber el ángulo final?

B

no se si es como el Mo CA CO, llamala X

bLaKnI

Algunos os estays agilipoyando o yo no os entiendo... xD

Sisi, mirad, yo tengo un "simulador" que manda mensajes al programa que estoy haciendo vale?
Entonces coloco un objeto en dicho simulador que puede ser rotado.
Cuando lo coloco, pordefecto el angulo que me manda es 3.14 (bueno, PI).
Si lo giro hacia la izquierda, va descendiendo hacia 0 (osea, media vuelta) y si sigo girando, de golpe, 6.28, 6.27...

Lo mismo si es hacia la derecha, 3.14, 3.15..... 4.36, 4.3...... 6.28, 0, 0.1.....

Captura del simulador:

Lo que veis son 4 objetos de los multiples que se pueden colocar, y estan rotados.
El verde, el de mas a la izquierda, esta colocado tal cual se coloca arrastrandolo al circulo, como veis, con el vector indicando para arriba.
Si capturas los mensajes que manda el simulador, el angulo que manda este objeto en cuestion es 3.14.
El siguiente, es 3PI/2, el siguiente, 0 o 2PI (varia girando mlimetricamente a un lado u otro) y el siguiente, PI/2.

Que sabemos? Pues la x, y del objeto. Que es el centro de este. :)

NOTA: para los que tengan curiosidad, decir que si, se trata de un aplicativo para la REACTABLE. :)
Pero trae muchos dolores de cabeza...

bLaKnI

Bueeeeeno, bueno, bueno!
LO TENGO!

Lo explico para los que me habeis hechado un cable.
Todo consiste en un control de "tamaño de diferencia".

La definicion viene a ser:

En general diferencias positivas son rotaciones a la derecha,
diferencias negativas son rotaciones a la izquierda.

diferencias negativas muy grandes (<-3*PI/2) tambien son rotaciones a la
derecha, no a la izquierda (un salto de 6.2 a 0.1 por ejemplo)

diferencias positivas muy grandes (>3*PI/2) también son rotaciones a la
izquierda, no a la derecha (un salto de 0.1 a 6.2 por ejemplo).

Lo veis?
Entonces haciendo un juego de condicionales tal que:

if(angAct - angAnt >= 0){//genericamente, estamos girando a la derecha.
	if(angAct - angAnt > (3*Math.PI)/2){
           //es tan positivo (grande), que realmente vamos a la izquierda (hemos hecho el punto de pasar de 0.1 a 6.2)
	}else{
           //caso normal. Positividad pequeña, vamos a la derecha.
        }
}else{//genericamente estamos girando a la izquierda.
	if(angAct - angAnt < -((3*Math.PI)/2)){
           //es tan negativo, que esto es ir a la derecha (pasar de 6.2 a 0.1)
	}else{
           //caso natrual. Negatividad pequeña, vamos a la izquierda.
	}
}

pues basicamente queda todo solucionado.

Como lo veis!? :)

Estoy FELIZ!

NOTA: lo he probado y si, va genial! Ya puedo continuar programando! xDDD Me tenia bloqueado! :P

bLaKnI

UP!
(no se porque no ha subido, queria que lo vierais los que me habeis ayudado! ^^)

AzAzOtH

Enhorabuena :)

Simplemente a veces es conocer un poco más como funcionan las cosas jeje.

Un saludo!

Guybrush_

Teniendo sólo la información del ángulo inicial y el ángulo final, nunca vas a poder saber el sentido del giro.

Siguiendo tus ejemplos: Puedes ir de 6,1 radianes a 0,1 radianes tanto por la izquierda como por la derecha, siendo los valores de los ángulos incial y final los mismos girando en un sentido u otro.

Más sencillo todavía: Imagina que me dejas una rueda de esas en una determinada posición. Te das la vuelta y yo la giro. Vuelves a mirar. ¿Puedes acaso saber el sentido del giro?

P.D.: De todas formas, no tiene sentido el umbral de decisión en 3/4 de vuelta. ¿Por qué ese y no otro?

MTX_Anubis

#18 si ahces un salto de 6.2 a 0.1 por la derecha también te sale? Me refiero a dando casi una vuelta completa.

Según eso que has dicho no debería.

bLaKnI

Zenkiu Azazoth! :)

#21, la primera parte de tu reply, era justamente mi pregunta. xD Ya lo tenia claro el problema. En cuanto a tu PD, si sabeis lo que es el REACTABLE

http://www.youtube.com/results?search_type=search_videos&search_query=reactable&search_sort=relevance&search_category=0&page=

debeis saber que su precisión de reconocimiento, mas el hecho imposible de girar 3PI/2 con la mano de un tiron sobre un mismo eje de giro, hacen de este, el umbral ideal.
:)

#22 Anubis, si que va si. Insisto que es imposible hacer con la mano de una tirada, un giro de 3PI/2 (de hecho es casi imposible hacer PI). La tabla actualiza muy rapidamente el movimiento, es decir, no pasa mucho rato desde que se obtiene una informacion y otra, con lo cual es IMPOSIBLE que suceda un giro tan bestia o brusco. Entonces, cuanto mas grande el ubral, mas lógico para cubrir "posibles bugs".
Os dire que así es como trabajan ellos, y que les va perfectamente.

Y en cuanto a 6.2 a 0.1 hacia la derecha, es justamente el problema que tenia que resolver, y con esto se soluciona. Fijat:

en mis condicionales por abrebiarlo, digo que:

  • si la diferencia entre el actual y el anterior, es negativa, genericamente estamos girando a la izquierda.
  • si la diferencia es positiva, estamos girando genericamente a la derecha.

Cuando las diferencias son positivas/negativas muy grandes? En los casos que debia solucionar:

0.1 - 6.2 = -6.1.
6.2 - 0.1 = 6.1
para poner unos ejemplos.

Como dichos valores son tan grandes, coloco un unbral tal que:

  • si el valor es negativo, es izquierda
    PEEEEEEERO
    si es negativo MUY GRANDE (pasar de 6.2 a 0.1, osea, estar girando a la derecha), entonces estamos girando a la derecha.
  • y lo mismo con la izquierda.

:)

And that's all! xD

Realmente era una putada, porque al trabajar con angulos absolutos dentro del circulo unitario, dificultaba la cosa como veis.
Pero juntando el tema de que si algo se mueve MUY RAPIDO en la mesa, esta no lo reconoce + el hecho de que es imposible girar algo mas de PI con una mano y sin desplazar el objeto (tampoco vale dar vueltas alrrededor de la mesa ya que es bastante grande, pero insisto, aunque lo hicierais, el tiempo de actualización de la mesa cuando detecta movimiento es de milisegundos, luego no se puede hacer PI y algo en un milisegundo, ya que tan rapidisimo, no lo detectaria muy probablemente).

Se juntan pues, un conjunto de situaciones que hacen que esta sea LA SOLUCIÓN (de hecho, la única que hay).

Os quiero! ^^

MTX_Anubis

#23 bueno en ese caso sí, yo daba por hecho que podías girar cuanto quisieras xD

Guybrush_

Bonita información de última hora...

bLaKnI

Hombre, pero de todas formas tampoco era plan de girar la rueda en plan bastísimo!
Quiero decir, que este no era el plan, el plan es que tu vas girando con cierta "tonalidad"! xD
No estaba contemplado el usar el control a "modo peonza".

Por otra parte os diré que ayer hacia el tarde, hablé con los que lleban el tema de Reactable, y ellos me comentaron que 3PI/2 era un buen umbral, así que hasta ayer que dí la respuesta, yo estaba exactamente igual.
Osea, buscanod un metodo genérico para suplir el problema. Y la misma pregunta vino a mi mente: ¿por que 3PI/2?
Pues ya veis.

Cierto que si el controlador (objeto a rotar) hubiera tenido algun tipo de "física mapeable", es decir, se tuviera que tener en cuenta la acceleración y velocidad de rotación (parametros que por cierto, tambien puede dar la reactable), no seria descabellado pensar en algo de tipo "lo hago girar a saco y en plan ruleta, a ver cuando para". Luego sería lógica la pregunta "por que 3PI/2?".

:)

Igualmente, gracias a todos eh!? Ya puedo dormir! xD

m3tr0

#26 pero si la reactable es capaz de decirte la velocidad de rotación (es decir, detecta el giro del objeto en dos instantes muy próximos, digo yo), debería poder decirte sin problemas el sentido del giro y evitarte todo este lio no?

Usuarios habituales