procedure TForm1.Button1Click(Sender: TObject); var v:real; n,y1,x1,i, x0,y0:integer; begin for i:=20 to 220 do begin//1 form1.Canvas.Pixels [40,i]:=clred; end;//1 for i:=20 to 500 do begin//1 form1.Canvas.Pixels [i,120]:=clred; end;//1 x0:=40; y0:=120; for n:=0 to 400 do begin//1 v:=sin((2*pi*n)/200); y1:=round(y0-v*30); x1:=x0+n; form1.Canvas.Pixels [x1,y1]:=clblue; end;//1 end;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure DrawWaveline(x1,y1,x2,y2:integer); end;
var Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.DrawWaveline(x1, y1, x2, y2: integer); var Len,Cnt,DrawX,DrawY:integer; MaxY,Angle,Dangle:double;
function CalcLen(x1,y1,x2,y2:integer):integer; begin Result:=trunc(sqrt(Power(x1-x2,2)+power(y1-y2,2))); end;
procedure CalcXY(x,y:integer;Angle:double;var ratioX,ratioY:integer); begin ratioX:=x1+trunc(CalcLen(x1,y1,x,y)*cos(Angle)); ratioY:=y1+trunc(CalcLen(x1,y1,x,y)*sin(Angle)); end;
begin Len:=CalcLen(x1,y1,x2,y2); self.Canvas.MoveTo(x1,y1); self.Canvas.LineTo(x2,y2); self.Canvas.MoveTo(x1,y1); self.Canvas.Pen.Color:=clRed; if x2-x1=0 then angle:=pi/2 else angle:=arctan2(y2-y1,x2-x1); MaxY:=Len /20; for Cnt:=0 to Len-1 do begin DrawY:=Y1+trunc(sin(pi*Cnt/(MaxY*2))*MaxY); DrawX:=x1+cnt; if Drawx-x1=0 then Dangle:=pi/2 else Dangle:=arctan2(DrawY-y1,DrawX-x1); CalcXY(DrawX,DrawY,Dangle+angle,DrawX,DrawY); LineTo(self.Canvas.Handle,DrawX,DrawY); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin self.DrawWaveline(20,100,220,180); end;