Мне лень разбираться в этих ваших китайских алгоритмах, могу предложить рисование кольца с затухающей по краям альфой, при w = 2 результат аналогичен алгоритму Ву. Конечно, рисует медленнее (в 2-2.5 раза), поскольку это более универсальное решение.
Закомментированный фрагмент без Sqrt работает немного быстрее, но кольцо получается не совсем симметричное (заметно на большой толщине).
procedure DrawCircleW(Dst : TFastDIB; cx, cy, r, w : Single; c : DWord);
Var y, sy, ey, BytesPP, Alpha : Integer;
xf, xf2, r2, r2Min, r2Max, y2 : Single;
ca : TFColorA;
procedure DrawPixRange(sx, ex, y : Integer);
Var x, a, ia : Integer;
sy, d, w2, aw, aw2 : Single;
pc : PFColor;
begin
Num_InRange(sx, 0, Dst.Width-1); Num_InRange(ex, 0, Dst.Width-1);
pc := Dst.Scanlines[y]; Inc(PByte(pc), sx * BytesPP);
sy := Sqr(y - cy);
aw := Alpha / w;
w2 := (r2Max - r2Min) * 0.5; aw2 := Alpha / w2;
For x:=sx to ex do begin
d := Abs(Sqrt(Sqr(x - cx) + sy) - r);
If (d < w) then begin
ia := Round(d * aw);
a := 255 - ia;
pc.b := (pc.b * ia + ca.b * a) shr 8;
pc.g := (pc.g * ia + ca.g * a) shr 8;
pc.r := (pc.r * ia + ca.r * a) shr 8;
end;
Inc(PByte(pc), BytesPP);
end;
end;
begin
w := w * 0.5;
BytesPP := Dst.Bpp shr 3;
ca := TFColorA(c);
Alpha := ca.a; If (Alpha = 0) then Alpha := $FF;
sy := Trunc(cy - r - w); Num_InRange(sy, 0, Dst.AbsHeight-1);
ey := Ceil(cy + r + w); Num_InRange(ey, 0, Dst.AbsHeight-1);
r2Min := Sqr(r - w); r2Max := Sqr(r + w);
r2 := r * r;
For y := sy to ey do begin
y2 := Sqr(y-cy);
If y2 <= r2Max then begin
xf := Sqrt( r2Max - y2 );
If y2 > r2Min then DrawPixRange(Trunc(cx-xf), Ceil(cx+xf), y) else begin
xf2 := Sqrt( r2Min - y2 );
DrawPixRange(Trunc(cx-xf), Ceil(cx-xf2), y);
DrawPixRange(Trunc(cx+xf2), Ceil(cx+xf), y);
end;
end;
end;
end;