Xiaolin Wu's line algorithm: Difference between revisions

Content deleted Content added
m rm preemptive dab'ing.,
No edit summary
Line 1:
'''Xiaolin Wu's line algorithm''' is an [[algorithm]] for line [[antialiasing]], which was presented in the article ''An Efficient Antialiasing Technique'' in the [[July]] [[1991]] issue of ''[[Computer Graphics]]'', as well as in the article ''Fast Antialiasing'' in the [[June]] [[1992]] issue of ''[[Dr. Dobb's Journal]]''.
 
Efficient Antialiasing Technique'' in the [[July]] [[1991]] issue of ''[[Computer Graphics]]'', as well as in the article
An extension to the algorithm for circle drawing was presented by Xiaolin Wu in the book ''Graphics Gems II''. Just like the line drawing algorithm is an replacement for of [[Bresenham's line algorithm]], the circle drawing algorithm is a replacement for Bresenham's circle drawing algorithm.
 
''Fast Antialiasing'' in the [[June]] [[1992]] issue of ''[[Dr. Dobb's Journal]]''.
 
[[Bresenham's line algorithm|Bresenham's algorithm]] draws lines extremely quickly, but it cannot perform anti-aliasing. In
 
addition, it cannot handle the case where the line endpoints do not lie exactly on integer points of the pixel grid. A
 
naïve approach to anti-aliasing the line would take an extremely long time, but Wu's algorithm is quite fast (It is
 
still slower than [[Bresenham's line algorithm|Bresenham's]], though. The basis of the algorithm is to draw pairs of pixels
 
straddling the line, coloured according to proximity. Pixels at the line ends are handled separately. Lines less than one
 
pixel long should be handled as a special case.
 
Here is [[pseudocode]] for the nearly-horizontal case (<math>&delta;x > &delta;y</math>). The extension to cover
 
nearly-vertical lines is trivial, and left as an exercise for the reader.
{{wikicode}}
<code>
'''function''' plot(x, y, c) {
plot the pixel at (x,y) with brightness c ''// where <math>0<=c<=1</math>''
}
'''function''' ipart(x) {
'''return''' ''integer part of x''
}
'''function''' round(x) {
'''return''' ipart(x + 0.5)
}
'''function''' fpart(x) {
'''return''' ''fractional part of x''
}
'''function''' rfpart(x) {
'''return''' 1 - fpart(x)
}
''// check that x<sub>1</sub> < x<sub>2</sub>''
'''if x<sub>2</sub> < x<sub>1</sub>
swap x<sub>1</sub>, x<sub>2</sub>
dx = x<sub>2</sub> - x<sub>1</sub>
dy = y<sub>2</sub> - y<sub>1</sub>
gradient = dy / dx
''// handle first endpoint''
xend = round(x<sub>1</sub>)
yend = y<sub>1</sub> + gradient * (xend - x<sub>1</sub>)
xgap = rfpart(x<sub>1</sub> + 0.5)
xpxl1 = xend
ypxl1 = ipart(yend)
brightness1 = rfpart(yend) * xgap
brightness2 = fpart(yend) * xgap
plot(xpxl1, ypxl1, brightness1)
plot(xpxl1, ypxl1+1, brightness2)
intery = yend + gradient ''// first y-intersection for later''
''// handle second endpoint''
xend = round(x<sub>2</sub>)
yend = y<sub>2</sub> + gradient * (xend - x<sub>2</sub>)
xgap = rfpart(x<sub>2</sub> - 0.5)
xpxl2 = xend
ypxl2 = ipart(yend)
brightness1 = rfpart(yend) * xgap
brightness2 = fpart(yend) * xgap
plot(xpxl2, ypxl2, brightness1)
plot(xpxl2, ypxl2+1, brightness2)
'''for''' x '''from''' xpxl1+1 '''to''' xpxl2-1 {
brightness1 = rfpart(intery)
brightness2 = fpart(intery)
plot(x, ipart(intery), brightness1)
plot(x, ipart(intery)+1, brightness2)
intery = intery + gradient
}
</code>
 
An extension to the algorithm for circle drawing was presented by Xiaolin Wu in the book ''Graphics Gems II''. Just like the
 
An extension to the algorithm for circle drawing was presented by Xiaolin Wu in the book ''Graphics Gems II''. Just like the line drawing algorithm is an replacement for of [[Bresenham's line algorithm]], the circle drawing algorithm is a replacement for Bresenham's circle drawing algorithm.
 
for Bresenham's circle drawing algorithm.
 
==References==
* {{Journal reference issue| Author=Abrash, Michael | Title=[http://www.whisqu.se/per/docs/graphics75.htm Fast Antialiasing]

(Column). | Journal=[[Dr. Dobb's Journal]] | Year=June 1992 | Volume=17 | Issue=6 | Pages=139(7)}}
* {{Journal reference issue| Author=Wu, Xiaolin | Title=[http://portal.acm.org/citation.cfm?id=122734 An efficient

antialiasing technique] | Journal=[[Computer Graphics]] | Year=July 1991 | Volume=25 | Issue=4 | Pages=143--152}} ISBN

0-89791-436-8.
* Wu, Xiaolin (1991). Fast Anti-Aliased Circle Generation. In James Arvo (Ed.),

''[http://print.google.com/print?id=Kw3YPvf8A-AC&pg=446&lpg=446&prev=http://print.google.com/print%3Fq%3Dwu%2Bcircle%2Balgorithm2Balgori

thm%26ie%3DUTF-8%26id%3DKw3YPvf8A-AC&sig=xFsWaJHNOOlbog9Rgk-3hbCvJws Graphics Gems II]''. pp. 446--?. San Francisco: Morgan

Kaufmann. ISBN 0-12-064480-0.
 
==External links==