Un breve background: Sto lavorando a un'applicazione di disegno basata sul Web e uno degli strumenti che sto implementando è una matita spessa 1 pixel. Lo strumento consente all'utente di tracciare linee alias 1pz sul quadro.Disegno di linee con alias da 1 pixel di spessore in tempo reale
Per determinare dove l'utente sta disegnando nell'area di disegno, le coordinate del mouse vengono monitorate. Se si tiene premuto il mouse 1, il pixel su cui si trova il cursore cambierà. Essenzialmente funziona come lo strumento matita in Photoshop.
NOTA: l'algoritmo di Bresenham non funzionerà per questa situazione. Il mio input viene inviato in tempo reale, quindi non sto disegnando una riga da P0 a P1 in cui la distanza tra P0 e P1 è di molti pixel. In generale, P1 è un vicino di P0.
Il problema che sto avendo è che le mie linee risultanti non hanno un peso 1px perfettamente pulito. Ecco un esempio:
Si noti che entrambe le linee sono disegnate a mano, per cui v'è una certa varianza. La cosa interessante è che Photoshop è in grado di creare una rappresentazione 1px molto più pulita della linea che disegno. Il motivo per cui la mia linea sembra più sporca a causa di questo:
Quando si disegna con lo strumento nella mia domanda, i pixel rossi sono riempiti In Photoshop, i pixel rossi non lo sono. compilato. Ciò ha senso perché per spostarsi da un dato pixel a, ad esempio, al suo vicino sud-est, il vicino est o sud sarà probabilmente passato sopra. C'è una possibilità estremamente sottile che il cursore superi lo esattamente nell'angolo del vicino sud-est, evitando il disegno del pixel rosso, ma questo di solito non accade.
Quindi, la domanda che mi rimane è come Photoshop sia in grado di saltare i pixel rossi visualizzati nelle mie linee. L'unica cosa che potevo pensare era aspettare che due pixel venissero messi in coda prima di tracciarne uno, così saprei se un "corner-neighbour" è passato sopra. In quel caso non disegnerei il primo dei due pixel perché sarebbe equivalente a un pixel rosso nel mio diagramma. Ciò comporta il rischio di non disegnare un pixel previsto se l'utente disegna un pixel, sposta il cursore di un pixel verso sud e quindi di un pixel verso est. Entrambi i pixel dovrebbero essere disegnati, ma l'algoritmo direbbe il contrario.
Qualche idea? In che modo Photoshop può gestire questo problema?
Cosa succede quando si muove velocemente il mouse? Salta i pixel? –
@Hans Passant Sì, quando disegno velocemente ottengo linee simili a quelle che produce Photoshop. Ciò che è strano è che non è necessario disegnare rapidamente in Photoshop per saltare quei pixel indesiderati. – Xenethyl
Memorizza i punti del mouse in una polilinea. Non aggiunge un nuovo segmento ad esso quando può semplicemente estendere il precedente. –