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 é:
- reduzir o "ruído" do rato e 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?3 answers
Verajuste eficiente da curva por Sarah Frisken. Também disponível na página do autor .
(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.
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.