![]() |
|
|
#1
|
|||
|
|||
|
Необходимо нарисовать изолинии 4 зарядов расположенных на углах прямоугольника.
Посмотрел книжку:КОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ В ФИЗИКЕ 77 стр. И не могу разобраться. Сделал по примеру: Код:
function Poten(x,y:extended):integer;
var
q,r : extended;
begin
r:=sqrt(sqr(x-100)+sqr(y-100));
Result:=Round(q/r);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,p:integer;
begin
x:=0;
while x < 100 do
begin
y:=0;
while y < 100 do
begin
p:=Poten(x,y);
if p>0 then
begin
Image1.Canvas.Pixels[x,y];
y:=y+1;
end;
if p<=0 then
begin
Image1.Canvas.Pixels[x,y];
y:=100;
end;
end;
x:=x+1;
end;
end; |
|
#2
|
||||
|
||||
|
Код:
function Poten(x,y:extended):integer; var q,r : extended; begin r:=sqrt(sqr(x-100)+sqr(y-100)); Result:=Round(q/r); end; |
|
#3
|
|||
|
|||
|
заряд=)
Ну да ладно. А остальное правильно? |
|
#4
|
||||
|
||||
|
Насчет алгоритма не в курсе, а вот синтаксически верно. Но будет очень тормознуто, т.к. Image1.Canvas.Pixels[x,y] - ну очень небыстрая вещь.
|
|
#5
|
|||
|
|||
|
Более правильно как-то так
Код:
function Poten
(
x,y:extended; // координаты пробной точки
xq,yq:extended; // координаты заряда
q:extended; // заряд
):extended;
var
r : extended;
begin
r:=sqrt(sqr(x-xq)+sqr(y-yq));
Result:=q/r;
end;
const // заменить на нужные значения зарядов
Q1 = 1;
Q2 = 1;
Q3 = 1;
Q4 = 1;
procedure TForm1.Button1Click(Sender: TObject);
var
x,y:integer;
p:extended;
begin
for x:=0 to 100 do
begin
for y:=0 to 100 do
begin
p:=
Poten(x,y,100,100,Q1) +
Poten(x,y,100, 0,Q2) +
Poten(x,y, 0,100,Q3) +
Poten(x,y, 0, 0,Q4) ;
if p>0 then
begin
Image1.Canvas.Pixels[x,y] := clWhite;
end
else
begin
Image1.Canvas.Pixels[x,y] := clBlack;
end;
end;
end;
end; |
|
#6
|
|||
|
|||
|
Деление на ноль выдает=(
|
|
#7
|
||||
|
||||
|
Вы бы лучше в алгоритм вникли и тогда бы вы без труда избавились от ситуации с делением на нуль.
|
|
#8
|
|||
|
|||
|
да,да.
Я просто так написал. Сразу же подправил. |