помогите перевести

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 7 May 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Привет. В общем есть код на паскале,хочу перевести на 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.
    в общем кто может помогите с самим выводом графиков.спасибо.
     
  2. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    97
    Likes Received:
    2
    Reputations:
    0
    Честно, переводить желания нет, а разбираться в твоём коде тем более.
    Почитай про класс TCanvas, и про экранную систему координат.
    А там уже рисуй хоть портрет Обамы чёрным цветом, хоть Мона Лизу...
     
  3. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Зачем переводить то? Попытайся развязать задачу средствами Делфи с самого начала. В приведенном тобой коде много ненужного, что в Делфи описывается одной, двумя процедурами. Ключевые алгоритмы рисования у тебя есть. Так будет быстрее и надежней. ИМХО
     
  4. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    я не могу догнать какая именно функция рисуется.
    вернее какие, там 2 графика.
    походу v и x ...
     
    #4 DooD, 8 May 2011
    Last edited: 8 May 2011
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    пля.чет не получается отрисовать.может поможете немного?
     
  6. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Постановку задачи.
     
  7. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    надо отрисовать графики функций как в коде выше, неважно в paintboxe или где...значения величин можно задать сразу.
     
  8. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Попробуй использовать Chart. Не?
     
  9. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    o_0 не слышал о таком,ща попробуем....а как нащет заводских компонент?я просто пытаюсь отрисовать к примеру функцию v но там несовместимость типов и round/trunc не помогает
     
    #9 DooD, 9 May 2011
    Last edited: 9 May 2011
  10. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    нашел вроде пример,ставлю свою функцию,пишет floating poin division by zero.
     
  11. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Chart и есть "заводским" компонентом входящим в состав Делфи7. Ты должен иметь представление, графики чего именно будет рисовать твоя прога, с математической точки зрения. Исходя из постановки задачи, реализовать её с Chart. Данный компонент имеет неплохие возможности в построении графиков. Советую покурить.
     
  12. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    вот код примера
    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;
    
    пробовал свою фу-ю-ошибка.
    (извини что задалбую,времени мало)
     
  13. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    ребят надо до пятницы,кто сделает-материально отблагодарю
     
  14. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    http://slil.ru/31006180
    Всё работает...
     
  15. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    ты не понял,это то работает,а свою функцию будь то х или v прорисовать не удается...
     
  16. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Завтра попробую разобраться, но ничего не обещаю... Думаю к тому времени тебе помогут.
     
  17. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    пожалуйста.с меня $, все что нужно в том коде есть.значения переменных( alpha,beta,e1...) можно задать вручную.
     
  18. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    DooD, учись давай, двоешник. Асм не знаешь из паскаля в делфи перевести не можешь, а уж про Chart не знать O_O это ты что, книжку даже не пробывал открывать? Точно я твоей маме расскажу, как ты на форумах уроки делаешь, ой расскажу...
     
    _________________________
  19. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    та ну,асм это жесть:)его так сразу не постигнешь,я графикой вообще не занимался,никогда не надо было,а тут на те.я не пойму как ету грёбаную функцию изобразить.тем более быро надо,а то в пятницу в универе шпили-вили сделают...
     
  20. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Самое тупой алгоритм вывода графика
    массив 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;
    
    Чего сложного то?
     
    _________________________