Task

Implement the   Xiaolin Wu's line algorithm   described in Wikipedia.



This algorithm draws anti-aliased lines.



Related task

   See   Bresenham's line algorithm   for aliased lines.


ClearAll[ReverseFractionalPart, ReplacePixelWithAlpha, DrawEndPoint, DrawLine]
ReverseFractionalPart[x_] := 1 - FractionalPart[x]
ReplacePixelWithAlpha[img_Image, pos_ -> colvals : {_, _, _}, 
  alpha_] := Module[{vals,},
  vals = PixelValue[img, pos];
  vals = (1 - alpha) vals + alpha colvals;
  ReplacePixelValue[img, pos -> vals]
  ]
DrawEndPoint[img_Image, pt : {x_, y_}, grad_, p_] := 
 Module[{xend, yend, xgap, px, py, i},
  xend = Round[x];
  yend = y + grad (xend - x);
  xgap = ReverseFractionalPart[x + 0.5];
  {px, py} = Floor[{xend, yend}];
  i = ReplacePixelWithAlpha[img, p[{x, py}] -> {1, 1, 1}, ReverseFractionalPart[yend] xgap];
  i = ReplacePixelWithAlpha[i, p[{x, py + 1}] -> {1, 1, 1}, FractionalPart[yend] xgap];
  {px, i}
  ]
DrawLine[img_Image, p1 : {_, _}, p2 : {_, _}] := 
 Module[{x1, x2, y1, y2, steep, p, grad, intery, xend, yend, x, y, 
   xstart, ystart, dx, dy, i},
  {x1, y1} = p1;
  {x2, y2} = p2;
  dx = x2 - x1;
  dy = y2 - y1;
  steep = Abs[dx] < Abs[dy];
  p = If[steep, Reverse[#], #] &;
  If[steep,
   {x1, y1, x2, y2, dx, dy} = {y1, x1, y2, x2, dy, dx}
   ];
  If[x2 < x1,
   {x1, x2, y1, y2} = {x2, x1, y2, y1}
   ];
  grad = dy/dx;
  intery = y1 + ReverseFractionalPart[x1] grad;
  {xstart, i} = DrawEndPoint[img, p[p1], grad, p];
  xstart += 1;
  {xend, i} = DrawEndPoint[i, p[p2], grad, p];
  Do[
   y = Floor[intery];
   i = ReplacePixelWithAlpha[i, p[{x, y}] -> {1, 1, 1}, ReverseFractionalPart[intery]];
   i = ReplacePixelWithAlpha[i, p[{x, y + 1}] -> {1, 1, 1}, FractionalPart[intery]];
   intery += grad
   ,
   {x, xstart, xend}
   ];
  i
  ]
image = ConstantImage[Black, {100, 100}];
Fold[DrawLine[#1, {20, 10}, #2] &, image, AngleVector[{20, 10}, {75, #}] & /@ Subdivide[0, Pi/2, 10]]