Articulo de referencia

Algoritmo de línea de Xiaolin Wu

Demostración del algoritmo de Xiaolin Wu El algoritmo de línea de Xiaolin Wu es un algoritmo para suavizar las líneas . Líneas anti-alias (azules) generadas con el algoritmo de ...

Demostración del algoritmo de Xiaolin Wu

El algoritmo de línea de Xiaolin Wu es un algoritmo para suavizar las líneas .

Líneas anti-alias (azules) generadas con el algoritmo de línea de Xiaolin Wu junto con líneas estándar (rojas) generadas con el algoritmo de línea de Bresenham

Técnica de antialiasing

El algoritmo de línea de Xiaolin Wu fue presentado en el artículo "Una técnica de antialiasing eficiente" en la edición de julio de 1991 de Computer Graphics , así como en el artículo "Antialiasing rápido" en la edición de junio de 1992 de Dr. Dobb's Journal .

El algoritmo de Bresenham dibuja líneas con gran rapidez, pero no realiza anti-aliasing. Además, no puede manejar ningún caso en el que los puntos finales de la línea no se encuentren exactamente en puntos enteros de la cuadrícula de píxeles. Un enfoque ingenuo para anti-aliasing de la línea llevaría muchísimo tiempo. El algoritmo de Wu es comparativamente rápido, pero sigue siendo más lento que el algoritmo de Bresenham. El algoritmo consiste en dibujar pares de píxeles a lo largo de la línea, cada uno coloreado según su distancia a la línea. Los píxeles en los extremos de la línea se manejan por separado. Las líneas de menos de un píxel de longitud se manejan como un caso especial.

Xiaolin Wu presentó una extensión del algoritmo para dibujar círculos en el libro Graphics Gems II . Así como el algoritmo de dibujo de líneas reemplaza al algoritmo de dibujo de líneas de Bresenham, el algoritmo de dibujo de círculos reemplaza al algoritmo de dibujo de círculos de Bresenham.

Algoritmo

La gráfica de función ( x , y , c ) es    
    Grafique el píxel en ( x , y ) con brillo c ( donde 0 c 1 )              

// parte entera de x
La función ipart ( x ) es  
    volver piso ( x ) 

La función redondear ( x ) es  
    devolver ipart ( x + 0.5 )   

// parte fraccionaria de x
La función fpart ( x ) es  
    devolver x - ipart ( x )   

La función rfpart ( x ) es  
    devolver 1 - fpart ( x )   

La función drawLine ( x0 , y0 , x1 , y1 ) es  
    función booleana empinada := abs ( y1 - y0 ) > abs ( x1 - x0 )         
    
    Si es empinado entonces  
        intercambiar ( x0 , y0 ) 
        intercambiar ( x1 , y1 ) 
    terminar si 
    Si x0 > x1 entonces    
        intercambiar ( x0 , x1 ) 
        intercambiar ( y0 , y1 ) 
    terminar si 
    
    dx := x1 - x0    
    dy := y1 - y0    

    si dx == 0.0 entonces    
        gradiente := 1.0  
    demás
        gradiente := dy / dx    
    terminar si 

    // manejar el primer punto final
    xend := redondear ( x0 )  
    yend := y0 + gradiente * ( xend - x0 )        
    xgap := rfpart ( x0 + 0.5 )    
    xpxl1 := xend // esto se usará en el bucle principal   
    ypxl1 := ipart ( yend )  
    Si es empinado entonces  
        gráfico ( ypxl1 , xpxl1 , rfpart ( yend ) * xgap )      
        gráfico ( ypxl1 + 1 , xpxl1 , fpart ( yend ) * xgap )     
    demás
        gráfico ( xpxl1 , ypxl1 , rfpart ( yend ) * xgap )      
        gráfico ( xpxl1 , ypxl1 + 1 , fpart ( yend ) * xgap )     
    terminar si 
    intery := yend + gradient // primera intersección y para el bucle principal     
    
    // manejar el segundo punto final
    xend := redondear ( x1 )  
    yend := y1 + gradiente * ( xend - x1 )        
    xgap := fpart ( x1 + 0.5 )    
    xpxl2 := xend //esto se usará en el bucle principal   
    ypxl2 := ipart ( yend )  
    Si es empinado entonces  
        gráfico ( ypxl2 , xpxl2 , rfpart ( yend ) * xgap )      
        gráfico ( ypxl2 + 1 , xpxl2 , fpart ( yend ) * xgap )     
    demás
        gráfico ( xpxl2 , ypxl2 , rfpart ( yend ) * xgap )     
        gráfico ( xpxl2 , ypxl2 + 1 , fpart ( yend ) * xgap )    
    terminar si 
    
    // bucle principal
    Si es empinado entonces  
        para x desde xpxl1 + 1 hasta xpxl2-1 hacer          
           comenzar
                trama ( ipart ( intery ) , x , rfpart ( intery ))    
                trama ( ipart ( intery ) + 1 , x , fpart ( intery ))   
                interesante := interesante + gradiente    
           fin
    demás
        para x desde xpxl1 + 1 hasta xpxl2-1 hacer          
           comenzar
                trama ( x , ipart ( intery ) , rfpart ( intery ))   
                trama ( x , ipart ( intery ) + 1 , fpart ( intery ))  
                interesante := interesante + gradiente    
           fin
    terminar si 
función final 

Referencias

  • Abrash, Michael (junio de 1992). "Antialiasing rápido (columna)". Revista del Dr. Dobb . 17 (6): 139(7).
  • Wu, Xiaolin (julio de 1991). "Una técnica de antialiasing eficiente". ACM SIGGRAPH Computer Graphics . 25 (4): 143–152. doi :10.1145/127719.122734. ISBN 0-89791-436-8.
  • Wu, Xiaolin (1991). "Generación rápida de círculos antialias". En James Arvo (ed.). Graphics Gems II . San Francisco: Morgan Kaufmann. págs. 446–450. ISBN 0-12-064480-0.
  • Página de inicio de Xiaolin Wu
  • Página de inicio de Xiaolin Wu en la Universidad McMaster
Retrieved from "https://en.wikipedia.org/w/index.php?title=Xiaolin_Wu%27s_line_algorithm&oldid=1219891190"