Simulação de tremor (por exemplo, doença de Parkinson) com o mouse em uma página da web?

204

Estou trabalhando para uma fundação que aumenta a conscientização sobre a acessibilidade na internet. Para uma apresentação, queremos oferecer um pequeno workshop que simule diferentes deficiências / deficiências para as pessoas. Isso é feito através de um site criado especialmente para esta apresentação.

Uma das deficiências demonstradas é ter um tremor, o que significa experimentar movimentos trêmulos e difíceis de controlar as mãos. Com esse comprometimento, é muito difícil mover o cursor do mouse exatamente e pressionar o botão do mouse enquanto o mouse está sobre um link. Alguns idosos e pessoas com doenças, como Parkinson, podem sofrer tremores.

Agora, de alguma forma, gostaria de mover o cursor do mouse de uma maneira imprevisível, para que seja muito difícil para as pessoas clicarem em um pequeno botão. Como o JavaScript não permite mover o cursor do mouse diretamente, estou procurando outras maneiras de conseguir isso. Tive as seguintes idéias:

  • Usando um driver / utilitário do mouse que simula o movimento do mouse.
  • Oculte o cursor do mouse via CSS, coloque uma animação GIF de um cursor trêmulo no local do cursor original (com JavaScript) e, em seguida, torne o link de destino clicável apenas a cada poucos segundos por um segundo. Isso daria pelo menos a sensação de que alguém sempre clica no momento errado.

Embora a primeira ideia fosse bem legal, não consegui encontrar uma ferramenta como essa, seja para Mac nem para Windows. E eu não tenho nenhuma habilidade em programar uma coisa dessas.

A segunda ideia parece um pouco desajeitada, mas atingiria o efeito desejado, eu acho.

Alguém tem outra ideia?

Joshua Muheim
fonte
35
Você realmente pode controlar a posição do cursor (bem, um um emulado) com a API Pointer Bloqueio
Stuart P. Bentley
2
Tente olhar para developer.mozilla.org/en-US/docs/Web/API/… . O link direto para a demonstração é mdn.github.io/pointer-lock-demo . Enquanto é aceitável para o seu propósito de dizer aos usuários o clique em uma tela e permitir que a página para desativar o cursor do mouse, você pode querer basear seu código fora desta
Aristocrates
5
A própria pergunta aumenta a conscientização entre nós, desenvolvedores da web. Obrigado por perguntar! Qual o tamanho que você acha que um botão deve ter para ser clicável?
Ideograma
4
Apenas um nível definido sobre o tremor: existem dois tipos básicos - "tremor essencial" e o tremor de Parkinson - e eles são totalmente diferentes. "Tremor essencial" (que não é puramente uma condição dos idosos), é um tremor de "intenção", o que significa que é aparente apenas quando o indivíduo está tentando fazer alguma coisa e fica pior quanto mais difícil o indivíduo tenta controlá-lo. O tremor de DP, por outro lado, ocorre principalmente em repouso, e o tremor geralmente não é óbvio quando o indivíduo está tentando fazer alguma coisa (embora a rigidez devido à DP possa estar presente).
Hot Licks
2
Postei uma versão linux que usa o xdotool para controlar o mouse, mas existe uma ferramenta semelhante para o Windows chamada autoit. Parece bem simples e existe até uma tag para isso [autoit]. Também parece que você precisa de 2 versões. Um que treme mais até o início do movimento e depois se acalma um pouco enquanto o outro fica relativamente estável até o início do movimento.
Technosaurus

Respostas:

148

Fiz uma rápida demonstração de algo em que você esperançosamente deveria basear seu código, usando a API do Pointer Lock .

Eu peguei esse repositório de ponteiro-lock-demo e o modifiquei para adicionar um elemento de movimento aleatório.

Aqui está o link para minha página do GitHub: https://aristocrates.github.io/pointer-lock-demo
E aqui está o link para o meu repo: https://github.com/aristocrates/pointer-lock-demo

O código javascript de importância está contido app.js, no canvasLoop(e)método.

A única coisa que mudei da demo original foi depois das falas

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

Eu adicionei duas linhas para representar movimento aleatório:

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

Ainda há muitas coisas que você pode melhorar, mas espero que isso possa ajudá-lo a começar.

Aristocrates
fonte
36
Como observação na funcionalidade, movimento aleatório não é o mesmo que mão trêmula. Com movimento aleatório, o ponteiro pode deslizar pela tela. Com a mão trêmula, o ponteiro vibrará em torno de um ponto central.
precisa saber é o seguinte
5
Vale ressaltar que o suporte ao navegador para a API do Pointer Lock não é ótimo - isso não funcionará no Internet Explorer ou no Safari.
9788 Steve Jobsers
3
Não encontrei tempo para experimentá-lo, mas talvez você conheça este: a API de bloqueio de ponteiro também funciona fora de uma tela? Ou é restrito a uma tela?
Joshua Muheim
8
Uma implementação mais realista acompanharia a posição "real" do cursor e se moveria aleatoriamente dentro de um círculo ao redor, mas isso pode ser muito complexo.
Tckmn
1
@Chris Chrome agora lança Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.. Parece que o jsFiddle está incorporando o conteúdo em um quadro em área restrita (ou seja, não permitindo o bloqueio do ponteiro <iframe sandbox="webkit-allow-pointer-lock">, consulte os documentos ). Tente colocar a amostra em uma única página, não na área restrita.
ComFreek
36

Maneira não-javascript

Na verdade, eu gosto de soluções, que podem ser baseadas em javascript, pois são mais prováveis ​​relacionadas à Web, e boas chances são independentes de SO. No entanto, eu estava pensando em - como resolver seu problema em todos os navegadores, já que as soluções javascript, neste caso, serão difíceis de ajustar para todos os navegadores possíveis (não tenho certeza se é possível).

Então, como você mencionou, existe outra maneira - ie imitar o comportamento no nível do SO. Isso também tem outra vantagem - você pode ter certeza de que, para o navegador, parece 100% humano (porque, bem, é o driver que está enviando o sinal). Portanto, você pode usar soluções baseadas em driver / dispositivo com qualquer navegador (ou mesmo quando o javascript estiver desativado).

Linux

Infelizmente, envolver driver / dispositivo imediatamente causa dependência do sistema operacional. Portanto, para cada sistema operacional, você precisará de uma solução própria. Neste post, estou focado na solução baseada em Linux (portanto, funcionará com Linux) - e no Mac OS um pouco. Com o Linux, é possível gravar eventos no dispositivo explicitamente; portanto, abaixo está um exemplo de função com o loop 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;
}

Meu código completo para o problema pode ser encontrado aqui . O programa pedirá amplitude de "tremor" e sua frequência (assim, quanto tempo em microssegundos há entre "tremores"). Para emular a situação, forçará o mouse a mover-se aleatoriamente para obter 0..Xpontos na direção aleatória (de cima para baixo, à esquerda, em baixo) e espere aleatoriamente 0..Ymicrossegundos até o próximo "tremor", há Xamplitude de "tremor" eY frequência de "tremor "

Outra coisa pode ser adaptar o programa ao seu sistema. O programa é "fictício" e não pode detectar o mouse por si só, por isso "/dev/input/event4"é codificado. Para perceber o que pode ser um identificador para o seu sistema, você pode tentar:

user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3 
H: Handlers=mouse1 event4

E assim são as possibilidades "event3"e "event4"- mas para o seu sistema que podem ter outros valores. Portanto, se isso for diferente do atualmente usado no código C, basta alterar a linha correspondente (então, alinhe int fd = open("/dev/input/event4", O_RDWR);e coloque o dispositivo em vez deevent4 )

Uma demonstração gif para este programa (baixa taxa de quadros, infelizmente, portanto, mantenha a imagem não muito grande) aqui .

Uma pequena nota lateral (se você não sabe o que fazer com o código C) - para compilar o programa acima, basta usar:

user@host:/path$ gcc -std=gnu99 file.c -o m

onde file.cé o nome do seu arquivo de código-fonte C, você será executável, chamado mem seu diretório. Provavelmente, você precisará de permissões para gravar diretamente no dispositivo do mouse, portanto, você pode usar sudo:

user@host:/path$ sudo ./m

Outro SO

A lógica permanecerá a mesma:

  • Encontre uma maneira de acessar o dispositivo do mouse
  • Escrever evento de movimento do mouse
  • Aplique a randomização ao seu evento

É isso aí. Por exemplo, o Mac OS possui uma maneira própria de trabalhar com o mouse (não como o Linux, o Mac também não procfs), é bem descrito aqui .

Como uma conclusão

O que é melhor - soluções javascript ou orientadas a dispositivos - depende de você, porque determinadas condições (como entre navegadores ou SO) podem decidir tudo nesse caso. Portanto, forneci diretrizes juntamente com um exemplo prático de como implementá-lo no nível do sistema operacional. O benefício aqui é que a solução é entre navegadores, mas como custo, temos um programa vinculado ao sistema operacional.

Alma Do
fonte
Muito obrigado por este post muito detalhado. Suspeito que demonstraremos em um tablet (android ou ios), para que não possamos alterar o comportamento do mouse no nível do sistema operacional. Mas de qualquer maneira muito interessante!
Joshua Muheim
53
Como diabos você vai demonstrar o mouse trêmulo em dispositivos touchscreen?
Davor
6
@Davor Honestamente, duvido muito que as pessoas que realmente têm problemas com tremores / mãos trêmulas usariam um dispositivo de toque , a menos que quisessem intencionalmente enlouquecer.
Chris Cirefice
2
@ChrisCirefice: Ou são forçados a usá-lo, porque precisam usar um dos dispositivos de um milhão de milhões de dólares destinados a tornar nossas vidas mais agradáveis ​​e usar telas sensíveis ao toque ... lembre-se que isso é para aumentar a conscientização sobre o problema com o qual essas pessoas têm problemas. aquele.
PlasmaHH
@PlasmaHH O OP não mencionou que isso é para conscientizar as pessoas que têm tremores e suas dificuldades (especificamente) com dispositivos com tela de toque. E, novamente, eu não acho que qualquer um que realmente tem problemas com tremores é suficiente masoquista tentar usar de mão dispositivos touch-screen . Existem dispositivos que são muito mais fáceis de usar, como telefones com botões grandes (mecânicos). A maioria dos sistemas operacionais inclui navegação por fala (por exemplo, reconhecimento de fala - sistema operacional Windows). Imagino que indivíduos seriamente afetados usariam essas ferramentas em vez de um iPhone.
Chris Cirefice
23

Fiz isso de brincadeira uma vez, no Fórum do Puppy Linux e recebi o comentário de que:

Pessoas com Parkinson não vão achar graça !!!

Cura aqui é simplesmente cntrl-C, felizmente.

Aqui está o script de shell que requer o 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

Nomeie parkinson_sim e execute com argumento opcional para o tempo entre tremores, que pode ser de 0,001 a 999,0.

parkinson_sim [time_between_tremors_in_seconds] # o padrão é 0.1

Cometi o erro de clicar nele em vez de executá-lo na linha de comando e rapidamente descobri o quão frustrante deve ser. Foram necessárias várias tentativas para abrir uma janela do terminal para matá-la.

technosaurus
fonte
1
convém substituir os dois pontos por algo como "sleep 0.01" para limitar o uso e a velocidade da CPU, porque no meu equipamento ele faz saltos rápidos irrealistas com o seu código.
nonchip 13/08/14
1
@nonchip - Obrigado pela informação, eu nunca a executei o suficiente para descobrir o uso da CPU. Adicionado um sono ao corpo.
Technosaurus
Você sabe que na maioria das distribuições Linux você pode abrir o terminal usando os comandos do teclado, certo?
justhalf
@justhalf No padrão Puppy da época, o atalho do terminal era pressionar `uma janela do ROX-Filer. Foram necessárias algumas tentativas para abri-lo, então usei o teclado para abrir o menu. Logo depois, criei um daemon de controle de voz rudimentar, usando pocketsphinx_continuous e cerca de 10 linhas de shell.
Technosaurus
while :; do ...; sleep $time; donequase sempre deve ser while sleep $time; do ...; done, porque quando o usuário pressiona Ctrl-C, o comando em execução no momento quase certamente será sleep, e os shells nem sempre terminam o script quando o usuário deseja. Isso ocorre principalmente durante o teste em shells interativos, mas às vezes pode ocorrer mesmo em scripts. Melhor ainda seria while xdotool ... && xdotool ... && sleep ...; do :; done.
16

Sua segunda ideia (ocultar o cursor) está na metade de uma que eu acho que pode funcionar bem para você:

  • Oculte o cursor do mouse via CSS, como você sugere. (cursor:none IIRC)
  • Em vez de um GIF com cursor instável, use alguma imagem + posicionamento absoluto CSS + JS para emular o ponteiro do mouse; ou seja, siga o mouse pela página e plante a imagem do cursor onde deveria estar o cursor do mouse.

Em seguida, adicione um pouco de matemática de tremor ao código do cursor, para "agitar" o cursor. Você decide quais são as curvas corretas para simular corretamente a entrada de tremor.

Finalmente: para qualquer controle que você esteja programando (links, etc.):

  • capture eventos de clique, mova-os para o local atual do "tremor" com base no estado das suas curvas de tremor e limite - verifique seus elementos para ver se o usuário sacudiu o elemento pretendido ou possivelmente um elemento que não foi pretendido .

Um grande bônus com esta implementação: seu 'cursor instável' será exibido em dispositivos de toque, que não teriam um cursor para começar.


Editar:

Baseado na base de JSFiddle de Michael Theriot (muito limpo e útil!), A partir dos comentários, aqui está um que treme constantemente com uma varredura normalmente distribuída em torno do local atual do cursor: http://jsfiddle.net/benmosher/0x4mc64v/4/

(A normalmatriz é o resultado da chamada rnorm(100)no meu console R.

Ben Mosher
fonte
Algum padrão JS rato informação do evento: javascript.info/tutorial/...
Ben Mosher
Obrigado, este é realmente um complemento muito digno da minha ideia.
Joshua Muheim
O violino é simplesmente lindo para um projeto em que estou trabalhando, embora tenha 4 anos. Você se importaria de roubar isso como base para a simulação de Parkinson que faz parte do meu projeto?
Graham Ritchie
@GrahamRitchie: bom para mim, mas Michael Theriot fez a maioria do trabalho, porém, IIRC 😄
Ben Mosher
14

Apenas uma idéia para acertar o tremor, você pode gravar o movimento do mouse de um paciente real, o que o torna mais autêntico quando você diz às pessoas de onde os dados vêm.

Existem scripts para deixar um gato seguir o cursor do mouse, você pode ajustar um para deixar um segundo cursor seguir (pular) o cursor. A página está calculando a posição do segundo cursor, para que também possa determinar se um evento de clique é bem-sucedido ou não.

Se puder, faça com que seja baseado na Web, você alcançará muito mais pessoas dessa maneira do que pedir para instalar um programa ou ativar o flash ou o que houver.

user3934260
fonte
Obrigado por esta sugestão.
Joshua Muheim
1
Eu gosto dessa ideia - a posição do mouse pode ser gravada a qualquer intervalo de tempo via JavaScript. Em seguida, você pode traçar os movimentos (plano XY) e até obter algumas estatísticas básicas para uma fórmula mais 'válida' de 'tremor_randomness' para a solução da API Pointer Lock ou algo semelhante. Isso exigiria um pouco mais de trabalho (basta buscar a posição XY a cada 100 ms por 10 segundos, por exemplo) e análise, mas daria a você um efeito muito mais real do que a simples randomização. Por sua causa, pode valer a pena.
Chris Cirefice
10

Em vez de tentar mover o ponteiro, você pode mover o aplicativo (página da web). Eu escrevi um formulário html simples que possui alguns campos de entrada. Quando você move o mouse para o formulário, o formulário se move.

Você pode ver uma demonstração do formulário móvel em jsfiddle . Tente clicar em um dos campos de entrada para ver o efeito.

Eu usei o efeito jquery shake para conseguir isso. O javascript para o efeito de agitação se parece com isso e faz com que o formulário se mova para cima e para baixo sempre que o mouse é movido sobre ele:

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

Embora o formulário apenas se mova para cima e para baixo, acho que tem o efeito desejado. Você pode jogar com os parâmetros (direção, horários, distância e também com o nome "1000" acima) para ajustar o movimento do formulário.

sugestão x
fonte
3
Também pensei nisso, mas, embora seja mais fácil de implementar, não mostra a experiência "real" de um tremor.
Joshua Muheim
10

Por que não usar uma solução de hardware? Existem alguns mouses por aí que você pode colocar pesos, como o Logitech G500. Em vez de ganhar peso, coloque um pequeno motor oscilante que faça o mouse tremer levemente. Isso também simulou mais a desordem real: não é apenas o cursor que treme, mas toda a mão e o mouse. E isso também significa que você pode mostrar outro software que não seja o site.

Em vez de um mouse com um slot de peso, você também pode simplesmente colar algo no mouse, mas isso é mais perceptível.

Nzall
fonte
Como sou nerd de computador e não mecânico, vou me ater a uma solução eletrônica. Obrigado!
Joshua Muheim
Embora uma possível solução de hardware seja ativar o mouse (presumivelmente com fio) adicionando um gerador de ruído aleatório.
Hot Licks
6

Enquanto você pensava em fazê-lo com um driver de mouse personalizado, suponho que um pequeno programa em execução no PC também funcionaria? Se for esse o caso, aqui está um pequeno trecho para C #, que move o cursor infinitamente aleatoriamente, com um intervalo de mais menos 5px ao redor da posição atual do cursor. Após cada deslocamento, o programa espera 50 ms a 100 ms (não é preciso!). A instabilidade pode ser configurada adaptando os valores para o deslocamento e as pausas. Eu executei isso em um aplicativo de console e - dependendo dos valores - me deu muita dificuldade para interromper o 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);
}
Paul Kertscher
fonte
6

Aqui está uma versão do Windows do meu script xdotool que usa o AutoIt . Este foi o meu primeiro script AutoIt e demorou apenas alguns minutos para escrever, por isso tenho certeza de que pode ser melhorado. Apenas salve com a extensão .au3 e execute-a com o 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

Controles

  • Home: Inicie a simulação.
  • pausa: pausa a simulação.
  • Esc: Simulação de saída.

Ou use minha versão compilada daqui .

technosaurus
fonte
Muito agradável. Obrigado!
Joshua Muheim
5

Você não pode esperar que alguém consiga manter suas mãos perfeitamente firmes; portanto, uma coisa que você pode considerar é:

  1. Explique aos usuários o que você está fazendo e,
  2. Torne os elementos clicáveis ​​na página de demonstração muito menores que o normal.
  3. Aumentando a sensibilidade do mouse no sistema de exemplo ao máximo.

Meu raciocínio é (ressalva, não sou especialista em UX ou em medicina) ao diminuir os elementos que podem ser clicados, criando um problema semelhante para a maioria das pessoas que uma pessoa afetada pela doença de Parkinson enfrentaria com um site diário.

jdphenix
fonte
Essa é uma ideia interessante também. Com certeza, estou planejando tornar os elementos clicáveis ​​bem pequenos, de qualquer maneira.
Joshua Muheim
2
Receio que a maioria dos usuários de mouse possa controlar seu dispositivo de 1 a 2 pixels se se concentrar - por exemplo, o aperto de mão é inferior a 1 pixel com as configurações de mouse que eu uso. Então, provavelmente não é uma solução universal se você botões são maiores do que 1-2 pixels ...
Jonas Heidelberg
Eu adicionaria # 3, batendo a velocidade do mouse, clique em Configurações para max
Ryan B
Faria sentido ter uma espécie de "controle automático de volume" no mouse, amplificando pequenos movimentos enquanto fazia movimentos maiores ficarem mais próximos do "normal".
Hot Licks
4

Você pode usar um traje de simulação para a velhice, como o descrito neste artigo ... Suspeito que a parte dos tremores das mãos seja apenas um motor vibratório amarrado ao redor do pulso, além de algumas luvas grossas para deixar as mãos geralmente desajeitadas.

user3067860
fonte
Obrigado. Embora isso seja muito interessante, provavelmente não teremos tempo e dinheiro para colocar todos os visitantes no processo. ;)
Joshua Muheim
5
Isso não seria mais adequado como um comentário?
Selali Adobor 13/08/14
Bem, fiquei um pouco confuso sobre as tags javascript e html, mas como o solicitante também sugeriu o uso de drivers especiais de mouse (e tablets mencionados), parece que outras soluções são bem-vindas. Depois de remover a limitação específica da tecnologia, esta é uma resposta. Essa é realmente a maneira como os pesquisadores desse campo estão resolvendo o problema de simular a incapacidade relacionada à idade. Eu também acho que você pode fazer bricolage de forma relativamente barata se quiser apenas os tremores - um desses pesos de pulso de velcro e um motor vibratório não deve ser muito difícil.
user3067860
4
  • No seu DIVCSS, oculte o cursor usandocursor:none;
  • Crie uma imagem do cursor .png e mova-a ( left, top) com jQ emmousemove
  • Randomize o arquivo .png margin-lefte margin-topuse a setTimeout (para facilitar o reposicionamento, use CSS3 transitionou jQ .animate()).

Nota: O script não pode saber se a mão ainda está no 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>

Roko C. Buljan
fonte
2

As partes de baixo nível da simulação do tremor estão bem respondidas até agora. Vou adicionar algo focado no tipo de tremor a simular:

A maioria das respostas implementa um cursor do mouse que está se movendo em um caminho aleatório com alguma largura máxima de etapa fixa nas direções X e Y.

Isso deve funcionar bem o suficiente para dificultar o acesso a uma área específica, como um botão.

Para a questão mais geral de simulação de problemas de interface do usuário causados ​​por um tremor da doença de Parkinson, seria pelo menos interessante simular os movimentos das mãos desse tipo de tremor.
Eu suspeito que o passeio aleatório pode não ser uma aproximação muito boa .

Pode ser difícil obter dados reais de rastreamento de mão do movimento de tremores, é claro, mas certamente existem trabalhos sobre a análise desse tipo de tremor:

O artigo Representação Paramétrica do Movimento das Mãos na Doença de Parkinson é sobre como melhor traçar os traços 3D do movimento das mãos.
O papel é de parede de pagamento, mas a visualização no canto superior direito, rotulada "Look Inside>" na imagem do livro, mostra alguns gráficos interessantes de diferentes representações de dados de rastreamento manual .

Volker Siegel
fonte