procedure AALine(x1,y1,x2,y2 : single; color : tcolor; canvas : tcanvas);function CrossFadeColor(FromColor,ToColor : TColor; Rate : Single) : TColor;
var r,g,b : byte;
begin
 r:=Round(GetRValue(FromColor)*Rate+GetRValue(ToColor)*(1-Rate));
 g:=Round(GetGValue(FromColor)*Rate+GetGValue(ToColor)*(1-Rate));
 b:=Round(GetBValue(FromColor)*Rate+GetBValue(ToColor)*(1-Rate));
 Result:=RGB(r,g,b);
end;procedure hpixel(x : single; y : integer);
var FadeRate : single;
begin
   FadeRate:=x-trunc(x);
   with canvas do
   begin
     pixels[trunc(x),y]:=CrossFadeColor(Color,Pixels[Trunc(x),y],1-FadeRate);
     pixels[trunc(x)+1,y]:=CrossFadeColor(Color,Pixels[Trunc(x)+1,y],FadeRate);
   end;
end;procedure vpixel(x : integer; y : single);
var FadeRate : single;
begin
 FadeRate:=y-trunc(y);
 with canvas do
 begin
   pixels[x,trunc(y)]:=CrossFadeColor(Color,Pixels[x,Trunc(y)],1-FadeRate);
   pixels[x,trunc(y)+1]:=CrossFadeColor(Color,Pixels[x,Trunc(y)+1],FadeRate);
 end;
end;var i : integer;
   ly,lx,currentx,currenty,deltax,deltay,l,skipl : single;
begin
 if (x1<>x2) or (y1<>y2) then
 begin
   currentx:=x1;
   currenty:=y1;
   lx:=abs(x2-x1);
   ly:=abs(y2-y1);   if lx>ly then
   begin
     l:=trunc(lx);
     deltay:=(y2-y1)/l;
     if x1>x2 then
     begin
       deltax:=-1;
       skipl:=(currentx-trunc(currentx));
     end else
     begin
       deltax:=1;
       skipl:=1-(currentx-trunc(currentx));
     end;
   end else
   begin
     l:=trunc(ly);
     deltax:=(x2-x1)/l;
     if y1>y2 then
     begin
       deltay:=-1;
       skipl:=(currenty-trunc(currenty));
     end else
     begin
       deltay:=1;
       skipl:=1-(currenty-trunc(currenty));
     end;
   end;   currentx:=currentx+deltax*skipl;
   currenty:=currenty+deltay*skipl;{}   for i:=1 to trunc(l) do
   begin
     if lx>ly then vpixel(trunc(currentx),currenty) else hpixel(currentx,trunc(currenty));
     currentx:=currentx+deltax;
     currenty:=currenty+deltay;
   end; end;

解决方案 »

  1.   

    宽度不好改变,它是通过改变位置颜色实现的,
    for J:=1 to ... //在此循环中改变deltax,deltay值,在所画线两边再画线来改变宽度
    for i:=1 to trunc(l) do
       begin
         if lx>ly then vpixel(trunc(currentx),currenty) else hpixel(currentx,trunc(currenty));
         currentx:=currentx+deltax;
         currenty:=currenty+deltay;
       end;
    end;
      

  2.   

    http://218.56.11.178:8018/Upimage/186_蚂蚁线(装饰线).rar看是否是你想要的效果