Ho bisogno di un algoritmo che può essere (un po ') più lento dello Bresenham line drawing algorithm ma deve essere molto più preciso. Con "esatto" intendo: ogni pixel sfiorato dovrebbe essere stampato. Non più, ma anche niente di meno! Ciò significa che l'utilizzo di una linea più spessa o simile non è un'opzione in quanto saranno coinvolti troppi pixel. Inoltre non ho bisogno di un quadro grafico o simile come fosse askedbefore, ho bisogno dell'algoritmo! L'applicazione non è propriamente nella 'grafica' è nello geography area dove i pixel sono 'tessere'.Algoritmo di disegno della linea subpixel preciso (algoritmo di rasterizzazione)
Il problema principale per me è che ho bisogno di precisione subpixel, il che significa che una linea potrebbe iniziare a 0,75/0,33 e non solo a 0/0, come nel caso dei valori interi. Ho provato a creare una soluzione funzionante per le ultime ore ma non riesco a farlo funzionare - ci sono troppi casi limite.
primo momento ho pensato una versione anti-aliasing, come l'algoritmo da Wu dovrebbe fare, ma esso stampa troppi pixel (soprattutto per i punti iniziali e finali) e, in alcuni casi manca ancora qualche pixel per esempio per linee molto brevi
Poi ho provato a far funzionare Bresenham dove ho sostituito il secondo 'se' con 'else if' come indicato here, ed è più vicino ma non ancora lì. Poi ho provato a spostare il Bresenham da intero a precisione a virgola mobile che ha provocato un loop infinito (mentre i valori x, y saltavano sopra la condizione di fine if (y1 == y2 && x1 == x2)
).
Posso usare la soluzione naive line drawing ma quale delta
devo usare? Per esempio. se uso 0.1 mi mancheranno ancora alcuni pixel e usando valori più piccoli probabilmente impiegheranno troppo tempo (e mancheranno ancora i pixel).
Una soluzione di lavoro in C/Java/... sarebbe apprezzata. Almeno dovrebbe funzionare per l'ottante 1, ma una soluzione completa sarebbe ancora più bella.
Aggiornamento: Mi è venuta in mente la seguente idea: utilizzando la rasterizzazione della linea naive è possibile calcolare 4 candidati pixel per ogni punto. Quindi controlla quei 4 pixel se la linea li incrocia davvero. Ma non sono sicuro che l'intersezione di linea/riquadro possa essere abbastanza veloce.
"ogni pixel toccato deve essere stampato" anche se 0.01 di un pixel o meno si interseca con la linea? Quale forma prendono entrambe le estremità della linea (rotonda, concava, convessa, piatta)? – Tarik
sì, se è presente un'intersezione matematico dovrebbe essere inclusa (ovviamente possiamo supporre l'errore di arrotondamento comune). Le estremità della linea dovrebbero essere piatte (niente lanugine o antialiasing, solo la fine "matematica") – Karussell
e il colore? è la costante del colore della linea o deve essere interpolata in base all'area utilizzata del pixel come fa l'anti-aliasing? – Spektre