要求绘制正弦曲线,并且能移动,还要能实现振幅的变化,   希望各位大哥帮忙啊!

解决方案 »

  1.   

    前两天做了一个横波与纵波的演示,应该是你要的。
    unit unit_main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        lTitle: TLabel;
        Timer1: TTimer;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        Panel2: TPanel;
        Panel3: TPanel;
        Image1: TImage;
        btnStart: TBitBtn;
        btnPause: TBitBtn;
        trbWaveLength: TTrackBar;
        cbKeyNode: TCheckBox;
        Label2: TLabel;
        lWaveLength: TLabel;
        Label3: TLabel;
        lWaveHeight: TLabel;
        trbWaveHeight: TTrackBar;
        Label4: TLabel;
        lSpeed: TLabel;
        trbSpeed: TTrackBar;
        Label5: TLabel;
        lFrameRate: TLabel;
        trbFrameRate: TTrackBar;
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btnStartClick(Sender: TObject);
        procedure btnPauseClick(Sender: TObject);
        procedure trbSpeedChange(Sender: TObject);
        procedure trbWaveLengthChange(Sender: TObject);
        procedure trbWaveHeightChange(Sender: TObject);
        procedure trbFrameRateChange(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        T,H,L,Speed : Real;
        Dot : Array [1..16] of TPoint ;
        Mode : (Horizontal,Vertical);  public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      x,y,i : integer ;
    begin
      //清除原有图形
      Image1.Canvas.Brush.Color := clWhite ;
      Image1.Canvas.FillRect(Image1.ClientRect);
      T := T + Speed ;  case Mode of   //横波
       Horizontal: begin    //设置画笔的颜色
        Image1.Canvas.Pen.Color := clRed ;    //画纵坐标轴
        Image1.Canvas.PenPos := Point(10,240);
        Image1.Canvas.LineTo(10,10);
        Image1.Canvas.PenPos := Point(10,10);
        Image1.Canvas.LineTo(8,15);
        Image1.Canvas.PenPos := Point(10,10);
        Image1.Canvas.LineTo(12,15);    //画横坐标轴
        Image1.Canvas.PenPos := Point(10,125);
        Image1.Canvas.LineTo(360,125);
        Image1.Canvas.PenPos := Point(360,125);
        Image1.Canvas.LineTo(355,123);
        Image1.Canvas.PenPos := Point(360,125);
        Image1.Canvas.LineTo(355,127);    //画T时刻的波形
        Image1.Canvas.Pen.Color := clBlack ;
        Image1.Canvas.Brush.Color := clBlue ;
        for x := 0 to 350 do begin
          y := Round(H* sin(x/L*2*Pi-T));
          if x= 0 then begin
            Image1.Canvas.PenPos := Point(10+x,125+y);
            if cbKeyNode.Checked then
              Image1.Canvas.Ellipse(10+x-3,125+Y-3,10+x+3,125+Y+3);
          end else Image1.Canvas.LineTo(10+x,125+y) ;
        end;
       end;  //画横波波形   //纵波
       Vertical : begin
        //画T时刻的波形
        Image1.Canvas.Pen.Color := clBlack ;
        Image1.Canvas.Brush.Color := clRed ;
         for i := 1 to 16 do begin
           X := Dot[i].X + Round(H*Sin( Dot[i].X/L*2*Pi-T )/5);
           if cbKeyNode.Checked and (i=8) then
             Image1.Canvas.Ellipse(X-6,Dot[i].Y-6,X+6,Dot[i].Y+6);
           if i = 1 then
             Image1.Canvas.PenPos := Point(X,Dot[i].Y)
           else
             Image1.Canvas.LineTo(X,Dot[i].Y);
         end;
       end;
      end;end;procedure TForm1.FormCreate(Sender: TObject);
    var
      i : integer;
    begin
      T := 0;
      trbFrameRate.Position := 25;
      trbWaveHeight.Position := 60;
      trbWaveLength.Position := 100;
      trbSpeed.Position := 5;  for i:= 1 to 16 do begin
        Dot[i].X := 10+i*20;
        if ODD(i) then Dot[i].Y := 50
        else Dot[i].Y := 200;
      end;  Mode := Horizontal;
    end;procedure TForm1.btnStartClick(Sender: TObject);
    begin
      Timer1.Enabled := True ;
    end;procedure TForm1.btnPauseClick(Sender: TObject);
    begin
      Timer1.Enabled := False;
    end;procedure TForm1.trbSpeedChange(Sender: TObject);
    begin
      Speed := trbSpeed.Position/100;
      lSpeed.Caption := Format('%f',[Speed]);
    end;procedure TForm1.trbWaveLengthChange(Sender: TObject);
    begin
      L := trbWaveLength.Position ;
      lWaveLength.Caption := IntToStr(trbWaveLength.Position);
    end;procedure TForm1.trbWaveHeightChange(Sender: TObject);
    begin
      H := trbWaveHeight.Position;
      lWaveHeight.Caption := IntToStr(trbWaveHeight.Position);
    end;procedure TForm1.trbFrameRateChange(Sender: TObject);
    begin
      Timer1.Interval := 1000 div trbFrameRate.Position ;
      lFrameRate.Caption := IntToStr(trbFrameRate.Position);
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
      lTitle.Caption := '纵波的演示';
      Mode := Vertical ;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      lTitle.Caption := '横波的演示';
      Mode := Horizontal ;
    end;end.
      

  2.   

    留个Email,我将原代码发给你。
      

  3.   

    也给我一个[email protected],thx :)
      

  4.   

    [email protected]
    谢谢各位大哥的照顾,
      

  5.   

    Haofei(昊飞):你写的已经够清楚了
      

  6.   

    邮件已发出,请收!另你的其它几个问题都比较容易解决,你自己实现吧,我这段时间比较紧,年终了吗!!!
    像选中图形:在OnClick事件中判断MouseX,MouseY是否满足方程式abs(MouseY-H*sin(MouseX/L*2*Pi-T))<=2,就可以判定了
    关于矢量存储请参考《Delphi4编程技术内幕》,里面有怎样将图形保存为wmf或EMF矢量文件的方法。