Rezgések

 

Ha kifeszített húrt, vagy egyik végén rögzített pálcát megpendítünk, akkor rajtuk állóhullámok jönnek létre, és hangot adnak.

 

Ha húrt pendítünk meg, akkor az állóhullámoknak a húr mindkét végén csomópontja van, ugyanis ezek rögzítve vannak, nem tudnak elmozdulni. A kialakuló állóhullámok hullámhossza csak olyan lehet, hogy a húr hossza a fél-hullámhossznak egész számú többszöröse. Ha egyik végén rögzített pálcát pendítünk meg, akkor a húr hossza a kialakuló állóhullámok negyed-hullámhosszának páratlanszám többszöröse (a rögzített végen csomópont, a szabad végnél duzzadási hely van).

 

Ez a program a most leírt jelenségeket demonstrálja. A húrt illetve a rudat kis átmérőjű fillezett körök alkotják, melyek mint objektumok önálló, de  egymással összehangolt, rögzített amplitúdójú rezgőmozgást végeznek, ezzel együttes hatásukban, a húr illetve a rúd rezgését szimulálják. Nyomógombok segítségével a frekvenciát növelhetjük, illetve csökkenthetjük, valamint egy radiogroup segítségével a jobb oldalon, a rögzített, illetve szabad vég között választhatunk.

 

         Egy húr rezgésének a maximális kitéréshez közeli állapota, amikor a fél-hullámhossznak az ötszöröse a húr hossza:

 

 

Egy rúd rezgésének a maximális kitéréshez közeli állapota, amikor a negyed-hullámhossznak a tizenegyszerese a húr hossza:

 

 

         A program listája:

 

unit URezgesek;

interface

uses
  Windows, MessagesSysUtilsVariantsClasses,

  GraphicsControlsFormsDialogsStdCtrlsExtCtrls;

type
  TfmRezgesek = class(TForm)
    lbRezgesekTLabel;
    tiIdozitoTTimer;
    btKilepesTButton;
    btFrekiIncTButton;
    btFrekiDecTButton;
    rgVegTRadioGroup;
    Procedure AtomInit;
    procedure FormCreate(SenderTObject);
    procedure tiIdozitoTimer(SenderTObject);
    procedure btKilepesClick(SenderTObject);
    procedure btFrekiIncClick(SenderTObject);
    procedure btFrekiDecClick(SenderTObject);
    procedure FormPaint(SenderTObject);
  private
    Private declarations }
  public
    Public declarations }
  end;

  TAtom = Class
    FcFhTColor;
    Fa, FxFy: Integer;
    FwFszReal;
    Procedure Init(Ic,IhTColorIa,Ix,Iy: Integer; Iw,IszReal);
    Procedure Show;
    Procedure Hide;
    Procedure Move;
    Private
       Ft: LongInt;
  End;

Const Max=600;
      Am=160;
      R=3;

var
  fmRezgesekTfmRezgesek;
  Xk,Yk: Integer;
  AT: Array[1..Max] Of TAtom;
  FrSz: Word;

implementation

{$R *.dfm}

Procedure TAtom.Init(Ic,IhTColorIa,Ix,Iy: Integer; Iw,IszReal);
Begin
  Fc:= IcFh:= Ih;
  Fa:= IaFx:= IxFy:= Iy;
  Fw:= IwFsz:= Isz;
  Ft:= 0;
End;

Procedure TAtom.Show;
Begin
  With fmRezgesek.Canvas Do
  Begin
    Brush.Color:= Fc;
    Pen.Color:= Fc;
    If R>0 Then
    Ellipse(Fx-R,Fy-R,Fx+R,Fy+R) Else
    Pixels[Fx,Fy]:= Fc;
  End;
End;

Procedure TAtom.Hide;
Begin
  With fmRezgesek.Canvas Do
  Begin
    Brush.Color:= Fh;
    Pen.Color:= Fh;
    If R>0 Then
    Ellipse(Fx-R,Fy-R,Fx+R,Fy+R) Else
    Pixels[Fx,Fy]:= Fh;
  End;
End;

Procedure TAtom.Move;
Begin
  Hide;
  Inc(Ft);
  Fy:= Yk+Round(Fa*Sin(Fw*Ft));
  Show;
End;

Procedure TfmRezgesek.AtomInit;
Var I: Word;
Begin
  With Canvas Do
  Begin
    Brush.Color:= clBtnFace;
    Pen.Color:= clBtnFace;
    Rectangle(Xk-Max Div 2-10,0, Xk+Max Div 2+10,Yk+Am+10);
    With Font Do
    Begin
      Color:= clBlue;
      Size:= 20;
    End;
    TextOut(Xk,20,FloatToStr(Fr*0.5));
  End;
  Sz:= 1+rgVeg.ItemIndex;
  For I:= 1 To Max Do
  AT[I].Init(clBlue,clBtnFace,
           Round(Am*Sin(I*Pi/(Sz*600/Fr))),
           Xk-(Max Div 2)+I,Yk,
           0.04,I);
End;

procedure TfmRezgesek.btKilepesClick(SenderTObject);
begin
  Close;
end;

procedure TfmRezgesek.FormPaint(SenderTObject);
begin
  With Canvas Do
  Begin
    With Font Do
    Begin
      Color:= clBlue;
      Size:= 20;
    End;
    TextOut(Xk,20,FloatToStr(Fr*0.5))
  End;
end;

procedure TfmRezgesek.FormCreate(SenderTObject);
Var I: Word;
begin
  rgVeg.ItemIndex:= 0;
  Xk:= ClientWidth Div 2;
  Yk:= ClientHeight Div 2;
  For I:= 1 To Max Do AT[I]:= TAtom.Create;
  Fr:= 1;
  AtomInit;
end;

procedure TfmRezgesek.btFrekiIncClick(SenderTObject);
begin
  Inc(Fr);
  If (rgVeg.ItemIndex=1) And Not Odd(FrThen Inc(Fr); AtomInit;
end;

procedure TfmRezgesek.btFrekiDecClick(SenderTObject);
begin
  If Fr>1 Then
  Begin
    Dec(Fr);
    AtomInit;
    If (rgVeg.ItemIndex=1) And Odd(FrThen Dec(Fr);
  End;
end;

procedure TfmRezgesek.tiIdozitoTimer(SenderTObject);
Var I: Word;
begin
  For I:= 1 To Max Do AT[I].Move;
end;

end.