EnableExplicit
Procedure.f trunc(X.f)
ProcedureReturn Int(X)
EndProcedure
Procedure.f frac(X.f)
ProcedureReturn (X - trunc(X))
EndProcedure
Procedure.f invfrac(X.f)
ProcedureReturn (1.0 - frac(X))
EndProcedure
Procedure.i DrawPixel( x.i, y.i, color.i )
Plot( x, y, RGB(color, color, color) ) ; you would need to perform bound checking in here, or use your own plotting routine...
EndProcedure
Procedure WuLine( x1.f, y1.f, x2.f, y2.f)
Define.i MaxPixelValue = 255
Define.f grad, xd, yd, length, xm, ym, xgap, ygap, xend, yend, xf, yf, brightness1, brightness2
Define.i x, y, ix1, ix2, iy1, iy2
Define.b c1, c2
xd = (x2-x1)
yd = (y2-y1)
If Abs(xd) > Abs(yd) ;-------------------- Horizontal --------------------
If x1 > x2
Swap x1, x2
Swap y1, y2
xd = (x2-x1)
yd = (y2-y1)
EndIf
grad = yd/xd
xend = trunc(x1+0.5)
yend = y1 + grad*(xend-x1)
xgap = invfrac(x1+0.5)
ix1 = Int(xend)
iy1 = Int(yend)
brightness1 = invfrac(yend) * xgap
brightness2 = frac(yend) * xgap
c1 = (brightness1 * MaxPixelValue)
c2 = (brightness2 * MaxPixelValue)
DrawPixel(ix1,iy1, c1)
DrawPixel(ix1,iy1+1, c2)
yf = yend+grad
xend = trunc(x2+0.5)
yend = y2 + grad*(xend-x2)
xgap = invfrac(x2-0.5)
ix2 = Int(xend)
iy2 = Int(yend)
brightness1 = invfrac(yend) * xgap
brightness2 = frac(yend) * xgap
c1 = (brightness1 * MaxPixelValue)
c2 = (brightness2 * MaxPixelValue)
DrawPixel(ix2,iy2, c1 )
DrawPixel(ix2,iy2+1, c2)
For x= (ix1+1) To (ix2-1)
brightness1 = invfrac(yf)
brightness2 = frac(yf)
c1 = (brightness1 * MaxPixelValue)
c2 = (brightness2 * MaxPixelValue)
DrawPixel(x,Int(yf), c1 )
DrawPixel(x,Int(yf)+1, c2)
yf = yf + grad
Next
Else ;-------------------- Vertical --------------------
If y1 > y2
Swap x1, x2
Swap y1, y2
xd = (x2-x1)
yd = (y2-y1)
EndIf
grad = xd/yd
yend = trunc(y1+0.5)
xend = x1 + grad*(yend-y1)
ygap = invfrac(y1+0.5)
ix1 = Int(xend)
iy1 = Int(yend)
brightness1 = invfrac(xend) * ygap
brightness2 = frac(xend) * ygap
c1 = (brightness1 * MaxPixelValue)
c2 = (brightness2 * MaxPixelValue)
DrawPixel(ix1,iy1, c1)
DrawPixel(ix1,iy1+1, c2)
xf = xend+grad
yend = trunc(y2+0.5)
xend = x2 + grad*(yend-y2)
ygap = invfrac(y2-0.5)
ix2 = Int(xend)
iy2 = Int(yend)
brightness1 = invfrac(xend) * ygap
brightness2 = frac(xend) * ygap
c1 = (brightness1 * MaxPixelValue)
c2 = (brightness2 * MaxPixelValue)
DrawPixel(ix2,iy2, c1 )
DrawPixel(ix2,iy2+1, c2)
For y= (iy1+1) To (iy2-1)
brightness1 = invfrac(xf)
brightness2 = frac(xf)
c1 = (brightness1 * MaxPixelValue)
c2 = (brightness2 * MaxPixelValue)
DrawPixel(Int(xf),y, c1 )
DrawPixel(Int(xf)+1,y, c2)
xf = xf + grad
Next
EndIf
EndProcedure