Pergunta

Eu tenho grandes conjuntos de dados (dados de 10 Hz, assim 864k pontos por 24 horas) que eu preciso para enredo em tempo real. A idéia é que o usuário pode aplicar zoom e pan em gráficos de dispersão altamente detalhadas.

Os dados não é muito contínuo e há picos. Uma vez que o conjunto de dados é tão grande, não posso traçar todos os pontos de cada vez que as atualizações de enredo.

Mas eu também não pode simplesmente traçar todos os pontos enésimo ou então eu vou perder grandes recursos como espigas grandes, mas curtos.

Matlab faz isso direito. Você pode dar-lhe um vector 864k cheio de zeros e apenas definir qualquer um ponto a 1 e vai traçar corretamente em tempo real com zooms e panelas.

Como o Matlab fazê-lo?

O meu sistema de destino é Java, então eu seria a geração de pontos de vista deste enredo em Swing / Java2D.

Foi útil?

Solução

Você deve tentar o arquivo de MATLAB Central:

https://mathworks.com/matlabcentral/fileexchange/15850-dsplot -downsampled-enredo

Do autor:

Esta versão do "enredo" permitirá que você visualizar os dados que tem grande número de elementos. Plotagem grande conjunto de dados faz com que seus gráficos lento, mas a maioria das vezes você não precisa de todas as informações exibidas na trama. Sua tela tem apenas tantos pixels, e seus olhos não será capaz de detectar qualquer informação não capturado na tela.

Esta função irá downsample os dados e enredo apenas um subconjunto dos dados, melhorando assim o requisito de memória. Quando a trama é ampliada, mais informações é exibido. Algum trabalho é feito para se certificar de que os outliers são capturados.

Sintaxe:

dsplot(x, y)  
dsplot(y)  
dsplot(x, y, numpoints)  

Exemplo:

x =linspace(0, 2*pi, 1000000);  
y1=sin(x)+.02*cos(200*x)+0.001*sin(2000*x)+0.0001*cos(20000*x);  
dsplot(x,y1);

Outras dicas

Eu não sei como Matlab faz isso, mas eu começaria com Quadtrees .

Dump todos os pontos de seus dados para o quadtree, em seguida, para tornar em um determinado nível de zoom, você anda na quadtree (começando com as áreas que se sobrepõem o que você está visualizando) até chegar a áreas que são comparáveis ??ao tamanho de um pixel. Furar um pixel no meio da área.

acrescentou: Fazendo seu desenho com OpenGL / JOGL também irá ajudá-lo a chegar mais rápido desenho. Especialmente se você pode prever panning, e construir os pontos para mostrar em uma lista de exibição ou algo assim, para que você não tem que fazer nenhum trabalho da CPU para os novos quadros.

meios de dados 10Hz que você só tem de traçar 10 quadros por segundo. Deve ser fácil, já que muitos jogos alcançar> 100 fps com gráficos muito mais complexos.

Se você parcela 10 pixels por segundo para cada possível ponto de dados que pode exibir uma pena minuto de dados usando um pixel 600 de largura widget. Se você salvar o índice do 600 a última amostra deve ser fácil para desenhar apenas a mais recente de dados.

Se você não tem um novo ponto de dados a cada 10 de um segundo você tem que vir acima com uma maneira de inserir um ponto de dados interpolados. Três opções vêm à mente:

  1. Repita o último ponto de dados.
  2. Insira um ponto de dados "vazio". Isso fará com que as lacunas no gráfico.
  3. Não atualizar o gráfico até o próximo ponto de dados chega. Em seguida, insira todos os pixels que você não chamar de uma vez, com interpolação linear entre os pontos de dados.

Para fazer o uso animação suave buffer duplo . Se a sua língua-alvo suporta uma tela Widget provavelmente suporta double-buffering.

Quando aproximo você tem as mesmas três opções acima, como os dados de pontos com zoom não são contínuos, mesmo que os originais de dados de pontos foram.

isso pode ajudar para a sua aplicação em Java.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top