Форум «Всё о Паскале» _ Делфи _ проблема с графиком
Автор: Yurka 27.11.2007 12:40
проблема такая: при нажатии кнопки на форме программа виснет и ничего соотвественно не показывает (графики не строит) вот код:
Код
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 27.11.2007 13: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-ов? Как ты думаешь, надо ДОГАДАТЬСЯ, или лучше ты приведешь те значения, на которых у тебя не работает?
Автор: Yurka 27.11.2007 14:14
Цитата(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 27.11.2007 15:31
Цитата
теперь ошибку выдаёт 'project2.exe raised exception class Einvalidop with message ‘Invalid floating point operation’
Еще бы... Ты видел, какие значения принимают x[i], y[i], z[i]? Посмотри:
Какой же тут Round справится?
Автор: Гость 27.11.2007 16:32
Цитата(volvo @ 27.11.2007 11:31)
Еще бы... Ты видел, какие значения принимают x[i], y[i], z[i]? Посмотри: