Come ottenere tratti e riempimenti per allineare i limiti dei pixel

1

Durante le indagini su come ottenere l'API grafica Cairo per disegnare una linea a pixel singolo, ho trovato questa spiegazione in le FAQ . Spiega perché spesso una linea a pixel singolo viene disegnata come una linea di mezza intensità di due pixel di larghezza.

The reason that cairo does it this way is so that fills align nicely, at the cost that some strokes do not. It is not possible to set up sample locations in a way so that both fills and strokes with integer coordinates work nicely, so one had to be preferred over the other. One argument in favor of preferring fills is that all fills with integer coordinates align nicely this way. The best that can be done with strokes is to make all even-integer-width strokes align nicely (as they do in cairo) or to make odd-integer-width strokes align (which would then break the fill alignment).

Dopo aver letto questa spiegazione, continuo a non capire perché questo sia un problema con la grafica in generale. Cosa significano per tratti di larghezza dispari che spezzano l'allineamento di riempimento? Perché è un tale problema avere sia il riempimento che il tratto allineati a interi pixel?

Suppongo di non capire veramente perché o come la larghezza del tratto influisca sul riempimento.

    
posta Malvineous 08.03.2015 - 11:34
fonte

1 risposta

1

Why is it such a problem to have both fill and stroke aligned to whole pixels?

Non è affatto un problema. Ma devi capire il sistema di coordinate usato e specificare le tue coordinate di conseguenza.

Qui, usa le coordinate integer per i riempimenti e le linee di larghezza pari, ma le coordinate dei punti medi dei pixel (cioè i numeri in virgola mobile che terminano con .5 ) per le linee con larghezza dispari.

I don't really understand why or how the stroke width affects the fill at all.

Non è la larghezza del tratto, è la scelta del sistema di coordinate. Scegliendo una griglia di coordinate allineata con i limiti dei pixel, i riempimenti delimitati dalle coordinate intere si allineano ai limiti dei pixel, mentre una linea centrata su una coordinata intera si estenderà ai pixel su entrambi i lati della linea della griglia. Per linee con larghezza 1, significa che la linea coprirà solo metà del pixel. Ovviamente, non è possibile riempire solo la metà di un pixel, quindi la linea verrà disegnata anti-aliasing, cioè l'intero pixel sarà riempito con mezza intensità.

    
risposta data 08.03.2015 - 13:47
fonte

Leggi altre domande sui tag