要求绘制正弦曲线,并且能移动,还要能实现振幅的变化, 希望各位大哥帮忙啊!
解决方案 »
- dbGridEH 如何设置高度(不是行高)和显示的行数
- DELPHI+mysql
- 各位大侠,谁有xp风格控件呀,最好带源码的,谢谢了!
- 关于dbgrid的问题
- API更改注册表方面的问题,改变IP以后,在INTERNET(TCP/IP)-->高级里面出现有乱码的记录
- 紧急!怎么生成动态报表?
- Question_关于Table的删除问题_在线等
- c语言调用vcl控件,含事件处理
- 请教;我的delphi6.0中为什么不能打中文?
- 如何制作 类似于 Access 查询界面 的 TListBox控件的Item 可以拖到 另一个 TListBox (如图)
- Combobox控件的内容被删除的问题
- 对远程sql server2000表进行操作时requestlive属性怎样设置
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.
谢谢各位大哥的照顾,
像选中图形:在OnClick事件中判断MouseX,MouseY是否满足方程式abs(MouseY-H*sin(MouseX/L*2*Pi-T))<=2,就可以判定了
关于矢量存储请参考《Delphi4编程技术内幕》,里面有怎样将图形保存为wmf或EMF矢量文件的方法。