Помощь - Поиск - Пользователи - Календарь
Полная версия: проблема с графиком
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Yurka
проблема такая: при нажатии кнопки на форме программа виснет и ничего соотвественно не показывает (графики не строит)
вот код:
Код

procedure TForm2.Button2Click(Sender: TObject);
var
x:array [1..1000] of real;
y:array [1..1000] of real;
z:array [1..1000] of real;
stop:boolean;
i,n:integer;
r,p1,p0,m1,m0,M,Cd,Dt,U,W,V,sx,sy,sz:real;
scalex, scaley, ymin, ymax, xmin, xmax: double;
begin
r:=StrToInt(edit1.text);
p1:=strtoint(edit7.text);
p0:=strtoint(edit6.text);
m1:=p1*(4/3)*3.14*(sqr(r)*r);
m0:=p0*(2/3)*3.14*(sqr(r)*r);
M:=m0+m1;
Cd:=strtoint(edit8.Text);
Dt:=strtoint(edit9.Text);
x[1]:=strtoint(edit3.Text);
y[1]:=strtoint(edit4.Text);
z[1]:=strtoint(edit5.Text);
n:=5;
  stop:=false;
  While not stop do
begin
for i:=1 to n do
begin
u:=x[i]/(dt/n);
v:=y[i]/(dt/n);
w:=z[i]/(dt/n);
x[i+1]:=((p0*Cd)/M)*sqr(U-(x[i]-x[i-1])/dt)*(U-(x[i]-x[i-1])/dt)-2*x[i]+x[i-1];
y[i+1]:=((p0*Cd)/M)*sqr(v-(y[i]-y[i-1])/dt)*(v-(y[i]-y[i-1])/dt)-2*y[i]+y[i-1];
z[i+1]:=((p0*Cd)/M)*sqr(w-(z[i]-z[i-1])/dt)*(w-(z[i]-z[i-1])/dt)-2*z[i]+z[i-1];
paintbox1.Canvas.Pixels[round(x[i]),round(z[i])]:=clBlack;
paintbox2.Canvas.Pixels[round(x[i]),round(y[i])]:=clBlack;
paintbox3.Canvas.Pixels[round(y[i]),round(z[i])]:=clBlack;
sx:=sx+u;
sy:=sy+v;
sz:=sz+w;
end;
if n=4 then stop:=true;
end;
label14.Caption:=inttostr(round(sx/n));
label15.Caption:=inttostr(round(sy/n));
label16.Caption:=inttostr(round(sx/n));
end;


volvo
Цитата
при нажатии кнопки на форме программа виснет и ничего соотвественно не показывает

Странно... Должна вообще вылетать:
for i:=1 to n do
begin
u:=x[i]/(dt/n);
v:=y[i]/(dt/n);
w:=z[i]/(dt/n);

// уже при i = 1 - попытка обращения к x[0]
x[i+1]:=((p0*Cd)/M)*sqr(U-(x[i]-x[i-1])/dt)*(U-(x[i]-x[i-1])/dt)-2*x[i]+x[i-1];
(ну, и дальше - по тому же сценарию). Что-то ты не договариваешь...

Кстати, чему равно содержимое всех Edit-ов? Как ты думаешь, надо ДОГАДАТЬСЯ, или лучше ты приведешь те значения, на которых у тебя не работает?
Yurka
Цитата(volvo @ 27.11.2007 10:09) *

Странно... Должна вообще вылетать:
for i:=1 to n do
begin
u:=x[i]/(dt/n);
v:=y[i]/(dt/n);
w:=z[i]/(dt/n);

// уже при i = 1 - попытка обращения к x[0]
x[i+1]:=((p0*Cd)/M)*sqr(U-(x[i]-x[i-1])/dt)*(U-(x[i]-x[i-1])/dt)-2*x[i]+x[i-1];
(ну, и дальше - по тому же сценарию). Что-то ты не договариваешь...

Кстати, чему равно содержимое всех Edit-ов? Как ты думаешь, надо ДОГАДАТЬСЯ, или лучше ты приведешь те значения, на которых у тебя не работает?

начальные x,y,z =1
r=0.025
p0 и p1=1
Сd=1.17
dt=2
сделал изменения
Код

procedure TForm2.Button2Click(Sender: TObject);
var
x:array [1..1000] of real;
y:array [1..1000] of real;
z:array [1..1000] of real;
stop:boolean;
i,n:integer;
r,p1,p0,m1,m0,M,Cd,Dt,U,W,V,sx,sy,sz:real;
begin
r:=StrToInt(edit1.text);
p1:=strtoint(edit7.text);
p0:=strtoint(edit6.text);
m1:=p1*(4/3)*3.14*(sqr(r)*r);
m0:=p0*(2/3)*3.14*(sqr(r)*r);
M:=m0+m1;
Cd:=strtoint(edit8.Text);
Dt:=strtoint(edit9.Text);
x[1]:=strtoint(edit3.Text);
y[1]:=strtoint(edit4.Text);
z[1]:=strtoint(edit5.Text);
n:=5;
  stop:=false;
  While not stop do
begin
for i:=1 to n do
begin
u:=x[i]/(dt/n);
v:=y[i]/(dt/n);
w:=z[i]/(dt/n);
if i>2 then
begin
x[i+1]:=((p0*Cd)/M)*sqr(U-(x[i])/dt)*(U-(x[i])/dt)-2*x[i];
y[i+1]:=((p0*Cd)/M)*sqr(v-(y[i])/dt)*(v-(y[i])/dt)-2*y[i];
z[i+1]:=((p0*Cd)/M)*sqr(w-(z[i])/dt)*(w-(z[i])/dt)-2*z[i];
end
else
begin
x[i+1]:=((p0*Cd)/M)*sqr(U-(x[i]-x[i-1])/dt)*(U-(x[i]-x[i-1])/dt)-2*x[i]+x[i-1];
y[i+1]:=((p0*Cd)/M)*sqr(v-(y[i]-y[i-1])/dt)*(v-(y[i]-y[i-1])/dt)-2*y[i]+y[i-1];
z[i+1]:=((p0*Cd)/M)*sqr(w-(z[i]-z[i-1])/dt)*(w-(z[i]-z[i-1])/dt)-2*z[i]+z[i-1];
end;
paintbox1.Canvas.Pixels[round(x[i]),round(z[i])]:=clBlack;
paintbox2.Canvas.Pixels[round(x[i]),round(y[i])]:=clBlack;
paintbox3.Canvas.Pixels[round(y[i]),round(z[i])]:=clBlack;
sx:=sx+u;
sy:=sy+v;
sz:=sz+w;
end;
if n=4 then stop:=true;
end;
label14.Caption:=inttostr(round(sx/n));
label15.Caption:=inttostr(round(sy/n));
label16.Caption:=inttostr(round(sx/n));
end;


теперь ошибку выдаёт 'project2.exe raised exception class Einvalidop with message ‘Invalid floating point operation’…'
volvo
Цитата
теперь ошибку выдаёт 'project2.exe raised exception class Einvalidop with message ‘Invalid floating point operation’
Еще бы... Ты видел, какие значения принимают x[i], y[i], z[i]? Посмотри:

Нажмите для просмотра прикрепленного файла

Какой же тут Round справится?
Гость
Цитата(volvo @ 27.11.2007 11:31) *

Еще бы... Ты видел, какие значения принимают x[i], y[i], z[i]? Посмотри:

Нажмите для просмотра прикрепленного файла

Какой же тут Round справится?

good.gif спасибо!
значит надо пошаманить с формулой...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.