this slowpoke moves

Calculate Graphical Interference Waves

Edit1 = 1.Wellenlänge 
Edit2 = 2.Wellenlänge 
Edit3 = Abstand 
Edit4 = Intensität
uses ComCtrls, ExtCtrls

private
	{ Private-Deklarationen }
    interferenzbit:tbitmap;
    superphase:real;
    abbruch:boolean;
    
//

function ein_int(const edit:tedit):integer;
var kk:string;
    x,code:integer;
begin
    kk:=edit.text;
    val(kk,x,code);
    ein_int:=x;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var alpha,beta,mx1,mx2,c1,c2,a1,a2,w,staerke:real;
    b,h:integer;
    i,j,farbe,qq:integer;
    rowrgb,rowrgb2 : pbytearray;
begin
    mx1:=-ein_int(edit3)/10;
    mx2:=-mx1;
    alpha:=ein_int(edit1);
    beta:=ein_int(edit2);
    staerke:=ein_int(edit4)/10;

    b:=interferenzbit.width div 2;
    h:=interferenzbit.height div 2;
    interferenzbit.pixelformat:=pf32bit;
    j:=0;
    repeat
       rowrgb:=interferenzbit.scanline[j];
       rowrgb2:=interferenzbit.scanline[2*h-j-1];
       c2:=sqr(0.01*(j-h));
       i:=0;
       repeat
          c1:=0.01*(i-b);
          a1:=sqrt(sqr(mx1-c1)+c2);
          a2:=sqrt(sqr(mx2-c1)+c2);
          w:=2.0*(sin(alpha*a1+superphase)+staerke*sin(beta*a2))/(staerke+1);
          farbe:=round(127+63*w);

          qq:=4*i;
          rowrgb[qq]:=farbe;
          rowrgb[qq+1]:=farbe;
          rowrgb[qq+2]:=farbe;
          rowrgb2[qq]:=farbe;
          rowrgb2[qq+1]:=farbe;
          rowrgb2[qq+2]:=farbe;
          inc(i);
       until (i>2*b);
       inc(j);
    until j>h;
    paintbox1.canvas.draw(0,0,interferenzbit);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
    superphase:=0;
    abbruch:=true;
    interferenzbit:=tbitmap.create;
    interferenzbit.width:=paintbox1.width;
    interferenzbit.height:=paintbox1.height;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    interferenzbit.free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    if not abbruch then
    begin
      abbruch:=true;
      exit;
    end;
    button1.enabled:=false;
    button2.caption:='Abbruch';
    abbruch:=false;
    repeat
      paintbox1paint(sender);
      application.processmessages;
      superphase:=superphase-0.5;
    until abbruch;
    button2.caption:='Phase 1 ändern';
    button1.enabled:=true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    if not abbruch then
    begin
      abbruch:=true;
      exit;
    end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
    if interferenzbit<>nil then interferenzbit.free;
    interferenzbit:=tbitmap.create;
    interferenzbit.width:=paintbox1.width;
    interferenzbit.height:=paintbox1.height;
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate