¿Simular temblores (por ejemplo, de la enfermedad de Parkinson) con el ratón en una página web?

204

Trabajo para una fundación que crea conciencia sobre la accesibilidad en Internet. Para una presentación, queremos ofrecer un pequeño taller que simule diferentes discapacidades / discapacidades a las personas. Esto se hace a través de un sitio web creado especialmente para esta presentación.

Uno de los impedimentos demostrados es tener un temblor, lo que significa experimentar movimientos de la mano inestables y difíciles de controlar. Con esta discapacidad, es muy difícil mover el cursor del mouse exactamente y presionar el botón del mouse mientras el mouse está sobre un enlace. Tanto algunas personas mayores como las que padecen enfermedades, como el Parkinson, pueden sufrir temblores.

Ahora me gustaría mover de alguna manera el cursor del mouse de una manera impredecible, de modo que sea muy difícil para las personas hacer clic en un botón pequeño. Debido a que JavaScript no permite mover el cursor del mouse directamente, estoy buscando otras formas de lograrlo. Se me ocurrieron las siguientes ideas:

  • Usando un controlador / utilidad de mouse que simula el movimiento del mouse.
  • Oculte el cursor del mouse a través de CSS, coloque una animación GIF de un cursor del mouse en movimiento en el lugar del cursor original (con JavaScript) y luego haga que se pueda hacer clic en el enlace de destino solo cada pocos segundos durante aproximadamente un segundo. Esto al menos daría la sensación de que uno siempre hace clic en el momento equivocado.

Si bien la primera idea sería genial, no pude encontrar una herramienta como esta, ni para Mac ni para Windows. Y yo mismo no tengo ninguna habilidad para programar tal cosa.

La segunda idea parece un poco torpe, pero creo que lograría el efecto deseado.

¿Alguien tiene otra idea?

15
  • 35
    De hecho, puede controlar la posición del cursor (bueno, una emulada) con la API de bloqueo de puntero 12 de agosto de 2014 a las 7:58
  • 2
    Intente buscar en developer.mozilla.org/en-US/docs/Web/API/… . El enlace directo a la demostración es mdn.github.io/pointer-lock-demo . Siempre que sea aceptable para su propósito decirle a los usuarios que hacen clic en un lienzo y permitir que la página deshabilite el cursor del mouse, es posible que desee basar su código en esto 12 de agosto de 2014 a las 8:06
  • 5
    La misma pregunta crea conciencia entre nosotros, los desarrolladores web. ¡Gracias por preguntar! ¿Qué tamaño crees que debería tener un botón para que se pueda hacer clic? 14 de agosto de 2014 a las 8:04
  • 4
    Solo un nivel establecido en el temblor: hay dos tipos básicos: "temblor esencial" y temblor de Parkinson, y son completamente diferentes. El "temblor esencial" (que no es puramente una condición de los ancianos), es un temblor de "intención", lo que significa que es aparente solo cuando el individuo está tratando de hacer algo, y empeora cuanto más intenta controlarlo. El temblor de la EP, por otro lado, ocurre principalmente en reposo, y el temblor a menudo no es obvio cuando el individuo está tratando de hacer algo (aunque la rigidez debido a la EP puede estar presente). 14 de agosto de 2014 a las 15:07
  • 2
    Publiqué una versión de Linux que usa xdotool para controlar el mouse, pero hay una herramienta similar para Windows llamada autoit. Parece bastante simple e incluso tiene una etiqueta [autoit]. También parece que necesitas 2 versiones. Uno que sacude más hasta que comienza el movimiento y luego se calma un poco mientras que el otro es relativamente estable hasta que comienza el movimiento. 15 de agosto de 2014 a las 9:37
147

Hice una demostración rápida de algo en lo que, con suerte, debería poder basar su código, utilizando la API de Pointer Lock .

Bifurqué este repositorio pointer-lock-demo y lo modifiqué para agregar un elemento de movimiento aleatorio.

Aquí está el enlace a mi página de GitHub: https://aristocrates.github.io/pointer-lock-demo
Y aquí está el enlace a mi repositorio: https://github.com/aristocrates/pointer-lock-demo

El código javascript de importancia está contenido app.jsen el canvasLoop(e)método.

Lo único que cambié de la demostración original fue después de las líneas

x += movementX * 2;
y += movementY * 2;

Agregué dos líneas para representar el movimiento aleatorio:

x += Math.floor(Math.random()*3 - 1);
y += Math.floor(Math.random()*3 - 1);

Todavía hay muchas cosas que podría mejorar, pero es de esperar que esto pueda ayudarlo a comenzar.

9
  • 36
    Como nota en la funcionalidad, el movimiento aleatorio no es lo mismo que una mano temblorosa. Con un movimiento aleatorio, el puntero puede desplazarse por la pantalla. Con una mano temblorosa, el puntero vibrará alrededor de un punto central.
    zzzzBov
    12/08/2014 a las 14:53
  • 5
    Vale la pena señalar que la compatibilidad del navegador con Pointer Lock Api no es excelente; esto no funcionará en Internet Explorer o Safari. 12/0814 a las 16:41
  • 3
    No encontré tiempo para probarlo yo mismo, pero tal vez conozcas este: ¿la API de bloqueo de puntero también funciona fuera de un lienzo? ¿O está restringido a un lienzo? 13/08/2014 a las 12:34
  • 8
    Una implementación más realista rastrearía la posición "real" del cursor y se movería aleatoriamente dentro de un círculo alrededor de eso, pero eso podría ser demasiado complejo.
    tckmn
    14 de agosto de 2014 a las 7:08
  • 1
    @Chris Chrome ahora lanza Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.. Parece que jsFiddle está incrustando el contenido en un marco de espacio aislado (es decir, no permite el bloqueo del puntero <iframe sandbox="webkit-allow-pointer-lock">, consulte los documentos ). Intente poner la muestra en una sola página, no en un espacio aislado. 25/10/2014 a las 12:46
36

Forma no javascript

En realidad, me gustan las soluciones, que pueden estar basadas en javascript, ya que es más probable que estén relacionadas con la web, y es muy probable que sean independientes del sistema operativo. Sin embargo, estaba pensando en cómo resolver su problema para todos los navegadores, ya que las soluciones de JavaScript, en este caso, serán difíciles de ajustar para todos los navegadores posibles (no estoy seguro de que sea posible).

Entonces, como ha mencionado, hay otra forma, es decir, emular el comportamiento a nivel del sistema operativo. Esto también tiene otra ventaja: puede estar seguro de que para el navegador parece 100% humano (porque, bueno, es el controlador el que envía la señal). Por lo tanto, puede usar soluciones basadas en controladores / dispositivos con cualquier navegador (o incluso en una situación, cuando JavaScript está deshabilitado).

Linux

Desafortunadamente, la participación del controlador / dispositivo provoca inmediatamente una dependencia del sistema operativo. Entonces, para cada sistema operativo, necesitará una solución propia. En esta publicación, me centraré en la solución basada en Linux (por lo tanto, funcionará con Linux) y un poco en Mac OS. Con Linux, es posible escribir eventos en el dispositivo de forma explícita, por lo que a continuación se muestra una muestra de la función con el bucle principal:

int main()
{
    struct input_event event, event_end;

    int  fd = open("/dev/input/event4", O_RDWR);
    long ma = getInteger("Enter max amplitude [points, 0..50]: ", 0, 50);
    long ta = getInteger("Enter max wait time [usecs , 0..200000]: ", 0, 200000);
    if (fd < 0)
    {
        printf("Mouse access attempt failed:%s\n", strerror(errno));
        return -1;
    }
    memset(&event, 0, sizeof(event));
    memset(&event, 0, sizeof(event_end));
    gettimeofday(&event.time, NULL);
    event.type = EV_REL;
    gettimeofday(&event_end.time, NULL);
    event_end.type = EV_SYN;
    event_end.code = SYN_REPORT;
    event_end.value = 0;
    while(1)
    {
        event.code  = rand() % 2 ? REL_X : REL_Y;
        event.value = (rand() % 2 ? -1 : 1) * randomTill(ma);
        write(fd, &event, sizeof(event));
        write(fd, &event_end, sizeof(event_end));
        usleep(randomTill(ta));
    }
    close(fd);
    return 0;
}

Mi código completo para el problema se puede encontrar aquí . El programa preguntará por la amplitud del "temblor" y su frecuencia (por lo tanto, cuántas veces en microsegundos hay entre "temblores"). Para emular la situación, obligará al mouse a moverse aleatoriamente por 0..Xpuntos en una dirección aleatoria (arriba-abajo-izquierda-abajo) y esperará aleatoriamente 0..Ymicrosegundos hasta el próximo "temblor", hay Xuna amplitud de "temblor" y Yuna frecuencia de "temblor". "

Otra cosa puede ser adaptar el programa a su sistema. El programa es "ficticio" y no puede detectar el mouse por sí mismo, por lo que "/dev/input/event4"está codificado. Para darse cuenta de lo que puede ser un identificador para su sistema, puede intentar:

[email protected]:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3 
H: Handlers=mouse1 event4

Y entonces las posibilidades son "event3"y "event4", pero para su sistema, eso puede tener otros valores. Entonces, si eso es diferente de lo que se usa actualmente en el código C, simplemente cambie la línea correspondiente (por lo tanto, alinee con int fd = open("/dev/input/event4", O_RDWR);y coloque su dispositivo en lugar de event4)

Una demostración de gif para este programa (baja velocidad de fotogramas, desafortunadamente, así que mantenga la imagen no demasiado grande) aquí .

Una pequeña nota al margen (si no sabe qué hacer con el código C): para compilar el programa anterior, simplemente use:

[email protected]:/path$ gcc -std=gnu99 file.c -o m

donde file.cestá el nombre de su archivo de código fuente C, entonces obtendrá ejecutable, llamado men su directorio. Lo más probable es que necesite permisos para escribir directamente en el dispositivo del mouse, por lo que puede usar sudo:

[email protected]:/path$ sudo ./m

Otro SO

La lógica seguirá siendo la misma:

  • Encuentre una forma de acceder a su dispositivo de mouse
  • Escribir evento de mouse en movimiento
  • Aplicar la aleatorización a su evento

Eso es todo. Por ejemplo, Mac OS tiene su propia forma de trabajar con el mouse (no como Linux, Mac tampoco procfs), está bien descrito aquí .

Como conclusión

Lo que es mejor, javascript o soluciones orientadas a dispositivos, depende de usted, porque ciertas condiciones (como varios navegadores o sistemas operativos) pueden decidir todo en este caso. Por lo tanto, he proporcionado pautas junto con ciertos ejemplos prácticos de cómo implementar eso en el nivel del sistema operativo. El beneficio aquí es que la solución es entre navegadores, pero como costo tenemos un programa vinculado al sistema operativo.

9
  • Muchas gracias por esta publicación tan detallada. Sospecho que haremos una demostración en una tableta (android o ios), por lo que no podremos cambiar el comportamiento del mouse a nivel del sistema operativo. ¡Pero muy interesante de todos modos! 12 de agosto de 2014 a las 12:38
  • 53
    ¿Cómo diablos vas a hacer una demostración de un mouse inestable en dispositivos con pantalla táctil?
    Davor
    12/08/14 a las 14:43
  • 6
    @Davor Honestamente, dudo mucho que las personas que realmente tienen problemas con los temblores / manos temblorosas usen un dispositivo táctil , a menos que quieran volverse locos intencionalmente. 13/08/2014 a las 13:50
  • 2
    @ChrisCirefice: O se ven obligados a hacerlo, porque tienen que usar uno de los millones de dispositivos que están destinados a hacer nuestra vida más agradable y usar pantallas táctiles ... recuerde que esto es para crear conciencia sobre el problema con el que estas personas tienen problemas. ese. 13/08/2014 a las 22:37
  • @PlasmaHH El OP no mencionó que esto es para concienciar a las personas que tienen temblores y su dificultad (específicamente) con los dispositivos de pantalla táctil. Y de nuevo, no creo que nadie que haya problemas con temblores es tan masoquista como para tratar de utilizar portátiles dispositivos de pantalla táctil. Hay dispositivos que son mucho más fáciles de usar, como teléfonos con botones grandes (mecánicos). La mayoría de los sistemas operativos incluyen navegación por voz (p. Ej., Reconocimiento de voz, sistema operativo Windows). Me imagino que las personas gravemente afectadas utilizarían esas herramientas en lugar de un iPhone. 14 de agosto de 2014 a las 2:30
23

Hice esto como una broma una vez, en el foro Puppy Linux y recibí el comentario de que:

People with Parkinson's won't think it's funny !!!

Cure here is simply cntrl-C, luckily.

Aquí está el script de shell que requiere xdotool

#!/bin/sh
while :; do
   xdotool mousemove_relative -- -$(($RANDOM % 10)) $(($RANDOM % 10))
   xdotool mousemove_relative -- $(($RANDOM % 10)) -$(($RANDOM % 10))
   sleep ${1:-.1} #adjust this as necessary for effect
done

Nómbrelo como parkinson_sim y ejecútelo con un argumento opcional para el tiempo entre temblores, que puede ser de 0,001 a 999,0.

parkinson_sim [time_between_tremors_in_seconds] #default is 0.1

Cometí el error de hacer clic en él yo mismo en lugar de ejecutarlo desde la línea de comandos y rápidamente descubrí lo frustrante que debe ser. Me tomó varios intentos abrir una ventana de terminal para matarlo.

5
  • 1
    es posible que desee reemplazar los dos puntos por algo como "dormir 0.01" para limitar el uso y la velocidad de la CPU, porque en mi equipo hace saltos rápidos poco realistas con su código.
    nonchip
    13/08/2014 a las 17:11
  • 1
    @nonchip - Gracias por la información, nunca lo ejecuté el tiempo suficiente para averiguar el uso de la CPU. Añadió un sueño al cuerpo. 13/0814 a las 21:12
  • Sabes que en la mayoría de las distribuciones de Linux puedes abrir la terminal usando comandos de teclado, ¿verdad? 14 de agosto de 2014 a las 16:47
  • @justhalf En Puppy predeterminado en ese momento, el atajo de la terminal era presionar `en una ventana de ROX-Filer. Me tomó un par de intentos abrirlo, así que usé el teclado para abrir el menú. Poco tiempo después, creé un demonio de control de voz rudimentario usando pocketphinx_continuous y alrededor de 10 líneas de shell. 14 de agosto de 2014 a las 19:56
  • while :; do ...; sleep $time; donecasi siempre debería ser así while sleep $time; do ...; done, porque cuando el usuario presiona Ctrl-C, es casi seguro que el comando que se está ejecutando actualmente lo será sleep, y los shells no siempre terminan el script cuando el usuario quiere. Esto ocurre principalmente durante las pruebas en shells interactivos, pero a veces puede suceder incluso en scripts. Incluso mejor sería while xdotool ... && xdotool ... && sleep ...; do :; done.
    user743382
    18 de agosto de 2014 a las 6:55
17

Su segunda idea (ocultar el cursor) está a medio camino de una que creo que puede funcionar bien para usted:

  • Oculte el cursor del mouse a través de CSS, como sugiere. ( cursor:noneIIRC)
  • En lugar de un GIF de cursor tembloroso, use alguna imagen + posicionamiento absoluto CSS + JS para emular el puntero del mouse; es decir, siga el mouse alrededor de la página y coloque la imagen del cursor donde estaría el cursor del mouse de forma nativa.

Luego, agrega algunas matemáticas de temblor al código del cursor, para "agitar" el cursor. Depende de usted determinar cuáles son las curvas correctas para simular adecuadamente la entrada del temblor.

Finalmente: para los controles que esté programando (enlaces, etc.):

  • Capture eventos de clic, muévalos a la ubicación actual de "temblor" según el estado de sus curvas de temblor, y verifique los límites de sus elementos para ver si el usuario ha salido del elemento deseado, o posiblemente dentro de un elemento que no estaba previsto. .

Una ventaja importante con esta implementación: su 'cursor tembloroso' se mostrará en dispositivos táctiles, que para empezar no tendrían un cursor.


Editar:

Basado en el JSFiddle base de Michael Theriot (¡muy limpio y útil!) De los comentarios, aquí hay uno que tiembla constantemente con un barrido distribuido normalmente alrededor de la ubicación actual del cursor: http://jsfiddle.net/benmosher/0x4mc64v/4/

(La normalmatriz es el resultado de llamar rnorm(100)a mi consola R. La forma más sencilla que se me ocurre en JS para muestrear un entero aleatorio distribuido normalmente).

4
  • Alguna información estándar de eventos del mouse JS: javascript.info/tutorial/… 13/0814 a las 17:33
  • Gracias, esta es realmente una valiosa adición a mi idea. 13/08/2014 a las 17:35
  • El violín es simplemente hermoso para un proyecto en el que estoy trabajando, aunque este tiene 4 años, ¿te importaría que lo robe como base para la simulación de Parkinson que es parte de mi proyecto? 22/08/18 a las 8:29
  • @GrahamRitchie: bien por mí, pero Michael Theriot hizo la mayor parte del trabajo, IIRC 😄 30/08/18 a las 12:06
14

Solo una idea para obtener el temblor "correcto", puede registrar el movimiento del mouse de un paciente real, esto lo hace más auténtico cuando le dice a la gente de dónde provienen los datos.

Hay una secuencia de comandos para permitir que un gato siga el cursor del mouse, puede ajustar una para que un segundo cursor siga (salte) su cursor. La página calcula la posición del segundo cursor, por lo que también puede determinar si un evento de clic es exitoso o no.

Si puede, hágalo basado en la web, de esta manera llegará a mucha más gente que pidiéndoles que instalen un programa o activen flash o lo que sea.

2
  • Gracias por esta sugerencia. 13 de agosto de 2014 a las 6:24
  • 1
    Me gusta esta idea: la posición del mouse se puede registrar en cualquier intervalo de tiempo a través de JavaScript. Luego, podría trazar los movimientos (plano XY) e incluso obtener algunas estadísticas básicas para una fórmula más 'válida' de 'tremor_randomness' para la solución de API Pointer Lock o algo similar. Esto requeriría un poco más de trabajo (solo busque la posición XY cada 100 ms durante 10 segundos, por ejemplo) y análisis, pero le daría un efecto mucho más real que la simple aleatorización. Por tu causa, puede que valga la pena. 13/08/2014 a las 13:59
11

En lugar de intentar mover el puntero, puede mover la aplicación (página web). Escribí un formulario html simple que tiene algunos campos de entrada. Cuando mueve el mouse sobre el formulario, el formulario se mueve.

Puede ver una demostración del formulario en movimiento en jsfiddle . Intente hacer clic en uno de los campos de entrada para ver el efecto.

Usé el efecto de agitación jquery para lograr esto. El javascript para el efecto de agitación se ve así, y solo hace que el formulario se mueva hacia arriba y hacia abajo cada vez que se mueve el mouse sobre él:

<script type="text/javascript">
    $(document).ready(function() {
        $("#toggle").hover(function () {
            $(this).effect("shake", { direction: "up", times: 1, distance: 40}, 1000);
        });
    });
</script>

Aunque la forma solo se mueve hacia arriba y hacia abajo, creo que tiene el efecto deseado. Puede jugar con los parámetros (dirección, tiempos, distancia, así como el "1000" sin nombre arriba) para ajustar el movimiento de la forma.

1
  • 3
    Yo también pensé en esto, pero aunque es más fácil de implementar, no muestra la experiencia "real" de un temblor. 13 de agosto de 2014 a las 6:31
10

¿Por qué no utilizar una solución de hardware? Hay ciertos ratones en los que puedes poner pesos, como el Logitech G500. En lugar de poner un peso, coloque un pequeño motor oscilante que haga que el mouse se mueva ligeramente. Esto también simuló más el desorden real: no es solo el cursor lo que tiembla, sino toda la mano y el mouse. Y también significa que puede mostrar otro software además de los sitios web.

En lugar de un mouse con una ranura de peso, también puede pegar algo al mouse, pero eso es más notorio.

2
  • Como soy un experto en informática y no mecánico, me quedaré con una solución electrónica. ¡Gracias! 14 de agosto de 2014 a las 11:10
  • Aunque una posible solución de hardware es fastidiar el mouse (presumiblemente cableado) agregándole un generador de ruido aleatorio. 14 de agosto de 2014 a las 15:11
6

Como estaba pensando en hacerlo con un controlador de mouse personalizado, supongo que un pequeño programa que se ejecute en la PC funcionaría bien. Si este es el caso, aquí hay un pequeño fragmento de C #, que mueve infinitamente el cursor aleatoriamente dentro de un rango de más menos 5px alrededor de la posición actual del cursor. Después de cada desplazamiento, el programa espera de 50 a 100 ms (¡no es exacto!). El temblor se puede configurar adaptando los valores para el desplazamiento y las pausas. Ejecuté esto en una aplicación de consola y, dependiendo de los valores, me costó bastante detener el programa.

Random rand = new Random();

while(true)
{
    Cursor.Position = new Point() { X = Cursor.Position.X + rand.Next(11)-5, Y = Cursor.Position.Y + rand.Next(11)-5 };
    Thread.Sleep(rand.Next(50) + 50);
}
0
6

Aquí hay una versión de Windows de mi script xdotool que usa AutoIt . Este fue mi primer script de AutoIt, y solo me tomó un par de minutos escribirlo, así que estoy seguro de que se puede mejorar. Simplemente guarde con la extensión .au3 y ejecútelo con AutoIt (Run Script x86).

HotKeySet("{HOME}", "GStart")
HotKeySet("{PAUSE}", "Gpause")
HotKeySet("{ESC}", "Gexit")

While 1
    Sleep(100)
WEnd

Func Gstart()
While 1
    sleep(100)
    $pos = MouseGetPos()
    $x = $pos[0] + 10 - Random(0, 20, 1)
    $y = $pos[1] + 10 - Random(0, 20, 1)
    MouseMove($x,$y)
Wend
Endfunc


Func Gpause()
While 1
   sleep(100)
Wend
Endfunc

Func Gexit()
    MsgBox(0, "exit box", "Script exited")
    Exit 0
EndFunc

Control S

  • Inicio: inicia la simulación.
  • pause: pausa la simulación.
  • Esc: Salir de la simulación.

O use mi versión compilada desde aquí .

1
  • Muy agradable. ¡Gracias! 15 de agosto de 2014 a las 9:58
5

No puede esperar que nadie pueda sostener sus manos perfectamente firmes, por lo que una cosa que puede considerar es:

  1. Explique a los usuarios lo que está haciendo y,
  2. Haga que los elementos en los que se puede hacer clic en la página de demostración sean mucho más pequeños de lo normal.
  3. Aumentar al máximo la sensibilidad del mouse en el sistema de ejemplo.

Mi razonamiento es (advertencia, no soy un experto en ux o medicina) al hacer que los elementos en los que se puede hacer clic sean más pequeños, crea un problema similar para la mayoría de las personas que una persona que padece la enfermedad de Parkinson se enfrentaría con un sitio web cotidiano.

4
  • Esta también es una idea interesante. De todos modos, estoy planeando hacer que los elementos en los que se puede hacer clic sean bastante pequeños. 13 de agosto de 2014 a las 6:26
  • 2
    Me temo que la mayoría de los usuarios de mouse pueden controlar su dispositivo hasta 1-2 píxeles si se concentran, por ejemplo, el movimiento de la mano está por debajo de 1 píxel con la configuración del mouse que uso. Entonces, probablemente no sea una solución universal si sus botones tienen más de 1-2 píxeles ... 13/08/2014 a las 14:26
  • Agregaría el n. ° 3, aumentando la velocidad del mouse y haciendo clic en la configuración al máximo
    Ryan B
    13/08/2014 a las 18:46
  • Tendría sentido tener una especie de "control de volumen automático" en el mouse, amplificando los pequeños movimientos mientras hace que los más grandes estén más cerca de lo "normal". 14 de agosto de 2014 a las 15:10
4

Puede usar un traje de simulación de vejez, como el que se describe en este artículo ... Sospecho que la parte de los temblores de las manos es solo un motor vibratorio atado alrededor de la muñeca, además de algunos guantes gruesos para hacer que las manos generalmente sean torpes.

3
  • Gracias. Aunque esto es muy interesante, probablemente no tengamos tiempo ni dinero para poner el traje a todos los visitantes. ;) 12/08/14 a las 15:27
  • 5
    ¿No sería más adecuado como comentario? 13 de agosto de 2014 a las 2:03
  • Bueno, estaba un poco confundido acerca de las etiquetas javascript y html, pero dado que el autor de la pregunta también sugirió el uso de controladores de mouse especiales (y luego mencionó tabletas), parece que otras soluciones son bienvenidas. Una vez que elimine la limitación tecnológica específica, esta es una respuesta. Esta es realmente la forma en que los investigadores en este campo están resolviendo el problema de simular la discapacidad relacionada con la edad. También creo que podrías hacer bricolaje a un precio relativamente bajo si solo quieres los temblores: una de esas pesas de muñeca con velcro y un motor vibratorio, no debería ser demasiado difícil. 13/08/2014 a las 13:45
4
  • En tu DIV, CSS-oculta el cursor usandocursor:none;
  • Cree una imagen de cursor .png y muévala ( left, top) con jQ activadomousemove
  • Aleatorice el .png margin-lefty margin-topuse a setTimeout (para que el reposicionamiento sea suave, use CSS3 transitiono hágalo con jQ .animate()).

Nota: el script no puede saber si la mano todavía está en el mouse;)

function rand(min, max) {return Math.random() * (max - min) + min;}

var $cursor = $('div img');

$('div').mousemove(function(e) {  // Make .png follow the mouse coordinates
  $cursor.css({
    left: e.pageX,
    top:e.pageY
  });
}).hover(function(e){
  $cursor.toggle(); // Show .png cursor as we enter the DIV
});

(function tremor(){ // Add tremor to .png image
  $cursor.css({
      marginLeft: rand(-15,15), // arm tremor
      marginTop:  rand(-30,30)  // hand contractions
  });
  setTimeout(tremor, rand(50,100));
}());
div{
  position:absolute;
  background:#eee;
  height:100%;
  width:100%;
  cursor:none;
}

div img{
  display:none;
  position:absolute;
  transition: margin 0.2s;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div><img src="http://i.stack.imgur.com/KwMGA.png"></div>
2

Las partes de bajo nivel de la simulación del temblor ya están bien respondidas. Agregaré algo que se centre en el tipo de temblor que se va a simular:

La mayoría de las respuestas implementan un cursor del mouse que se mueve en una ruta aleatoria con un ancho de paso máximo fijo en la dirección X e Y.

Esto debería funcionar lo suficientemente bien para el caso de uso de hacer que sea difícil presionar un área específica como un botón.

Para el problema más general de la simulación de problemas de IU causados ​​por un temblor de la enfermedad de Parkinson, sería al menos interesante simular realmente los movimientos de la mano de este tipo de temblor.
Sospecho que la caminata aleatoria puede no ser una buena aproximación .

Por supuesto, puede ser difícil obtener datos reales de seguimiento de la mano del movimiento del temblor, pero ciertamente hay artículos sobre el análisis de este tipo de temblor:

El artículo Representación paramétrica del movimiento de la mano en la enfermedad de Parkinson trata sobre cómo trazar mejor los trazos de movimiento de la mano en 3D.
El documento tiene un muro de pago, pero la vista previa en la parte superior derecha, etiquetada "Look Inside>" en la imagen del libro, muestra algunas tramas interesantes de diferentes representaciones de datos de huellas de manos .