Suavização Eficiente Da Linha (Simplificar)

estou a criar uma aplicação de pintura em Actionscript (embora a minha pergunta não esteja relacionada com Actionscript). A idéia básica é começar a pintar quando o mouse é pressionado e rastrear os movimentos do mouse. O que eu quero é:

  1. reduzir o "ruído" do rato e
  2. Criar linhas mais suaves.

Neste momento, (1) é problemático porque eu recebo milhares de movimentos do rato em poucos segundos. Devido a (1) a linha pode parecer jaggy. Que ideia actual: quando o usuário termina de desenhar a linha, eu guardo todos os movimentos em um Array e reduzi-los (limiar médio) e, em seguida, usar um algoritmo de spline para recriar uma linha.

Alguma aproximação melhor?

Author: DIF, 2011-04-29

3 answers

Verajuste eficiente da curva por Sarah Frisken. Também disponível na página do autor .

 9
Author: lhf, 2015-05-04 10:55:19

(esbarrou na sua pergunta enquanto procurava o mesmo, e por acaso juntou algo Nosso)

Http://willowsystems.github.com/jSignature/#/about/linesmoothing/

(ligação SEO compatível com o mesmo: http://willowsystems.github.com/jSignature/%2523%252Fabout%252Flinesmoothing%252F.html)

O problema que descreve é duplo. 1. Você quer 'simplificar' os dados de captura. 2. Você quer desenhar uma linha bonita ('encaixar uma curva') dentro do ponto.

Simplifica.js citado acima é realmente bom, mas só lhe dá pontos. Para a jSignature queríamos um algoritmo super eficiente e não-retardado de ajuste de curvas.

Ver a ligação acima para a explicação de uma (nossa) abordagem à montagem (Bezier aka 'cúbic') de curvas entre pontos. Ele permite que você mantenha a linha que o usuário desenhou e apenas ficar na conexão das duas últimas coordenadas, ou você pode simplificar e redesenhar a linha inteira assim.

A nossa publicação do algoritmo foi intencional, como estabelecer "arte prévia" e excluir petentabilidade do método combinado. Isto significa que não colocamos o nosso próprio jugo de patente no algoritmo e, pesquisamos muito e não o encontramos patenteado em outro lugar. É claro que pode haver algum troll de patentes por aí que pode encontrar um problema com você implementando o método, mas, pelo menos, não nós. Bom apetite.)

A ligação de demonstração está a usar um salto de 4 pixels no movimento do rato. Isso é grosseiro, mas OK para a "simplificação" em tempo real dos dados. Se ter o luxo de capturar todo o curso e redesenhá-lo tudo, certamente, use simplificar.js.

 5
Author: ddotsenko, 2012-06-01 19:18:04

Mike Bostock tem alguns bons exemplos aquisimplificação da linha . Ele aponta que o algoritmo Douglas-Peucker é bem conhecido. No entanto O Visvalingam parece ser mais eficaz.

 2
Author: BozoJoe, 2014-10-28 17:46:33