Detectar algoritmo de giro de 360 grados
Estoy detectando con éxito 0-360 grados de rotación (rollo) de teléfono alrededor de un eje, pero ahora estoy teniendo dificultades para diseñar un algoritmo eficaz para detectar una vuelta completa. Mi trabajo, pero creo que no elegante y tan eficaz algoritmo como me gustaría es:
private boolean detectRoll; private boolean[] checkpointsR = new boolean[4]; private boolean fullRollTurn; public void detectingRoll() { setDetectRoll(true); checkpointsR[0] = true; for (int i = 1; i < 4; i++) { if (roll > 90 * i && roll < 90 * (i + 1) && checkpointsR[i - 1] == true) { checkpointsR[i] = true; } } if (areAllTrue(checkpointsR) && roll > 0 && roll < 45) { fullRollTurn = true; // reset rollCheckpoints for (int i = 1; i < 4; i++) { checkpointsR[i] = false; } } } public static boolean areAllTrue(boolean[] array) { for (boolean b : array) if (!b) return false; return true; } public void setDetectRoll(boolean detectRoll) { this.detectRoll = detectRoll; }
Cualquier ayuda sería muy apreciada.
- Android girar imageview, no puedo establecer la posición final de imageview en onAnimationEnd ()
- Android ProgressBar personalizado no está girando
- Android: Obtener rotación EXIF desde URI
- Cómo rotar un lienzo en un punto específico usando android.graphics.Camera.rotateX (angle)
- Android: gira todo el diseño
- ¿Qué se llama después de "onConfigurationChanged ()"?
- Cómo rotar vistas sobre el cambio de orientación sin volver a crear el diseño?
- Cómo rotar un dibujable por ObjectAnimator?
- Comprensión adicional setRetainInstance (true)
- Android: obtiene la orientación del dispositivo desde Azimuth, roll y pitch
- ¿Cómo manejar pegatinas con redimensionar y rotar la funcionalidad?
- Saber cuándo se ha terminado la rotación usando setRequestedOrientation
- Después de la rotación de la pantalla, se cambiará el idioma de mi aplicación
Bueno, su código sólo detecta las vueltas que resultan del aumento de roll
. En la otra dirección, es decir, un giro resultante de la caída del roll
,
if (checkpointsR[i - 1] == true) { checkpointsR[i] = true; }
nunca disparará.
Si bien eso es fácil de solucionar, si la única entrada de sensor que tienes es roll
, el punto de control fijo es el enfoque siempre va a tener problemas. La mejor manera de visualizarlo es que sus puntos de control son pequeños puntos rojos en un círculo, y la rotación del teléfono corresponde a una hormiga que se arrastra alrededor del borde del círculo. Supongamos que cuando la hormiga pasa un punto, se vuelve verde, y esto representa que el punto de control se establece en true
. Si la hormiga comienza entre dos puntos de control A
y B
, puede "engañarlos" arrastrándose por B
, todo el camino a A
, y luego darse la vuelta y dirigir la otra manera de nuevo. Todos los puntos de control serán verdes, pero la hormiga no habrá completado un círculo completo.
La manera de resolver esto es cambiar dos cosas: en primer lugar, dar a los puestos de control tres estados: unvisited
, en clockwise
y anticlockwise
. En segundo lugar, iniciar la hormiga en la parte superior de un puesto de control .
Aquí están las nuevas reglas:
- Cada punto comienza como
unvisited
(un punto rojo). - Si la hormiga pasa un punto de control en el sentido de las agujas del reloj, ajuste su estado en el
clockwise
de lasclockwise
delclockwise
(una pequeña flecha verde apuntando en sentido horario desde el punto) - Si la hormiga pasa un punto de control en el sentido contrario al de las agujas del reloj, ajuste su estado en
anticlockwise
(una pequeña flecha verde apuntando en sentido antihorario desde el punto) - Se ha completado un giro si todos los puntos de control están en el
clockwise
lasclockwise
o si están enanticlockwise
.
Esto se puede lograr con tres puntos de control, y se coloca donde quiera en el círculo, siempre y cuando el primero está bajo la posición inicial de la hormiga. Sin embargo, recomiendo {initial, inital + 120, initial + 240}
por simetría.
(El experimento de pensamiento de hormigas funciona con dos puntos de control, pero cuando tienes dos puntos de control el problema es que hay un par de regiones con un punto de control no único entre ellos, lo que confunde la detección de qué punto de control pasó la hormiga cuando la hormiga va de una región a otra)
- setSelection no funciona – getSelectedItemPosition siempre devuelve -1
- Cómo obtener una vista desde un evento de coordenadas en android cuando la vista establecer la rotación?