Привет. В общем есть код на паскале,хочу перевести на delphi, однако не получается.вот код Code: {$n-,e+,f+} uses graph,crt; type TDFunc=function(t:real):real; var alpha,beta,maxt,a,b,e1,e2,p,k,t,dt:real; i,drv,mode:integer; procedure sls(x:byte); begin setlinestyle(0,0,3*byte(x<>0)) end; function v(t:real):real; begin v:=a*t+b+e1*sin(p*t+alpha); end; function x(t:real):REAL; begin x:=a*t*t/2+b*t+k+e2*sin(p*t+beta); end; function floattostr(x:real;p:byte):string; var s:string; begin str(x:0:p,s); floattostr:=s; end; procedure drawfunc(x1,y1,x2,y2:longint;tm:real;f:tdfunc;s1,s2:string); const dm=1.15; var t,dt,ax,bx,ay,by,maxy,maxx:real; function toscreenx(x:real):integer; begin toscreenx:=round(ax*x+bx); end; function toscreeny(y:real):INTEGER; begin toscreeny:=round(ay*y+by); end; begin t:=0; maxy:=0; dt:=dm*tm/(x2-x1); ax:=1/dt; bx:=x1; while t<tm do begin if f(t)>maxy then begin maxy:=f(t); maxx:=t; end; t:=t+dt; end; maxy:=maxy*dm; by:=y2; ay:=(y1-by)/maxy; sls(1); setcolor(2); line(x1,y1,x2,y2); line(x1,y2,x2,y2); sls(1); setcolor(4); moveto(x1,toscreeny(f(0))); t:=0; while t<tm do begin lineto(toscreenx(t),toscreeny(f(t))); t:=t+dt; end; settextjustify(0,2); setcolor(0); setlinestyle(1,0,0); line (toscreenx(tm),y2,toscreenx(tm),toscreeny(f(tm))); line (x1,toscreeny(maxy/dm),toscreenx(maxx),toscreeny(maxy/dm)); outtextxy(x1+5,y1,s1); outtextxy(x2-15,y2+4,s2); settextjustify(1,2); outtextxy(toscreenx(tm),y2+4,floattostr(tm,2)); settextjustify(0,0); outtextxy(x1+5,toscreeny(maxy/dm),floattostr(maxy,2)); end; begin write('a='); read(a); write('b='); read(b); write('E1='); read(e1); write('E2='); read(e2); write('p='); read(p); write('k='); read(k); write('alpha='); read(alpha); write('beta='); read(beta); directvideo:=false; initgraph(drv,mode,''); floodfill(1,1,1); if a>0 then maxt:=2*pi/p else begin t:=0; while v(t)>0 do t:=t+0.0002; maxt:=t end; drawfunc(0,100,310,410,maxt,v,'v,m/s','t,s'); drawfunc(320,100,630,410,maxt,x,'x,m','t,s'); t:=0; dt:=maxt/8; textattr:=$87; writeln(' a=',a:0:2,' b=',b:0:2,' e1=',e1:0:2,' e2=',e2:0:2, 'p=',p:0:2,' k=',k:0:2,' alpha=',alpha:0:2,' beta=',beta:0:2,^m^j); write('t,s '); for i:=0 to 8 do write(floattostr(i/8*maxt,3):8); write(#13#10'v,m/s'); for i:=0 to 8 do write(floattostr(v(i/8*maxt),3):8); write(#13#10'x,m'); for i:= 0 to 8 do write(floattostr(x(i/8*maxt),3):8); readkey; closegraph; end. рисовать я думал через paintbox вводить значения нужно с типом риал,можно взять edit и делать через floattostr.выводить тоже в edit или memo, но у меня чет не получается сами графики построить, я так понял line заменяется на moveto->lineto. в общем кто может помогите с самим выводом графиков.спасибо.
Честно, переводить желания нет, а разбираться в твоём коде тем более. Почитай про класс TCanvas, и про экранную систему координат. А там уже рисуй хоть портрет Обамы чёрным цветом, хоть Мона Лизу...
Зачем переводить то? Попытайся развязать задачу средствами Делфи с самого начала. В приведенном тобой коде много ненужного, что в Делфи описывается одной, двумя процедурами. Ключевые алгоритмы рисования у тебя есть. Так будет быстрее и надежней. ИМХО
надо отрисовать графики функций как в коде выше, неважно в paintboxe или где...значения величин можно задать сразу.
o_0 не слышал о таком,ща попробуем....а как нащет заводских компонент?я просто пытаюсь отрисовать к примеру функцию v но там несовместимость типов и round/trunc не помогает
Chart и есть "заводским" компонентом входящим в состав Делфи7. Ты должен иметь представление, графики чего именно будет рисовать твоя прога, с математической точки зрения. Исходя из постановки задачи, реализовать её с Chart. Данный компонент имеет неплохие возможности в построении графиков. Советую покурить.
вот код примера Code: Function f(x:real):real; // Функция, график которой надо построить begin f:=2*Sin(x)*exp(x/5); end; procedure GrOfFunc; // строит график функции var x1,x2:real; // границы изменения аргумента функции y1,y2:real; // границы изменения значения функции x:real; // аргумент функции y:real; // значение функции в точке x dx:real; // приращение аргумента l,b:integer; // левый нижний угол области вывода графика w,h:integer; // ширина и высота области вывода графика mx,my:real; // масштаб по осям X и Y x0,y0:integer; // точка - начало координат begin // область вывода графика l:=10; // X - координата левого верхнего угла b:=Form1.ClientHeight-20; // Y - координата левого верхнего угла h:=Form1.ClientHeight-40; // высота w:=Form1.Width-40; // ширина x1:=0; // нижняя граница диапазона аргумента x2:=25; // верхняя граница диапазона аргумента dx:=0.01; // шаг аргумента // найдем максимальное и минимальное значения // функции на отрезке [x1,x2] y1:=f(x1); // минимум y2:=f(x1); // максимум x:=x1; repeat y := f(x); if y < y1 then y1:=y; if y > y2 then y2:=y; x:=x+dx; until (x>=x2); // вычислим масштаб my:=h/abs(y2-y1); // масштаб по оси Y mx:=w/abs(x2-x1); // масштаб по оси X // оси x0:=l; y0:=b-Abs(Round(y1*my)); with form1.Canvas do begin // оси MoveTo(l,b);LineTo(l,b-h); MoveTo(x0,y0);LineTo(x0+w,y0); TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3)); TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3)); // построение графика x:=x1; repeat y:=f(x); Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed; x:=x+dx; until (x>=x2); end; end; procedure TForm1.FormPaint(Sender: TObject); begin GrOfFunc; end; // изменился размер окна программы procedure TForm1.FormResize(Sender: TObject); begin // очистить форму form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight)); // построить график GrOfFunc; end; пробовал свою фу-ю-ошибка. (извини что задалбую,времени мало)
пожалуйста.с меня $, все что нужно в том коде есть.значения переменных( alpha,beta,e1...) можно задать вручную.
DooD, учись давай, двоешник. Асм не знаешь из паскаля в делфи перевести не можешь, а уж про Chart не знать O_O это ты что, книжку даже не пробывал открывать? Точно я твоей маме расскажу, как ты на форумах уроки делаешь, ой расскажу...
та ну,асм это жестьего так сразу не постигнешь,я графикой вообще не занимался,никогда не надо было,а тут на те.я не пойму как ету грёбаную функцию изобразить.тем более быро надо,а то в пятницу в универе шпили-вили сделают...
Самое тупой алгоритм вывода графика массив X массив Y (целочисленный, с точкой это тебе видней) Вбиваешь свою формулу расчитываешь там от 0 до 100 в цикле for значения X, Y, после выводишь в Chart и радуешься. Бывают там задачки мол с шагом... ну значит i:=i+step; Ну вот типа Code: for i:=0 to 1000 do begin X[i]:=i; Y[i]:=k*X[i]+b; { прямая будет на графике} end; Чего сложного то?