画反走样线的函数

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;
end;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值