Content deleted Content added
Has nobody ever tested this code? I fixed it using the same method as in the article 'Bresenham's line algorithm'. Maybe somebody has time to improve the code. It currently works, but my fix is not elegant at all. |
No edit summary |
||
Line 7:
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 a replacement for Bresenham's line drawing algorithm, the circle drawing algorithm is a replacement for Bresenham's circle drawing algorithm.
<syntaxhighlight lang="pascal">
plot the pixel at (x, y) with brightness c (where 0 ≤ c ≤ 1)
boolean steep := abs(y1 - y0) > abs(x1 - x0)
swap(x0, y0)
swap(x1, y1)
swap(x0, x1)
swap(y0, y1)
dx := x1 - x0
Line 39:
gradient := dy / dx
xend := round(x0)
yend := y0 + gradient * (xend - x0)
xgap := rfpart(x0 + 0.5)
xpxl1 := xend
ypxl1 := ipart(yend)
plot(ypxl1, xpxl1, rfpart(yend) * xgap)
plot(ypxl1+1, xpxl1, fpart(yend) * xgap)
plot(xpxl1, ypxl1 , rfpart(yend) * xgap)
plot(xpxl1, ypxl1+1, fpart(yend) * xgap)
intery := yend + gradient
▲ ''//handle second endpoint''
xend := round(x1)
yend := y1 + gradient * (xend - x1)
xgap := fpart(x1 + 0.5)
xpxl2 := xend
ypxl2 := ipart(yend)
plot(ypxl2 , xpxl2, rfpart(yend) * xgap)
plot(ypxl2+1, xpxl2, fpart(yend) * xgap)
plot(xpxl2, ypxl2, rfpart(yend) * xgap)
plot(xpxl2, ypxl2+1, fpart(yend) * xgap)
for x from xpxl1
if steep then
plot(ipart(intery) , x, rfpart(intery))
plot(ipart(intery)+1, x, fpart(intery))
plot(x, ipart (intery), rfpart(intery))
plot(x, ipart (intery)+1, fpart(intery))
intery = intery + gradient
</syntaxhighlight>
'''Note:''' If at the beginning of the routine abs(''dx'') < abs(''dy'') is true, then all plotting should be done with ''x'' and ''y'' reversed.
|