掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
単振動のシミュレーション (ID:40036)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
基本こんな形でどうですか。使うコンポはForm,PaintBox,Timer,Buttonです。 Buttonを押したら最初にy軸並びの○を描いて、それからタイマースタート。 タイマーが動き出したら、タイマーイベントで○を再描画しています。 画面のちらつきとか、スタート/ストップで一旦画面消去するとか、色々やることは 有りますので、そこは頑張ってみてください。 unit Unit1; interface uses Forms, ExtCtrls, Controls, Classes, StdCtrls, Graphics; Type TForm1 = class(TForm) Button1: TButton; PaintBox1: TPaintBox; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private 宣言 } FOx, FOy : Integer; //原点 Ex,Ey,Phi : Extended; PerX, PerY : integer; //表示倍率 iCount : integer; function RealToDispX(x1: Extended): Integer; function RealToDispY(y1: Extended): Integer; procedure FDrawShm(x: integer; Phi: Extended); public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} function TForm1.RealToDispX(x1: Extended): Integer; begin Result := Round(FOx + x1 * PerX); end; function TForm1.RealToDispY(y1: Extended): Integer; begin Result := Round(FOy - y1 * PerY); end; procedure TForm1.FDrawShm(x:integer; Phi: Extended); var y :extended; begin y := sin(Phi-Pi/20); with PaintBox1.Canvas do begin Brush.Color:=clBtnFace; //背景で上書きして Pen.Color := clBtnFace; //消去の代わり MoveTo( RealToDispX(x),RealToDispY(y) ); Ellipse( RealToDispX(x)-10, RealToDispY(y)-10, RealToDispX(x)+10, RealToDispY(y)+10 ); y := sin(Phi); Pen.Color := clGreen; if x Mod 5 = 0 then Brush.Color := clRed else Brush.Color := clBlack; MoveTo( RealToDispX(x),RealToDispY(y) ); Ellipse( RealToDispX(x)-10, RealToDispY(y)-10, RealToDispX(x)+10, RealToDispY(y)+10 ); end; end; procedure TForm1.FormCreate(Sender: TObject); begin iCount:= 0; //初期値の設定 FOx := 100; FOy := 200; PerX := 20; Pery := 100; Phi := 0; Ex := 0; end; procedure TForm1.Timer1Timer(Sender: TObject); var i: Integer; begin Phi := Phi + Pi/20; for i:=0 to iCount do FDrawShm(i, Phi-i*(Pi/20)); if iCount<40 then inc(iCount) end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin with PaintBox1.Canvas do begin Pen.Color := clGreen; for i := 0 to 40 do begin Ey := sin(Phi); MoveTo( RealToDispX(Ex),RealToDispY(Ey) ); if i Mod 5 = 0 then Brush.Color := clRed else Brush.Color := clBlack; Ellipse( RealToDispX(Ex)-10, RealToDispY(Ey)-10, RealToDispX(Ex)+10, RealToDispY(Ey)+10 ); Ex := Ex + 1; end; end; Phi := 0; Timer1.Enabled:=true; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.