Важная информация
Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 15 из 15

Тема: Построение графика функции

  1. #11  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,846
    Сказал(а) спасибо
    1,815
    Поблагодарили 945 раз(а) в 807 сообщениях
    Записей в блоге
    1
    N20(11) = ЕСЛИ[N20(10)*EXP{-(x11-x10)/Chrome}<25;25;N20(10)*EXP{-(x11-x10)/Chrome}]
    Вы уверены что следует использовать вычисления на предыдущем шаге?
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  2. #12  
    Профи Аватар для nik_1
    Регистрация
    03.08.2014
    Сообщений
    283
    Сказал(а) спасибо
    160
    Поблагодарили 145 раз(а) в 109 сообщениях
    Записей в блоге
    1
    [Ссылки могут видеть только зарегистрированные пользователи. ]

    на панель нужно добавить компонент combobox3 c 2 записями: 1-одинаковый маштаб для всех осей, 2-свой маштаб для каждой оси

    Pascal Code:
    1.  
    2. unit Unit1;
    3.  
    4. {$mode objfpc}{$H+}
    5.  
    6. interface
    7.  
    8. uses
    9.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
    10.   Buttons, StdCtrls, ComCtrls;
    11.  
    12. type
    13.  
    14.   { TForm1 }
    15.  
    16.   TForm1 = class(TForm)
    17.     Button1: TButton;
    18.     Button2: TButton;
    19.     Button3: TButton;
    20.     ComboBox3: TComboBox;
    21.     Edit1: TEdit;
    22.     Edit2: TEdit;
    23.     Edit3: TEdit;
    24.     Image1: TImage;
    25.     Label1: TLabel;
    26.     Label10: TLabel;
    27.     Label11: TLabel;
    28.     Label12: TLabel;
    29.     Label15: TLabel;
    30.     Label2: TLabel;
    31.     Label3: TLabel;
    32.     Label4: TLabel;
    33.     Label5: TLabel;
    34.     Label6: TLabel;
    35.     Label7: TLabel;
    36.     Label8: TLabel;
    37.     Label9: TLabel;
    38.     Memo1: TMemo;
    39.     Panel1: TPanel;
    40.     Panel2: TPanel;
    41.     Panel3: TPanel;
    42.     ScrollBox1: TScrollBox;
    43.     TrackBar1: TTrackBar;
    44.     TrackBar2: TTrackBar;
    45.  
    46.  
    47.     procedure Button1Click(Sender: TObject);
    48.     procedure Button2Click(Sender: TObject);
    49.     procedure Button3Click(Sender: TObject);
    50.     procedure Edit1KeyPress(Sender: TObject; var Key: char);
    51.     procedure FormCreate(Sender: TObject);
    52.     procedure ClearGraph1(Sender: TObject; pYMax, pYMin, prn:real);
    53.     procedure Image1Paint(Sender: TObject);
    54.     procedure Label15Click(Sender: TObject);
    55.     procedure TrackBar1MouseUp(Sender: TObject; Button: TMouseButton;
    56.       Shift: TShiftState; X, Y: Integer);
    57.     procedure TrackBar2MouseUp(Sender: TObject; Button: TMouseButton;
    58.       Shift: TShiftState; X, Y: Integer);
    59.  
    60.   private
    61.     { private declarations }
    62.  
    63.   public
    64.     { public declarations }
    65.   end;
    66.  
    67. var
    68.   Form1: TForm1;
    69.  
    70. implementation
    71.  
    72. {$R *.lfm}
    73.  
    74. { TForm1 }
    75.  
    76.  
    77. const  //m = 16;      // масштаб
    78.        time_0 = 0;  // временные интервалы (границы искомой функции)
    79.        time_10 = 10;
    80.        time_11 = 11;
    81.        time_20 = 20;
    82.        eps = 0.0000000000001; // машинный ноль принимаем равным 0.0000000000001
    83.  
    84. var  x0, y0, time, m, mX, mY : integer;  //m - маштаб общий для х и у; mX, mY - предварительный масштаб  по х и у
    85.  
    86.      N20, N20_Min, N20_Max : real; // значение функции
    87.      Xenon, chrome, k : real; // значение переменных
    88.      nCalcProg :integer;  // количество расчётов
    89.      aCord: array[time_0..time_20] of real;
    90.      aX: array[time_0..time_20] of real;
    91.      n:integer;
    92.      rn:real;
    93.      N20_Begin, N20_Step :Real;
    94.  
    95. procedure TForm1.ClearGraph1(Sender: TObject; pYMax, pYMin, prn:real);
    96. var i: Integer;
    97.     n1, nX, nY: Integer;
    98.     ri:real;
    99. begin
    100.   image1.Canvas.Brush.Color:=clwhite;
    101.   image1.Canvas.FillRect(0,0,Image1.Width,Image1.Height);
    102.   if nCalcProg>0 then
    103.   if (prn>eps) then
    104.     begin
    105.       //центер осей
    106.       x0:=50;
    107.       y0:=50;
    108.       //маштабирующие множители
    109.       mX:=(Image1.Width-x0-10)div((time_20-time_0)+1);
    110.       mY:=(Image1.Height-y0-10)div(Round(pYMax-pYMin)+1);
    111.       if mY <= mX then m:=mY else m:=mX;
    112.       //рисуем сетку серым цветом
    113.       Image1.Canvas.Pen.Color:=clSilver;
    114.       n1:=0;
    115.       nX:=(time_20-time_0)+1;
    116.       nY:=Round(pYMax-pYMin)+1;
    117.       case ComboBox3.ItemIndex of
    118.       0:begin
    119.           //по х
    120.           for i := n1 to nX do
    121.           begin
    122.             Image1.Canvas.MoveTo(x0+i*m, y0);
    123.             Image1.Canvas.LineTo(x0+i*m, y0+nY*m);
    124.           end;
    125.           //по y
    126.           for i := n1 to nY do
    127.           begin
    128.             Image1.Canvas.MoveTo(x0, y0+i*m);
    129.             Image1.Canvas.LineTo(x0+nX*m, y0+i*m);
    130.           end;
    131.         end;
    132.       1:begin
    133.           //по х
    134.           for i := n1 to nX do
    135.           begin
    136.             Image1.Canvas.MoveTo(x0+i*mX, y0);
    137.             Image1.Canvas.LineTo(x0+i*mX, y0+nY*mY);
    138.           end;
    139.           //по y
    140.           ri:=n1;
    141.           while ri <= nY do
    142.           begin
    143.             Image1.Canvas.MoveTo(x0, Round(y0+ri*mY));
    144.             Image1.Canvas.LineTo(x0+nX*mX, Round(y0+ri*mY));
    145.             ri:=ri+N20_Step;
    146.           end;
    147.         end;
    148.       end;
    149.       // координатная плоскость (рисуем оси)
    150.       Image1.Canvas.Pen.Color:=0;
    151.       Image1.Canvas.MoveTo(0, y0);
    152.       if ComboBox3.ItemIndex=0 then Image1.Canvas.LineTo(x0+nX*m+10, y0)
    153.       else Image1.Canvas.LineTo(Image1.Width, y0);
    154.       Image1.Canvas.MoveTo(x0, 0);
    155.       if ComboBox3.ItemIndex=0 then Image1.Canvas.LineTo(x0, y0+nY*m+10)
    156.       else Image1.Canvas.LineTo(x0, Image1.Height );
    157.       // шкалирование осей
    158.       Image1.Canvas.Font.Name:='Arial';
    159.       Image1.Canvas.Font.Size:=8;
    160.       Image1.Canvas.Font.Color:=clBlue;
    161.       case  ComboBox3.ItemIndex of
    162.       0:begin
    163.           for i := n1 to nX do
    164.           begin
    165.             Image1.Canvas.MoveTo(x0+i*m, y0-5);
    166.             Image1.Canvas.LineTo(x0+i*m, y0-(-5));
    167.             Image1.Canvas.TextOut(x0+i*m+2, y0-20, Format('%f',[ax[i]]));
    168.           end;
    169.         end;
    170.       1:begin
    171.           for i := n1 to nX do
    172.           begin
    173.             Image1.Canvas.MoveTo(x0+i*mX, y0-5);
    174.             Image1.Canvas.LineTo(x0+i*mX, y0-(-5));
    175.             Image1.Canvas.TextOut(x0+i*mX+2, y0-20, Format('%f',[ax[i]]) );
    176.           end;
    177.         end;
    178.       end;
    179.       Image1.Canvas.TextOut(4, y0-20, 'x(i)=0.1*i*k');
    180.       Image1.Canvas.Font.Color:=clRed;
    181.       Image1.Canvas.TextOut(x0-30, 2, 'N20');
    182.       case  ComboBox3.ItemIndex of
    183.       0:begin
    184.           ri:=n1;
    185.           while ri <= nY do
    186.             begin
    187.               Image1.Canvas.MoveTo(x0+5, Round(y0+m*ri));
    188.               Image1.Canvas.LineTo(x0-5, Round(y0+m*ri));
    189.               Image1.Canvas.TextOut(2, Round(y0+ri*m+2), Format('%f',[N20_begin-ri]));
    190.               if prn<=50 then ri:=ri+1 else ri:=ri+N20_Step;
    191.             end;
    192.         end;
    193.       1:begin
    194.           ri:=n1;
    195.           while ri <= nY do
    196.             begin
    197.               Image1.Canvas.MoveTo(x0+5, Round(y0+mY*ri));
    198.               Image1.Canvas.LineTo(x0-5, Round(y0+mY*ri));
    199.               Image1.Canvas.TextOut(2, Round(y0+ri*mY+2), Format('%f',[N20_begin-ri]));
    200.               ri:=ri+N20_Step;
    201.             end;
    202.         end;
    203.       end;
    204.     end;
    205. end;
    206. // построение графика функции
    207. procedure TForm1.Image1Paint(Sender: TObject);
    208. var i:integer;
    209. begin
    210.   ClearGraph1(Sender, N20_Max, N20_Min, rn); //очистка экрана
    211.   if nCalcProg>0 then
    212.   Begin
    213.   Image1.Canvas.Font.Color:=0;
    214.   Image1.Canvas.TextOut(120,1, 'График ф-ии N20 для расчёта №'+ IntToStr(nCalcProg));
    215.   Image1.Canvas.Pen.Color:=clGreen;
    216.   Image1.Canvas.Pen.Width:=3;
    217.   case  ComboBox3.ItemIndex of
    218.   0:begin
    219.       Image1.Canvas.MoveTo(round(x0+time_0*m), round(y0+(N20_begin-aCord[time_0])*m));
    220.       for i:=time_0+1 to time_20 do
    221.         Image1.Canvas.LineTo(round(x0+i*m), round(y0+(N20_begin-aCord[i])*m));
    222.     end;
    223.   1:begin
    224.       Image1.Canvas.MoveTo(round(x0+time_0*mX), round(y0+(N20_begin-aCord[time_0])*mY));
    225.       for i:=time_0+1 to time_20 do
    226.         Image1.Canvas.LineTo(round(x0+i*mX), round(y0+(N20_begin-aCord[i])*mY));
    227.     end;
    228.   end;
    229.   Image1.Canvas.Pen.Width:=1;
    230.  
    231.   End;
    232. end;
    233.  
    234. procedure TForm1.Label15Click(Sender: TObject);
    235. begin
    236.  
    237. end;
    238.  
    239.  
    240. //        обработка ползунка выбора   Xenon
    241. procedure TForm1.TrackBar1MouseUp(Sender: TObject; Button: TMouseButton;
    242.   Shift: TShiftState; X, Y: Integer);
    243. begin
    244.   Edit1.Text:=IntToStr(TrackBar1.Position);
    245. end;
    246. //        обработка ползунка выбора   chrome
    247. procedure TForm1.TrackBar2MouseUp(Sender: TObject; Button: TMouseButton;
    248.   Shift: TShiftState; X, Y: Integer);
    249. begin
    250.   Edit2.Text:=IntToStr(TrackBar2.Position);
    251. end;
    252.  
    253. //         создание формы
    254. procedure TForm1.FormCreate(Sender: TObject);
    255. begin
    256.   ClearGraph1(Sender, 0, 0, 0);
    257.   nCalcProg :=0;  //количество расчётов
    258. end;
    259.  
    260. //        расчёт
    261. procedure TForm1.Button1Click(Sender: TObject);
    262. var sError_1  : ansistring;
    263.     n10 : real;
    264.  
    265. begin
    266.   sError_1:='';
    267.   //ПРОВЕРКА ПРАВИЛЬНОСТИ ВВОДА ДАННЫХ
    268.   try
    269.     Xenon := StrToFloat (Edit1.Text);
    270.     chrome:= StrToFloat (Edit2.Text);
    271.     k:= StrToFloat (Edit3.Text);
    272.     if abs(chrome)<=eps then sError_1:='Деление на ноль! Значение chrome должно быть не равно 0.';
    273.   except
    274.     sError_1:='Проверьте правильность ввода данных.';
    275.   end;
    276.  
    277.   // если ошибки нет то расчёт значения функции
    278.   if sError_1='' then
    279.     begin
    280.       nCalcProg:=nCalcProg+1;
    281.  
    282.       memo1.Lines.Add('-----------< '+IntToStr(nCalcProg)+' >--------------');
    283.       memo1.Lines.Add('Исходные данные: '+Format(' Xenon=%f', [Xenon])
    284.                       +'; '+Format('  chrome=%f', [chrome]) );
    285.  
    286.       for time:=time_0 to time_20 do ax[time]:=(time * 0.1)*k;
    287.  
    288.       //расчёт функции в границах  [time_0; time_10]
    289.       for time:=time_0 to time_10 do
    290.         begin
    291.                   //25+Xenon*(1-EXP(-x1/Chrome));
    292.           N20:= (25 + Xenon*(1-exp(-ax[time]/chrome)));
    293.           aCord[time]:=N20;
    294.           memo1.Lines.Add('x'+IntToStr(time)+Format( '= %f', [ax[time]])+Format(';     N20=%f', [N20]));
    295.         end;
    296.       n10:=N20;
    297.       //расчёт функции в границах  [time_11; time_20]
    298.       for time:=time_11 to time_20 do
    299.         begin
    300.  
    301.           N20:= n10 * exp (- ((ax[time])-(ax[time_10]))/chrome);
    302.           if  N20<=25 then N20:=25
    303.           else N20:=(N10 * exp (- ((ax[time])-(ax[time_10]))/chrome));
    304.           aCord[time]:=N20;
    305.           memo1.Lines.Add('x'+IntToStr(time)+Format( '= %f', [ax[time]])+Format(';     N20=%f', [N20]));
    306.         end;
    307.       //поиск максимального и минимального значения функции
    308.       N20_Min:=aCord[time_0];
    309.       N20_Max:=aCord[time_20];
    310.       for time:=time_0+1 to time_20 do
    311.         if aCord[time] < N20_Min then N20_Min:=aCord[time]
    312.         else if aCord[time]> N20_Max then N20_Max:=aCord[time];
    313.       //если разница между максимальным и минимальным числом меньше 1 то
    314.       N20_begin:=Round(N20_Max+0.499);
    315.       rn:=abs(N20_Max-N20_Min);
    316.       n:=1;
    317.       if (rn <= 6) then
    318.         begin
    319.           N20_Step:=0.1;
    320.         end;
    321.       if ((rn >6) and (rn<=50))  then
    322.         begin
    323.           N20_Step:=1;
    324.         end;
    325.       if (rn>50) then
    326.         begin
    327.           N20_Step:=2;
    328.         end;
    329.       // построение графика функции
    330.       Image1Paint(Sender);
    331.     end;
    332.  
    333.   // завершение расчета и выход по ошибке
    334.   if sError_1<>'' then ShowMessage('   Ошибка!'+#13#10+ sError_1);
    335.  
    336. end;
    337. //        выход
    338. procedure TForm1.Button2Click(Sender: TObject);
    339. begin
    340.   close;
    341. end;
    342. //        очистка результатов расчета
    343. procedure TForm1.Button3Click(Sender: TObject);
    344. begin
    345.   memo1.Clear;
    346.   ClearGraph1(Sender, 0, 0, 0);
    347.   nCalcProg:=0;
    348. end;
    349.  
    350. //        проверка правильности ввода числа  in edit1 and edit2
    351. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
    352. begin
    353.    if not (Key in ['0'..'9', #8, '-', '.', ','])then
    354.     begin
    355.       Key:=#0;
    356.       beep;
    357.     end;
    358. end;
    359.  
    360.  
    361. end.
    Последний раз редактировалось nik_1; 03.10.2016 в 20:26.
    Ответить с цитированием  
     

  3. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (04.10.2016), Daniel_Riccardo (03.10.2016), Free Admin (04.10.2016)

  4. #13  
    Новичок
    Регистрация
    29.09.2016
    Сообщений
    7
    Сказал(а) спасибо
    5
    Поблагодарили 1 раз в 1 сообщении
    nik_1 Огромнейшее спасибо!!!! Я так вам благодарен! Ваш форум лучший! Единственный форум, где отклинулись, вообще! Спасибо вам!!! Развития вашему проекту, а вам мира и добра
    Ответить с цитированием  
     

  5. #14  
    Admin
    Регистрация
    09.04.2014
    Сообщений
    1,212
    Сказал(а) спасибо
    776
    Поблагодарили 488 раз(а) в 401 сообщениях
    Цитата Сообщение от Daniel_Riccardo Посмотреть сообщение
    Развития вашему проекту, а вам мира и добра
    Мы зависим только от Вас, приходите на форум и помогайте другим пользователям освоить науку программирования, в чём-то мы сильны в чём-то вы...!)
    Ответить с цитированием  
     

  6. 2 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (05.10.2016), Daniel_Riccardo (04.10.2016)

  7. #15  
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    Цитата Сообщение от Daniel_Riccardo Посмотреть сообщение
    Помогите, пожалуйста, построить данную зависимость. Знаю, что для графика нужна функция TChart, поместил её на форму.
    Я всегда на TImage делал.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
    Ответить с цитированием  
     

Страница 2 из 2 ПерваяПервая 12
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Turbo Pascal, построение графика
    от Дина в разделе Turbo Pascal
    Ответов: 2
    Последнее сообщение: 28.04.2013, 09:13
  2. 2D/3D Графика. Игры.
    от handrix в разделе Общие вопросы программирования
    Ответов: 5
    Последнее сообщение: 13.09.2012, 20:23
  3. Ответов: 3
    Последнее сообщение: 15.06.2012, 20:29
  4. Графика
    от >Quiet Snow< в разделе Turbo Pascal
    Ответов: 5
    Последнее сообщение: 12.06.2011, 16:07
  5. Графика
    от nikita в разделе QBasic
    Ответов: 2
    Последнее сообщение: 05.05.2011, 18:20
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •