Delphi 经典游戏程序设计40例 的学习 例28 残留的轨迹是正弦曲线
unit R28; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TRei28 = class(TForm) Panel1: TPanel; Button1: TButton; ScrollBar1: TScrollBar; ScrollBar2: TScrollBar; ScrollBar3: TScrollBar; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Image1: TImage; Timer1: TTimer; Edit3: TEdit; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure ScrollBar1Change(Sender: TObject); procedure ScrollBar2Change(Sender: TObject); procedure ScrollBar3Change(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Rei28: TRei28; St : Byte; //按钮控制,设置状态控制指示用变量 X,Y,DX,DY,C,W : Integer; //X,Y 坐标用变量,DX,DY 坐标增量(变化量)用变量,C 周期用变量,W 振幅用变量 DR,TR : Extended; //DR 弧度的变化量,TR 现在的弧度(总幅度) RectD : TRect; implementation {$R *.dfm} procedure TRei28.FormCreate(Sender: TObject); begin //设置初始值, St := 0 ; C := 140; W := 100; DY := 2; ScrollBar1.Position := C; ScrollBar2.Position := W; ScrollBar3.Position := DY; end; procedure TRei28.Timer1Timer(Sender: TObject); begin case St of 0: begin RectD := Rect(0,0,Image1.Width,Image1.Height); Image1.Canvas.Brush.Color := clBlack; Image1.Canvas.FillRect(RectD); //刷黑 Edit1.Text := ' ' + IntToStr(C); //显示参数 Edit2.Text := ' ' + IntToStr(W * 2); Edit3.Text := ' ' + IntToStr(DY); X := Image1.Width div 2; //X 起点,居中 Y := 0; //Y 起点 DR := 2 * Pi * DY / C; //弧度变化量 计算公式 if Random(2) = 0 then //设置初始弧度 TR := 0 else TR := Pi; St := 1; //进入下一状态 end; 1: begin DX := Round(W * (Sin(TR + DR) - Sin(TR))); //根据公式计算DX , TR := TR + DR; //弧度累加,为下次计算DX X := X + DX; Y := Y + DY; Image1.Canvas.Pixels[X,Y] := clWhite; Image1.Canvas.Pixels[X + 1,Y] := clWhite; if (Y > Image1.Width) then // 画到图底后进入停止状态 St := 2; end; end; end; procedure TRei28.ScrollBar1Change(Sender: TObject); begin C := ScrollBar1.Position; Edit1.Text := ' ' + IntToStr(C); DR := 2 * Pi * DY / C; //应该去掉这行,否则在绘图中会即时的改变 end; //似乎又不行,在状态1中,W,DY值都被在计算 // 所以这里只有同步重新计算DR值 procedure TRei28.ScrollBar2Change(Sender: TObject); begin W := ScrollBar2.Position; Edit2.Text := ' ' + IntToStr(W * 2); end; procedure TRei28.ScrollBar3Change(Sender: TObject); begin DY := ScrollBar3.Position; Edit3.Text := ' ' + IntToStr(DY); DR := 2 * Pi * DY / C; // 所以这里只有同步重新计算DR值 end; procedure TRei28.Button1Click(Sender: TObject); begin St := 0; end; end.
1,结构同 例 27
2,例27应用的是抛物线,本例才是三角函数。

浙公网安备 33010602011771号