Netezirea și/sau simplificarea eficientă a liniilor (Programare, Vector, Paint, Geometrie Computațională, Bezier, Grafică Vectorială)

justin a intrebat.

Creez un aplicație de pictură în Actionscript (deși întrebarea mea nu este legată de Actionscript). Ideea de bază este de a începe pictura atunci când mouse-ul este apăsat și de a urmări mișcările mouse-ului. Ceea ce vreau să realizez este:

  1. să reduc „zgomotul” mouse-ului și
  2. să creez linii cu aspect mai neted.

În momentul de față, (1) este problematică, deoarece primesc mii de mișcări ale mouse-ului în câteva secunde. Din cauza (1), linia poate avea un aspect zimțat. ce idee actuală: când utilizatorul termină de trasat linia, stochez toate mișcările într-un array și le reduc (prag median), apoi folosesc un algoritm spline pentru a recrea o linie.

Vreo abordare mai bună?

3 răspunsuri
lhf

Consultați Ajustarea eficientă a curbelor de Sarah Frisken. De asemenea, disponibil pe pagina autorului.

Comentarii

  • primul link pe care îl furnizați pare să fie stricat. mai există și alte linkuri către acesta? –  > Por Aneem.
  • @Aneem, vezi dx.doi.org/10.1080/2151237X.2008.10129260 și sarahfrisken.com/efficientCurveFitting.pdf. –  > Por lhf.
  • am avut ceva dificultăți în a înțelege părțile referitoare la câmpurile de distanțe vectoriale, știți cumva dacă există o implementare a acestui cod pentru vizualizare undeva? –  > Por Aneem.
  • Nu este acesta sub brevet de la Mitsubishi Laboratories? –  > Por nicholaswmin.
ddotsenko

(am dat peste întrebarea dvs. în timp ce căutam același lucru și am pus laolaltă ceva al nostru)

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

(Link compatibil SEO către același lucru:http://willowsystems.github.com/jSignature/%2523%252Fabout%252Flinesmoothing%252F.html)

Problema pe care o descrieți este dublă.1. Doriți să „simplificați” datele de captură.2. Doriți să trasați o linie cu aspect plăcut („potriviți o curbă”) în interiorul punctelor.

Simplify.js citat mai sus este într-adevăr bun, dar vă oferă doar puncte. Pentru jSignature am vrut un algoritm de ajustare a curbelor super-eficient și fără întârzieri.

A se vedea linkul de mai sus pentru o explicație a unei abordări (a noastră) de ajustare a curbelor (Bezier aka „cubice”) între puncte. Aceasta vă permite să păstrați linia trasată de utilizator și să conectați doar ultimele 2 coordonate, sau puteți simplifica și redesena întreaga linie în acest fel.

(Publicarea de către noi a algoritmului a fost intenționată, pentru a stabili „arta anterioară” și a exclude petentabilitatea metodei combinate. Aceasta înseamnă că nu punem propriul nostru jug de brevetare pe algoritm și, am căutat intens și nu am găsit să fie brevetat în altă parte. Desigur, poate exista un trol de brevete care să găsească o problemă în ceea ce privește punerea în aplicare a metodei, dar, cel puțin, nu și noi. Așa că, bucurați-vă).

Linkul demonstrativ folosește un salt de 4 pixeli la mișcarea mouse-ului. Acest lucru este rudimentar, dar este OK pentru „simplificarea” în timp real a datelor. Dacă vă permiteți luxul de a capta întregul traseu și de a redesena totul, cu siguranță, folosiți simplify.js.

Comentarii

  • Aveți un exemplu curat al algoritmului în cauză? Ceva care să poată fi apelat pentru 4 puncte și să returneze un bezier ajustat? –  > Por nicholaswmin.
BozoJoe

Mike Bostock are câteva exemple bune aici Simplificarea liniilor. El subliniază că Douglas-Peucker este bine cunoscut. Cu toate acestea, Visvalingam pare a fi mai eficient.