uses crt, graph;
var gd, gm, n, i, a, j, k: integer;
x, y, q: array[1..10] of integer;
r, Ex, Ey: array[1..10] of real;
arad, x1, x2, y1, y2, E, SumEx,SumEy,dl,min: real;
begin
n:=5;
x[1]:=100; y[1]:=240; q[1]:=5;
x[2]:=450; y[2]:=150; q[2]:=-10;
x[3]:=300; y[3]:=350; q[3]:=30;
x[4]:=50; y[4]:=400; q[4]:=15;
x[5]:=200; y[5]:=10; q[5]:=-5;
dl:=1;
gd:=detect;
Initgraph(gd,gm,'');
for i:=1 to n do
begin
a:=0; setcolor(white);
while a<360 do
begin
arad:=pi*a/180;
x1:=x[i]+dl*cos(arad);
y1:=y[i]+dl*sin(arad);
repeat
SumEx:=0; SumEy:=0; min:=1000;
for k:=1 to n do
begin
r[k]:=sqrt(sqr(x1-x[k])+sqr(y1-y[k]));
Ex[k]:=q[k]*(x1-x[k])/(r[k]*r[k]*r[k]);
Ey[k]:=q[k]*(y1-y[k])/(r[k]*r[k]*r[k]);
SEx:=SEx+Ex[k]; SEy:=SEy+Ey[k];
if r[k]<min then min:=r[k];
end;
E:=sqrt(sqr(SumEx)+sqr(SumEy));
if q[i]>=0 then begin x2:=x1+dl*SumEx/E; y2:=y1+dl*SumEy/E; end
else
begin x2:=x1-dl*SumEx/E; y2:=y1-dl*SumEy/E; end;
line(round(x1),round(y1),round(x2),round(y2));
x1:=x2; y1:=y2;
until (x2<0) or (x2>640) or (y2<0) or (y2>480) or (min<dl*0.5);
a:=a+10;
end;
end;
for i:=1 to n do
begin
if q[i]>=0 then setcolor(red) else setcolor(blue);
for j:=0 to 5 do
circle(x[i],y[i],j);
end;
repeat until keypressed;
closegraph;
end. |