
unit R29;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TRei29 = 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;
ScrollBar4: TScrollBar;
Edit4: TEdit;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure ScrollBar1Change(Sender: TObject);
procedure ScrollBar2Change(Sender: TObject);
procedure ScrollBar3Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ScrollBar4Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Rei29: TRei29;
St : Byte; //按钮控制,设置状态控制指示用变量
WX,WY : Byte;
X,Y,DX,DY,DD,CY: Integer; //X,Y 坐标用变量,DX,DY 坐标增量(变化量)用变量,
XTR,YTR,QTR,DR : Extended; //DR 弧度的变化量,
Col : TColor;
RectD : TRect;
implementation
{$R *.dfm}
procedure TRei29.FormCreate(Sender: TObject);
begin //设置初始值,
St := 0 ;
DD := 4;
WX := 140;
WY := 60;
CY := 1;
DR := Pi * DD / 180;
ScrollBar1.Position := DD;
ScrollBar2.Position := WX;
ScrollBar3.Position := WY;
ScrollBar4.Position := CY;
end;
procedure TRei29.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(DD) + '°'; //显示参数
Edit2.Text := ' ' + IntToStr(WX * 2);
Edit3.Text := ' ' + IntToStr(WY * 2);
Edit4.Text := ' ' + IntToStr(CY);
if Random(2) = 0 then //随机选择X 起点
begin
X := Image1.Width div 2 + WX;
XTR := Pi / 2;
end
else begin
X := Image1.Width div 2 - WX;
XTR := Pi / 2;
end;
Y := 0; //设置Y 起点
YTR := -Pi / 2;
St := 1;
end;
1: begin
QTR := XTR; //计算公式
XTR := XTR + DR;
DX := Round(WX * (Sin(XTR) - Sin(QTR)));
QTR := YTR;
YTR := YTR + DR * 2;
DY := Round(WY * (Sin(YTR) - Sin(QTR)));
X := X + DX; //取得 X,Y 坐标
Y := Y + DY + CY;
if DX >= 0 then
Col := clWhite
else
Col := clRed;
Image1.Canvas.Pixels[X,Y] := Col; //4点显示
Image1.Canvas.Pixels[X + 1,Y] := Col;
Image1.Canvas.Pixels[X,Y + 1] := Col;
Image1.Canvas.Pixels[X + 1,Y + 1] := Col;
if (Y > Image1.Width + WY) or (Y < -WY) then
St := 2;
end;
end;
end;
procedure TRei29.ScrollBar1Change(Sender: TObject);
begin
DD := ScrollBar1.Position;
Edit1.Text := ' ' + IntToStr(DD) + '°';
DR := 2 * Pi * DD / 180; //应该去掉这行,否则在绘图中会即时的改变
end; //似乎又不行,在状态1中,W,DY值都被在计算
// 所以这里只有同步重新计算DR值
procedure TRei29.ScrollBar2Change(Sender: TObject);
begin
WX := ScrollBar2.Position;
Edit2.Text := ' ' + IntToStr(WX * 2);
end;
procedure TRei29.ScrollBar3Change(Sender: TObject);
begin
WY := ScrollBar3.Position;
Edit3.Text := ' ' + IntToStr(WY * 2);
end;
procedure TRei29.ScrollBar4Change(Sender: TObject);
begin
CY := ScrollBar4.Position;
Edit4.Text := ' ' + IntToStr(CY);
end;
procedure TRei29.Button1Click(Sender: TObject);
begin
St := 0;
end;
end.
1,程序界面和结构和上例一样,多了一个滚动条来设置参数
2,钟摆线的计算公式看不明白,只是套用。
3,参数设置会让钟摆线变形,变成其他图案了。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/289373.html