RSS    

   Реферат: Исследование и моделирование с помощью компьютера электрических полей

 If Qc[X,Y]>0 then Form1.Canvas.Brush.Color:=clRed

              else Form1.Canvas.Brush.Color:=clBlue;

 Circle(X*25+13,Y*25+13,Abs(4*Qc[X,Y])-1,0);

End;

Procedure Circle(X,Y,R:Real;W:Byte);

Begin

 If W=0 then Form1.Canvas.Ellipse(Round(X-R),Round(Y-R),Round(X+R),Round(Y+R));

 If W=1 then Form1.Image1.Canvas.Ellipse(Round(X-R),Round(Y-R),Round(X+R),Round(Y+R));

End;

Procedure RefreshStatus(X,Y:Byte);

Var Q:Integer;

    St:String;

Begin

 Form1.StatusBar1.Panels.Items[0].Text:='';

 Form1.StatusBar1.Panels.Items[1].Text:='';

 Form1.StatusBar1.Panels.Items[2].Text:='';

 If Qc[X,Y]=0 then Exit;

 Q:=Abs(Qc[X,Y])-1;

 Q:=Round(Exp(Q*Ln(2)));

 If Qc[X,Y]<0 then Q:=-Q;

 St:='X = '+IntToStr(X*25+13)+'('+IntToStr(X)+')'; Form1.StatusBar1.Panels.Items[0].Text:=St;

 St:='Y = '+IntToStr(Y*25+13)+'('+IntToStr(Y)+')'; Form1.StatusBar1.Panels.Items[1].Text:=St;

 St:='Q = '+IntToStr(Q)+'q';                       Form1.StatusBar1.Panels.Items[2].Text:=St;

End;

Procedure PaintLines;

Var I,P:Integer;

    B,E:LongWord;

Begin

 B:=DateTimeToTimeStamp(Now).Time;

 Form1.StatusBar1.Panels.Items[4].Text:='Рисование линий напряженности... Пожалуйста, подождите...';

 Prepare;

 ElRefresh;

 Form1.Image1.Repaint;

 Form1.Image1.Canvas.Pen.Color:=clSilver;

 For I:=1 to Nc do If Qrc[I,3]<0 then begin

  If Qrc[I,3]=-1 then For P:=1 to Z   do ElTrack(Qrc[I,1]+3*Cos(((P-1)*360/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*360/Z)*Pi/180),I,1);

  If Qrc[I,3]=-2 then For P:=1 to 2*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*180/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*180/Z)*Pi/180),I,1);

  If Qrc[I,3]=-4 then For P:=1 to 4*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*90/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*90/Z)*Pi/180),I,1);

  Form1.Image1.Repaint;

 end;

 For I:=1 to Nc do If Qrc[I,3]>0 then begin

  If Qrc[I,3]=1 then For P:=1 to Z   do ElTrack(Qrc[I,1]+3*Cos(((P-1)*360/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*360/Z)*Pi/180),I,-1);

  If Qrc[I,3]=2 then For P:=1 to 2*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*180/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*180/Z)*Pi/180),I,-1);

  If Qrc[I,3]=4 then For P:=1 to 4*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*90/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*90/Z)*Pi/180),I,-1);

  Form1.Image1.Repaint;

 end;

 ElRefresh;

 E:=DateTimeToTimeStamp(Now).Time;

 Form1.StatusBar1.Panels.Items[4].Text:='Готово...';

 Form1.StatusBar1.Panels.Items[3].Text:=FloatToStr((E-B)/1000)+' сек';

End;

Procedure Prepare;

Var I,P,Q:SmallInt;

Begin

 Form1.Image1.Align:=alClient;

 Form1.Image1.Canvas.Brush.Color:=clBlack;

 Form1.Image1.Canvas.FillRect(Rect(0,0,Form1.Image1.Width,Form1.Image1.Height));

 For I:=1 to Nc do For P:=1 to 3 do Qrc[I,P]:=0; Nc:=0;

 For I:=0 to 63 do For P:=0 to 47 do

  If Qc[I,P]<>0 then begin

   Inc(Nc);

   Qrc[Nc,1]:=I*25+13;

   Qrc[Nc,2]:=P*25+13;

    Q:=Abs(Qc[I,P])-1;

    Q:=Round(Exp(Q*Ln(2)));

    If Qc[I,P]<0 then Q:=-Q;

   Qrc[Nc,3]:=Q;

  end;

End;

Procedure ElTrack(X,Y:Real;B,K:Integer);

Var U,Vx,Vy,Dx,Dy,Deg:Real;

    I,P,Num:Integer;

    Br,Alr:Boolean;

Begin

 Num:=0; Br:=False; Alr:=False;

 SetLength(Last,0);

 While (X>0) and (Y>0) and (X<Form1.Width) and (Y<Form1.Height) do begin

  Vx:=0; Vy:=0; Deg:=0;

  For I:=1 to Nc do begin

   Dx:=Qrc[I,1]-X;

   Dy:=Qrc[I,2]-Y;

   Deg:=Sqrt(Dx*Dx+Dy*Dy);

   If (Deg<3) and (I<>B) then Break;

   Deg:=Deg*Deg*Deg;

   Vx:=Vx+(K*Qrc[I,3]*Dx/Deg);

   Vy:=Vy+(K*Qrc[I,3]*Dy/Deg);

  end;

  If (Deg<3) and (I<>B) then Break;

  U:=1; If Sqrt(Vx*Vx+Vy*Vy)=0 then Break;

  If Sqrt(Vx*Vx+Vy*Vy)<>0 then U:=1/Sqrt(Vx*Vx+Vy*Vy);

  Vx:=U*Vx; Vy:=U*Vy; X:=X+Vx; Y:=Y+Vy;

  For I:=0 to Num-1 do If (Last[I,1]=Round(X)) and (Last[I,2]=Round(Y)) and (I<Num-3) then begin

   If Form2.RadioButton3.Checked=True then Exit;

   If Form2.CheckBox1.Checked=True then begin

    For P:=0 to Length(E0)-1 do

    If (Abs(Round(X)-E0[P].X)<=1) and (Abs(Round(Y)-E0[P].Y)<=1) then begin

     Alr:=True; Break; end;

    If Alr=False then begin

     with Form1.Image1.Canvas do begin

      Brush.Style:=bsClear; Pen.Color:=clYellow;

      Ellipse(Round(X-5),Round(Y-5),Round(X+5),Round(Y+5));

      Font.Color:=clYellow;

      TextOut(Round(X-8),Round(Y+6),'E=0');

      Pen.Color:=clSilver;

     end;

     SetLength(E0,Length(E0)+1);

     E0[Length(E0)-1].X:=Round(X); E0[Length(E0)-1].Y:=Round(Y);

     end;

    end;

   Br:=True;

   If Form2.RadioButton4.Checked=True then Break;

  end;

  If Br=True then Break;

  Inc(Num); SetLength(Last,Num);

  Last[Num-1,1]:=Round(X); Last[Num-1,2]:=Round(Y);

 End;

 If (Br=True) and (Form2.CheckBox2.Checked=True) and (Form2.RadioButton4.Checked=True) then

    Form1.Image1.Canvas.Pen.Color:=clYellow else Form1.Image1.Canvas.Pen.Color:=clSilver;

 For I:=1 to Num-2 do begin

  Form1.Image1.Canvas.MoveTo(Last[I,1],Last[I,2]);

  Form1.Image1.Canvas.LineTo(Last[I+1,1],Last[I+1,2]);

 end;

End;

Procedure ElTrackForMoving(X,Y:Real;K:Integer;Stop:Real);

Var Xb,U,Vx,Vy,Dx,Dy,Deg:Real;

    Num,I:Integer;

Begin

 Num:=0; Xb:=X;

 While (X>0) and (Y>0) and (X<Form1.Width) and (Y<Form1.Height) do begin

  Vx:=0; Vy:=0;

  For I:=1 to Nc do begin

   Dx:=Qrc[I,1]-X;

   Dy:=Qrc[I,2]-Y;

   Deg:=Sqrt(Dx*Dx+Dy*Dy);

   If (Deg<Abs(Qrc[I,3])*3) then Exit;

   Deg:=Deg*Deg*Deg;

   Vx:=Vx+(K*Qrc[I,3]*Dx/Deg);

   Vy:=Vy+(K*Qrc[I,3]*Dy/Deg);

  end;

  U:=1;

  If Sqrt(Vx*Vx+Vy*Vy)<>0 then U:=1/Sqrt(Vx*Vx+Vy*Vy);

  Vx:=U*Vx; Vy:=U*Vy;

  Form1.Image1.Canvas.MoveTo(Round(X),Round(Y));

  X:=X+Vx; Y:=Y+Vy;

  For I:=0 to Num-1 do If (Last[I,1]=Round(X)) and (Last[I,2]=Round(Y)) and (I<Num-3) then Exit;

  Inc(Num); SetLength(Last,Num);

  Last[Num-1,1]:=Round(X); Last[Num-1,2]:=Round(Y);

  Form1.Image1.Canvas.LineTo(Round(X),Round(Y));

  If Stop<>0 then If Abs(Xb-X)>Stop then Exit;

 End;

 SetLength(Last,0);

End;

Procedure ElRefresh;

Var I:Integer;

Begin

 Form1.Image1.Canvas.Pen.Color:=clWhite;

 For I:=1 to Nc do begin

  If Qrc[I,3]>0 then Form1.Image1.Canvas.Brush.Color:=clRed else Form1.Image1.Canvas.Brush.Color:=clBlue;

  If Abs(Qrc[I,3])<>4 then Circle(Qrc[I,1],Qrc[I,2],Abs(4*Qrc[I,3])-1,1) else

                           Circle(Qrc[I,1],Qrc[I,2],11,1);

 end;

End;

Procedure Stop;

Begin

 LineExpl:=False; EkviExpl:=False;

 SetLength(E0,0);

 Form1.StatusBar1.Panels.Items[0].Text:='';

 Form1.StatusBar1.Panels.Items[1].Text:='';

 Form1.StatusBar1.Panels.Items[2].Text:='';

End;

Procedure Redactor;

Var I,P:SmallInt;

Begin

 If Form1.StatusBar1.Panels.Items[4].Text='Редактор' then Exit;

 Form1.Image1.Align:=alNone;

 Form1.Image1.Height:=0; Form1.Image1.Width:=0;

 Form1.Refresh; DrawGrid;

 For I:=1 to Nc do For P:=1 to 3 do Qrc[I,P]:=0; Nc:=0;

 For I:=0 to 63 do For P:=0 to 47 do RefreshSquare(I,P);

 Form1.StatusBar1.Panels.Items[4].Text:='Редактор';

End;

Function Potenc(X,Y:Integer):Real;

Var I:Integer;

    Tmp,Dist:Real;

Begin

 Tmp:=0;

 For I:=1 to Nc do begin

  Dist:=Sqrt(((Qrc[I,1]-X)*(Qrc[I,1]-X)+(Qrc[I,2]-Y)*(Qrc[I,2]-Y)));

  If Dist<>0 then Tmp:=Tmp+(Qrc[I,3]/Dist) else begin Potenc:=0; Exit; end;

 end;

 Potenc:=Tmp;

End;

Function RealPotenc(X,Y:Integer):Real;

Var I:Integer;

    Dx,Dy,Tmp,Dist:Real;

Begin

 Tmp:=0;

 For I:=1 to Nc do begin

  Dx:=(Qrc[I,1]-X)/25*StrToFloat(Form2.Edit2.Text);

  Dy:=(Qrc[I,2]-Y)/25*StrToFloat(Form2.Edit2.Text);

  Dist:=Sqrt(Dx*Dx+Dy*Dy);

  If Dist<>0 then Tmp:=Tmp+(Qrc[I,3]*StrToFloat(Form2.Edit1.Text)/Dist) else begin RealPotenc:=0; Exit; end;

 end;

 RealPotenc:=Tmp/StrToFloat(Form2.Edit3.Text);

End;

Function CheckEkviBegin(X,Y:Integer):Boolean;

Begin

 CheckEkviBegin:=False;

 If (X-1=EkX) and ((Y-1=EkY) or (Y=EkY) or (Y+1=EkY)) then CheckEkviBegin:=True;

 If (X+1=EkX) and ((Y-1=EkY) or (Y=EkY) or (Y+1=EkY)) then CheckEkviBegin:=True;

 If (X=EkX)   and ((Y-1=EkY) or (Y+1=EkY)) then CheckEkviBegin:=True;

End;

Procedure PaintEkvi(X,Y:Integer;Pot:Real;O:Byte);

Var P:Array[1..4] of Real;

    M:Array[1..4] of Boolean;

    Xt,Yt:Integer;

    I,Min:Byte;

Begin

 For I:=1 to 4 do P[I]:=0;  For I:=1 to 4 do M[I]:=True;

 P[1]:=Abs(Pot-Potenc(X,Y-1)); P[2]:=Abs(Pot-Potenc(X+1,Y));

 P[3]:=Abs(Pot-Potenc(X,Y+1)); P[4]:=Abs(Pot-Potenc(X-1,Y));

 If Potenc(X,Y-1)=0 then Exit;

 If Potenc(X,Y+1)=0 then Exit;

 If Potenc(X+1,Y)=0 then Exit;

 If Potenc(X-1,Y)=0 then Exit;

 If O=1 then begin Ekv[X+1,Y+1]:=True; Ekv[X-1,Y+1]:=True; end;

 If O=2 then begin Ekv[X-1,Y-1]:=True; Ekv[X-1,Y+1]:=True; end;

Страницы: 1, 2, 3, 4


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.