Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

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

  1. #1 Построение графика функции 
    Новичок
    Регистрация
    29.09.2016
    Сообщений
    7
    Сказал(а) спасибо
    5
    Поблагодарили 1 раз в 1 сообщении
    Доброго времени суток! Возник вопрос по созданию графика функции.
    Имеется функция: N20 = f(time), time = 0..20

    Для моментов времени time = 0..10, аргумент N20 = (25 + Xenon*(1-exp(time/chrome));

    Для моментов времени time = 11..20, аргумент определяется по условию:
    N20 = if ((N20_для_time=10) * exp (- ((time = 11)-(time=10))/chrome))<25;25; ((N20_для_time=10) * exp (- ((time = 11)-(time=10))/chrome))

    (т.е если получается число меньше 25, то принимается число равным 25), если число больше 25,
    то N20 = ((N20_для_time=10) * exp (- ((time = 11)-(time=10))/chrome))

    Помогите, пожалуйста, построить данную зависимость. Знаю, что для графика нужна функция TChart, поместил её на форму. А как дальше быть? Хотелось бы, чтобы после задания параметров в ComboBox1 и Edit 1-2, при нажатии на кнопку строился этот график.
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Последний раз редактировалось Daniel_Riccardo; 29.09.2016 в 19:28.
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,852
    Сказал(а) спасибо
    1,816
    Поблагодарили 947 раз(а) в 809 сообщениях
    Записей в блоге
    1
    Через TImage, элементарно же...

    http://www.titorov.ru/index.php/dist...anie/546-graph
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  3. #3  
    Новичок
    Регистрация
    29.09.2016
    Сообщений
    7
    Сказал(а) спасибо
    5
    Поблагодарили 1 раз в 1 сообщении
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    Через TImage, элементарно же...

    [Ссылки могут видеть только зарегистрированные пользователи. ]
    А не могли бы вы объяснить как строить график по условию?
    Ответить с цитированием  
     

  4. #4  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,852
    Сказал(а) спасибо
    1,816
    Поблагодарили 947 раз(а) в 809 сообщениях
    Записей в блоге
    1
    А не могли бы вы объяснить как строить график по условию?
    В статье нормальный пример. А вот условие просто ужасное, по такому условию не взялся бы делать точно.
    Нужно чтобы нормально всё было расписано, в фигурных скобках, + все параметры, что и откуда брать.
    Сначала нужно привести условие к читаемому, логичному и самое главное однозначному виду.
    Лазаруса у меня нет(не буду разрываться на 10 ЯП), но может nik_1 чем поможет...
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

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

    [Ссылки могут видеть только зарегистрированные пользователи. ]
    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.     Edit1: TEdit;
    21.     Edit2: TEdit;
    22.     Image1: TImage;
    23.     Label1: TLabel;
    24.     Label10: TLabel;
    25.     Label11: TLabel;
    26.     Label12: TLabel;
    27.     Label2: TLabel;
    28.     Label3: TLabel;
    29.     Label4: TLabel;
    30.     Label5: TLabel;
    31.     Label6: TLabel;
    32.     Label7: TLabel;
    33.     Label8: TLabel;
    34.     Label9: TLabel;
    35.     Memo1: TMemo;
    36.     Panel1: TPanel;
    37.     Panel2: TPanel;
    38.     Panel3: TPanel;
    39.     ScrollBox1: TScrollBox;
    40.     StaticText1: TStaticText;
    41.     TrackBar1: TTrackBar;
    42.     TrackBar2: TTrackBar;
    43.  
    44.  
    45.     procedure Button1Click(Sender: TObject);
    46.     procedure Button2Click(Sender: TObject);
    47.     procedure Button3Click(Sender: TObject);
    48.     procedure Edit1KeyPress(Sender: TObject; var Key: char);
    49.     procedure FormCreate(Sender: TObject);
    50.     procedure ClearGraph1(Sender: TObject);
    51.     procedure TrackBar1MouseUp(Sender: TObject; Button: TMouseButton;
    52.       Shift: TShiftState; X, Y: Integer);
    53.     procedure TrackBar2MouseUp(Sender: TObject; Button: TMouseButton;
    54.       Shift: TShiftState; X, Y: Integer);
    55.  
    56.   private
    57.     { private declarations }
    58.  
    59.   public
    60.     { public declarations }
    61.   end;
    62.  
    63. var
    64.   Form1: TForm1;
    65.  
    66. implementation
    67.  
    68. {$R *.lfm}
    69.  
    70. { TForm1 }
    71.  
    72.  
    73. const  m = 16;      // масштаб
    74.        time_0 = 0;  // временные интервалы (границы искомой функции)
    75.        time_10 = 10;
    76.        time_11 = 11;
    77.        time_20 = 20;
    78.        eps=0.000001; // машинный ноль принимаем равным 0.000001
    79. var  x0, y0, time : integer;
    80.      N20 : real; // значение функции
    81.      Xenon, chrome : real; // значение переменных
    82.      nCalcProg :integer;  //количество расчётов
    83.  
    84. procedure TForm1.ClearGraph1(Sender: TObject);
    85.  
    86. var
    87.     i: Integer;
    88.     n, n1: Integer;
    89. begin
    90.   image1.Canvas.Brush.Color:=clwhite;
    91.   image1.Canvas.FillRect(0,0,Image1.Width,Image1.Height);
    92.   x0 := Image1.Width div 4;                  // центр координатной плоскости по х оси
    93.   y0 := Image1.Height-(Image1.Height div 4); // центр координатной плоскости по у оси
    94.  
    95.    // стартовое значение функции
    96.   if x0> y0 then n1 :=- Trunc(x0/m) else n1 := - Trunc(y0/m);
    97.   // конечное значение функции
    98.   n := Abs(n1);
    99.   // шрифт и размер символов
    100.   Image1.Canvas.Font.Name:='Arial';
    101.   Image1.Canvas.Font.Size:=5;
    102.  
    103.   //рисуем сетку серым цветом
    104.   Image1.Canvas.Pen.Color:=clSilver;
    105.   for i := n1 to n do
    106.     begin
    107.       Image1.Canvas.MoveTo(x0+i*m, 0);
    108.       Image1.Canvas.LineTo(x0+i*m, Image1.Height);
    109.       Image1.Canvas.MoveTo(0, y0-m*i);
    110.       Image1.Canvas.LineTo(Image1.Width, y0-m*i);
    111.     end;
    112.  
    113.   // координатная плоскость (рисуем оси)
    114.   Image1.Canvas.Pen.Color:=0;
    115.   Image1.Canvas.MoveTo(0, y0);
    116.   Image1.Canvas.LineTo(Image1.Width, y0);
    117.   Image1.Canvas.MoveTo(x0, 0);
    118.   Image1.Canvas.LineTo(x0, Image1.Height );
    119.  
    120.    // шкалирование осей
    121.   Image1.Canvas.Pen.Color:=0;
    122.   for i := n1 to n do
    123.     begin
    124.       Image1.Canvas.MoveTo(x0+i*m, y0-5);
    125.       Image1.Canvas.LineTo(x0+i*m, y0-(-5));
    126.       Image1.Canvas.TextOut(x0+i*m, y0+10, IntToStr(i));
    127.       Image1.Canvas.MoveTo(x0+5, y0-m*i);
    128.       Image1.Canvas.LineTo(x0-5, y0-m*i);
    129.       Image1.Canvas.TextOut(x0-15, y0+i*m, IntToStr(-i));
    130.     end;
    131.   Image1.Canvas.Font.Size:=8;
    132.   Image1.Canvas.Font.Color:=clRed;
    133.   Image1.Canvas.TextOut(x0+15, 0+15, 'N20');
    134.   Image1.Canvas.TextOut(Image1.Width-35, y0-20, 'time');
    135.  
    136.    Image1.Canvas.Pen.Color:=clGreen; //цвет графика
    137. end;
    138. //        обработка ползунка выбора   Xenon
    139. procedure TForm1.TrackBar1MouseUp(Sender: TObject; Button: TMouseButton;
    140.   Shift: TShiftState; X, Y: Integer);
    141. begin
    142.   Edit1.Text:=IntToStr(TrackBar1.Position);
    143. end;
    144. //        обработка ползунка выбора   chrome
    145. procedure TForm1.TrackBar2MouseUp(Sender: TObject; Button: TMouseButton;
    146.   Shift: TShiftState; X, Y: Integer);
    147. begin
    148.   Edit2.Text:=IntToStr(TrackBar2.Position);
    149. end;
    150.  
    151. //         создание формы
    152. procedure TForm1.FormCreate(Sender: TObject);
    153. begin
    154.   ClearGraph1(Sender);
    155.   nCalcProg :=0;  //количество расчётов
    156. end;
    157.  
    158. //        расчёт
    159. procedure TForm1.Button1Click(Sender: TObject);
    160. var sError_1  : ansistring;
    161.     n10 : real;
    162. begin
    163.   sError_1:='';
    164.   //ПРОВЕРКА ПРАВИЛЬНОСТИ ВВОДА ДАННЫХ
    165.   try
    166.     Xenon := StrToFloat (Edit1.Text);
    167.     chrome:= StrToFloat (Edit2.Text);
    168.     if abs(chrome)<=eps then sError_1:='Деление на ноль! Значение chrome должно быть не равно 0.';
    169.   except
    170.     sError_1:='Проверьте правильность ввода данных.';
    171.   end;
    172.  
    173.   // если ошибки нет то расчёт значения функции
    174.   if sError_1='' then
    175.     begin
    176.       nCalcProg:=nCalcProg+1;
    177.       ClearGraph1(Sender); //очистка экрана
    178.       memo1.Lines.Add('-----------< '+IntToStr(nCalcProg)+' >--------------');
    179.       memo1.Lines.Add('Исходные данные: '+Format(' Xenon=%f', [Xenon])
    180.                       +'; '+Format('  chrome=%f', [chrome]) );
    181.       //расчёт функции в границах  [time_0; time_10]
    182.       for time:=time_0 to time_10 do
    183.         begin
    184.           N20:= (25 + Xenon*(1-exp(time/chrome)));
    185.           memo1.Lines.Add('time='+IntToStr(time)+'  ->  '+Format('N20=%f', [N20]));
    186.           if time=time_0  then
    187.             Image1.Canvas.MoveTo(round(x0+time*m), round(y0-N20*m))
    188.           else
    189.             Image1.Canvas.LineTo(round(x0+time*m), round(y0-N20*m));
    190.         end;
    191.       n10:=N20;
    192.       //расчёт функции в границах  [time_11; time_20]
    193.       for time:=time_11 to time_20 do
    194.         begin
    195.           N20:= n10 * exp (- ((time_11)-(time_10))/chrome);
    196.           if  N20<=25 then N20:=25
    197.           else N20:=(N10 * exp (- ((time_11)-(time_10))/chrome));
    198.           memo1.Lines.Add('time='+IntToStr(time)+'  ->  '+Format('N20=%f', [N20]));
    199.           Image1.Canvas.LineTo(round(x0+time*m), round(y0-N20*m));
    200.         end;
    201.       Image1.Canvas.TextOut(1,1, 'График ф-ии N20');
    202.       Image1.Canvas.TextOut(1,20, 'для расчёта №'+ IntToStr(nCalcProg));
    203.     end;
    204.  
    205.   // завершение расчета и выход по ошибке
    206.   if sError_1<>'' then ShowMessage('   Ошибка!'+#13#10+ sError_1);
    207.  
    208. end;
    209. //        выход
    210. procedure TForm1.Button2Click(Sender: TObject);
    211. begin
    212.   close;
    213. end;
    214. //        очистка результатов расчета
    215. procedure TForm1.Button3Click(Sender: TObject);
    216. begin
    217.   memo1.Clear;
    218.   ClearGraph1(Sender);
    219.   nCalcProg:=0;
    220. end;
    221.  
    222. //        проверка правильности ввода числа  in edit1 and edit2
    223. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
    224. begin
    225.    if not (Key in ['0'..'9', #8, '-', '.', ','])then
    226.     begin
    227.       Key:=#0;
    228.       beep;
    229.     end;
    230. end;
    231.  
    232.  
    233. end.


    архив [Ссылки могут видеть только зарегистрированные пользователи. ]
    Последний раз редактировалось nik_1; 01.10.2016 в 10:55.
    Ответить с цитированием  
     

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

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

  7. #6  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,852
    Сказал(а) спасибо
    1,816
    Поблагодарили 947 раз(а) в 809 сообщениях
    Записей в блоге
    1
    nik_1, дедукция 80 lvl, не иначе, ну ТС, молись, чтобы было правильно.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  8. #7  
    Новичок
    Регистрация
    29.09.2016
    Сообщений
    7
    Сказал(а) спасибо
    5
    Поблагодарили 1 раз в 1 сообщении
    Цитата Сообщение от nik_1 Посмотреть сообщение
    всем, привет! сделал не знаю правильно или нет. пускай кто ни будь проверит.

    [Ссылки могут видеть только зарегистрированные пользователи. ]
    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.     Edit1: TEdit;
    21.     Edit2: TEdit;
    22.     Image1: TImage;
    23.     Label1: TLabel;
    24.     Label10: TLabel;
    25.     Label11: TLabel;
    26.     Label12: TLabel;
    27.     Label2: TLabel;
    28.     Label3: TLabel;
    29.     Label4: TLabel;
    30.     Label5: TLabel;
    31.     Label6: TLabel;
    32.     Label7: TLabel;
    33.     Label8: TLabel;
    34.     Label9: TLabel;
    35.     Memo1: TMemo;
    36.     Panel1: TPanel;
    37.     Panel2: TPanel;
    38.     Panel3: TPanel;
    39.     ScrollBox1: TScrollBox;
    40.     StaticText1: TStaticText;
    41.     TrackBar1: TTrackBar;
    42.     TrackBar2: TTrackBar;
    43.  
    44.  
    45.     procedure Button1Click(Sender: TObject);
    46.     procedure Button2Click(Sender: TObject);
    47.     procedure Button3Click(Sender: TObject);
    48.     procedure Edit1KeyPress(Sender: TObject; var Key: char);
    49.     procedure FormCreate(Sender: TObject);
    50.     procedure ClearGraph1(Sender: TObject);
    51.     procedure TrackBar1MouseUp(Sender: TObject; Button: TMouseButton;
    52.       Shift: TShiftState; X, Y: Integer);
    53.     procedure TrackBar2MouseUp(Sender: TObject; Button: TMouseButton;
    54.       Shift: TShiftState; X, Y: Integer);
    55.  
    56.   private
    57.     { private declarations }
    58.  
    59.   public
    60.     { public declarations }
    61.   end;
    62.  
    63. var
    64.   Form1: TForm1;
    65.  
    66. implementation
    67.  
    68. {$R *.lfm}
    69.  
    70. { TForm1 }
    71.  
    72.  
    73. const  m = 16;      // масштаб
    74.        time_0 = 0;  // временные интервалы (границы искомой функции)
    75.        time_10 = 10;
    76.        time_11 = 11;
    77.        time_20 = 20;
    78.        eps=0.000001; // машинный ноль принимаем равным 0.000001
    79. var  x0, y0, time : integer;
    80.      N20 : real; // значение функции
    81.      Xenon, chrome : real; // значение переменных
    82.      nCalcProg :integer;  //количество расчётов
    83.  
    84. procedure TForm1.ClearGraph1(Sender: TObject);
    85.  
    86. var
    87.     i: Integer;
    88.     n, n1: Integer;
    89. begin
    90.   image1.Canvas.Brush.Color:=clwhite;
    91.   image1.Canvas.FillRect(0,0,Image1.Width,Image1.Height);
    92.   x0 := Image1.Width div 4;                  // центр координатной плоскости по х оси
    93.   y0 := Image1.Height-(Image1.Height div 4); // центр координатной плоскости по у оси
    94.  
    95.    // стартовое значение функции
    96.   if x0> y0 then n1 :=- Trunc(x0/m) else n1 := - Trunc(y0/m);
    97.   // конечное значение функции
    98.   n := Abs(n1);
    99.   // шрифт и размер символов
    100.   Image1.Canvas.Font.Name:='Arial';
    101.   Image1.Canvas.Font.Size:=5;
    102.  
    103.   //рисуем сетку серым цветом
    104.   Image1.Canvas.Pen.Color:=clSilver;
    105.   for i := n1 to n do
    106.     begin
    107.       Image1.Canvas.MoveTo(x0+i*m, 0);
    108.       Image1.Canvas.LineTo(x0+i*m, Image1.Height);
    109.       Image1.Canvas.MoveTo(0, y0-m*i);
    110.       Image1.Canvas.LineTo(Image1.Width, y0-m*i);
    111.     end;
    112.  
    113.   // координатная плоскость (рисуем оси)
    114.   Image1.Canvas.Pen.Color:=0;
    115.   Image1.Canvas.MoveTo(0, y0);
    116.   Image1.Canvas.LineTo(Image1.Width, y0);
    117.   Image1.Canvas.MoveTo(x0, 0);
    118.   Image1.Canvas.LineTo(x0, Image1.Height );
    119.  
    120.    // шкалирование осей
    121.   Image1.Canvas.Pen.Color:=0;
    122.   for i := n1 to n do
    123.     begin
    124.       Image1.Canvas.MoveTo(x0+i*m, y0-5);
    125.       Image1.Canvas.LineTo(x0+i*m, y0-(-5));
    126.       Image1.Canvas.TextOut(x0+i*m, y0+10, IntToStr(i));
    127.       Image1.Canvas.MoveTo(x0+5, y0-m*i);
    128.       Image1.Canvas.LineTo(x0-5, y0-m*i);
    129.       Image1.Canvas.TextOut(x0-15, y0+i*m, IntToStr(-i));
    130.     end;
    131.   Image1.Canvas.Font.Size:=8;
    132.   Image1.Canvas.Font.Color:=clRed;
    133.   Image1.Canvas.TextOut(x0+15, 0+15, 'N20');
    134.   Image1.Canvas.TextOut(Image1.Width-35, y0-20, 'time');
    135.  
    136.    Image1.Canvas.Pen.Color:=clGreen; //цвет графика
    137. end;
    138. //        обработка ползунка выбора   Xenon
    139. procedure TForm1.TrackBar1MouseUp(Sender: TObject; Button: TMouseButton;
    140.   Shift: TShiftState; X, Y: Integer);
    141. begin
    142.   Edit1.Text:=IntToStr(TrackBar1.Position);
    143. end;
    144. //        обработка ползунка выбора   chrome
    145. procedure TForm1.TrackBar2MouseUp(Sender: TObject; Button: TMouseButton;
    146.   Shift: TShiftState; X, Y: Integer);
    147. begin
    148.   Edit2.Text:=IntToStr(TrackBar2.Position);
    149. end;
    150.  
    151. //         создание формы
    152. procedure TForm1.FormCreate(Sender: TObject);
    153. begin
    154.   ClearGraph1(Sender);
    155.   nCalcProg :=0;  //количество расчётов
    156. end;
    157.  
    158. //        расчёт
    159. procedure TForm1.Button1Click(Sender: TObject);
    160. var sError_1  : ansistring;
    161.     n10 : real;
    162. begin
    163.   sError_1:='';
    164.   //ПРОВЕРКА ПРАВИЛЬНОСТИ ВВОДА ДАННЫХ
    165.   try
    166.     Xenon := StrToFloat (Edit1.Text);
    167.     chrome:= StrToFloat (Edit2.Text);
    168.     if abs(chrome)<=eps then sError_1:='Деление на ноль! Значение chrome должно быть не равно 0.';
    169.   except
    170.     sError_1:='Проверьте правильность ввода данных.';
    171.   end;
    172.  
    173.   // если ошибки нет то расчёт значения функции
    174.   if sError_1='' then
    175.     begin
    176.       nCalcProg:=nCalcProg+1;
    177.       ClearGraph1(Sender); //очистка экрана
    178.       memo1.Lines.Add('-----------< '+IntToStr(nCalcProg)+' >--------------');
    179.       memo1.Lines.Add('Исходные данные: '+Format(' Xenon=%f', [Xenon])
    180.                       +'; '+Format('  chrome=%f', [chrome]) );
    181.       //расчёт функции в границах  [time_0; time_10]
    182.       for time:=time_0 to time_10 do
    183.         begin
    184.           N20:= (25 + Xenon*(1-exp(time/chrome)));
    185.           memo1.Lines.Add('time='+IntToStr(time)+'  ->  '+Format('N20=%f', [N20]));
    186.           if time=time_0  then
    187.             Image1.Canvas.MoveTo(round(x0+time*m), round(y0-N20*m))
    188.           else
    189.             Image1.Canvas.LineTo(round(x0+time*m), round(y0-N20*m));
    190.         end;
    191.       n10:=N20;
    192.       //расчёт функции в границах  [time_11; time_20]
    193.       for time:=time_11 to time_20 do
    194.         begin
    195.           N20:= n10 * exp (- ((time_11)-(time_10))/chrome);
    196.           if  N20<=25 then N20:=25
    197.           else N20:=(N10 * exp (- ((time_11)-(time_10))/chrome));
    198.           memo1.Lines.Add('time='+IntToStr(time)+'  ->  '+Format('N20=%f', [N20]));
    199.           Image1.Canvas.LineTo(round(x0+time*m), round(y0-N20*m));
    200.         end;
    201.       Image1.Canvas.TextOut(1,1, 'График ф-ии N20');
    202.       Image1.Canvas.TextOut(1,20, 'для расчёта №'+ IntToStr(nCalcProg));
    203.     end;
    204.  
    205.   // завершение расчета и выход по ошибке
    206.   if sError_1<>'' then ShowMessage('   Ошибка!'+#13#10+ sError_1);
    207.  
    208. end;
    209. //        выход
    210. procedure TForm1.Button2Click(Sender: TObject);
    211. begin
    212.   close;
    213. end;
    214. //        очистка результатов расчета
    215. procedure TForm1.Button3Click(Sender: TObject);
    216. begin
    217.   memo1.Clear;
    218.   ClearGraph1(Sender);
    219.   nCalcProg:=0;
    220. end;
    221.  
    222. //        проверка правильности ввода числа  in edit1 and edit2
    223. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
    224. begin
    225.    if not (Key in ['0'..'9', #8, '-', '.', ','])then
    226.     begin
    227.       Key:=#0;
    228.       beep;
    229.     end;
    230. end;
    231.  
    232.  
    233. end.


    архив [Ссылки могут видеть только зарегистрированные пользователи. ]
    Спасибо большое за оказанную помощь!!! Вы очень добры! Можно внести некоторые корректировочки?
    В этом блоке функция немного по-другому выглядит, со знаком минус:
    Pascal Code:
    1.       //расчёт функции в границах  [time_0; time_10]
    2.       for time:=time_0 to time_10 do
    3.         begin
    4.           N20:= (25+ Xenon*(1-exp(-time/chrome)));


    Как оказалось, ось абсцисс градуируется следующим образом:
    Изначально (в Edit3) задается некоторое число k. График по оси абсцисс имеет следующие координаты:
    x1 = 0.1*K, x2=0.2*k, x3=0.3*k, x4=0.4*k, x5=0.5*k, x6=0.6*k, x7=0.7*k, x8=0.8*k, x9=0.9*k, x10 = k, x11 = 1.1*k, x12=1.2*k, x13=1.3*k, x14=1.4*k, x15=1.5*k, x16=1.6*k, x17=1.7*k, x18=1.8*k, x19=1.9*k, x20=2*k

    И можно ли сделать так, чтобы оси градуировались в зависимости от решения? Т.е чтобы шкала автоматически изменялась (по оси ординат).
    Например, график при значениях Chrome = 110,628, k = 5 и Xenon = 951,814 должен иметь следующий вид:
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  9. #8  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,852
    Сказал(а) спасибо
    1,816
    Поблагодарили 947 раз(а) в 809 сообщениях
    Записей в блоге
    1
    И можно ли сделать так, чтобы оси градуировались в зависимости от решения? Т.е чтобы шкала автоматически изменялась (по оси ординат).
    Всё сделать можно, писал такую штуку на бейсиках давно ещё с автоподбором осей. Скопирую с другого форума
    т.к. код платформо независимый(не исп. функции логич. координат диалекта) и может быть полезен:

    QB-код \ пример подгона сетки под график

    Программа для построения графиков функций.
    Автоматически подбирает масштабы по осям, исходя из границ всех графиков.
    QBasic Code:
    1. CONST Pi = 3.141592653589793#
    2. DIM MinX, MinY, MaxX, MaxY
    3. DIM XRazn, YRazn, MnogX, MnogY
    4. DIM StpScX AS INTEGER, StpScY AS INTEGER
    5.   '  Функции графиков
    6.   DEF FnY1 (x) = SIN(x)
    7.   DEF FnY2 (x) = COS(x)
    8.   DEF FnY3 (x) = x / 2
    9.   DEF FnY4 (x) = x * x * .1
    10.   DEF FnY5 (x) = SQR(EXP(x)) * .3
    11. '  Ф-ция поиска границ
    12. DEF FnMinMax (x, y)
    13.     IF x < MinX THEN MinX = x
    14.     IF x > MaxX THEN MaxX = x
    15.     IF y < MinY THEN MinY = y
    16.     IF y > MaxY THEN MaxY = y
    17. '  Экранное преобразование
    18. DEF FnGetX (x) = x * MnogX - MinX * MnogX
    19. DEF FnGetY (y) = y * MnogY - MaxY * MnogY
    20. '  Параметры трассировки функций
    21. Str1 = -Pi: Str2 = -Pi: Str3 = -Pi: Str4 = -Pi: Str5 = -Pi
    22. End1 = Pi: End2 = Pi: End3 = Pi: End4 = Pi: End5 = Pi
    23. Stp1 = .01: Stp2 = .03: Stp3 = .1: Stp4 = .1: Stp5 = .1
    24. '  Переменные для трассировки
    25. x1 = Str1: x2 = Str2: x3 = Str3: x4 = Str4: x5 = Str5
    26. y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3): y4 = FnY4(x4): y5 = FnY5(x5)
    27. '  Вычисляем параметры графиков
    28. DO
    29.   Go = 0: y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3)
    30.   y4 = FnY4(x4): y5 = FnY5(x5)
    31.   IF x1 < End1 THEN x1 = x1 + Stp1: y1 = FnY1(x1): Go = -1
    32.   IF x2 < End2 THEN x2 = x2 + Stp2: y2 = FnY2(x2): Go = -1
    33.   IF x3 < End3 THEN x3 = x3 + Stp3: y3 = FnY3(x3): Go = -1
    34.   IF x4 < End4 THEN x4 = x4 + Stp4: y4 = FnY4(x4): Go = -1
    35.   IF x5 < End5 THEN x5 = x5 + Stp5: y5 = FnY5(x5): Go = -1
    36.   i = FnMinMax(x1, y1)     '  Ищем границы
    37.   i = FnMinMax(x2, y2)
    38.   i = FnMinMax(x3, y3)
    39.   i = FnMinMax(x4, y4)
    40.   i = FnMinMax(x5, y5)
    41. LOOP WHILE Go
    42.   PRINT
    43.   PRINT "  "; INT(MinX); INT(MinY); INT(MaxX); INT(MaxY)
    44. '  Реинициализация трассировки
    45. x1 = Str1: x2 = Str2: x3 = Str3: x4 = Str4: x5 = Str5
    46. y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3): y4 = FnY4(x4): y5 = FnY5(x5)
    47. '  Старые координаты(Прошлый шаг трассировки)
    48. xo1 = x1: xo2 = x2: xo3 = x3: xo4 = x4: xo5 = x5
    49. yo1 = y1: yo2 = y2: yo3 = y3: yo4 = y4: yo5 = y5
    50. '  Делаем фрейм пошире, чтобы больше было видно
    51. '  + сетку, если она где-то рядом
    52. XRazn = MaxX - MinX
    53. YRazn = MinY - MaxY
    54. MinX = MinX - XRazn / 4
    55. MaxX = MaxX + XRazn / 4
    56. MinY = MinY + YRazn / 4
    57. MaxY = MaxY - YRazn / 4
    58. '  Для преобразования координат в экранные
    59. XRazn = MaxX - MinX    ' Разности координат графиков
    60. YRazn = MinY - MaxY
    61.   IF XRazn = 0 THEN XRazn = .00001
    62.   IF YRazn = 0 THEN YRazn = .00001
    63. MnogX = 640 / XRazn    ' Отнош. к разностям коо. гр.
    64. MnogY = 480 / YRazn
    65. StpScX = 1: StpScY = 1 ' Шаг сетки
    66. '  Если сетка не умещается увеличиваем шаг сетки
    67. DO: ScTst = 0
    68.   IF ABS(XRazn / StpScX) > 160 THEN StpScX = StpScX * 10: ScTst = -1
    69.   IF ABS(YRazn / StpScY) > 120 THEN StpScY = StpScY * 10: ScTst = -1
    70. LOOP WHILE ScTst
    71.  
    72. '  Нарисуем сетку
    73. DlSc = SQR(1 / ABS(XRazn / StpScX) + 1 / ABS(XRazn / StpScX)) * 10
    74. IF DlSc > 10 THEN DlSc = 10
    75. IF DlSc < 2 THEN DlSc = 2
    76. LINE (FnGetX(MinX), FnGetY(0))-(FnGetX(MaxX), FnGetY(0)), 8
    77. LINE (FnGetX(0), FnGetY(MinY))-(FnGetX(0), FnGetY(MaxY)), 8
    78. FOR i = INT(MinX) TO INT(MaxX) STEP StpScX
    79.   LINE (FnGetX(i), FnGetY(0) - DlSc)-(FnGetX(i), FnGetY(0) + DlSc), 8
    80. NEXT
    81. FOR i = INT(MinY) TO INT(MaxY) STEP StpScY
    82.   LINE (FnGetX(0) - DlSc, FnGetY(i))-(FnGetX(0) + DlSc, FnGetY(i)), 8
    83. NEXT
    84.  
    85. '  Рисуем графики
    86. DO
    87.   Go = 0: y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3)
    88.   IF x1 < End1 THEN x1 = x1 + Stp1: y1 = FnY1(x1): Go = -1
    89.   IF x2 < End2 THEN x2 = x2 + Stp2: y2 = FnY2(x2): Go = -1
    90.   IF x3 < End3 THEN x3 = x3 + Stp3: y3 = FnY3(x3): Go = -1
    91.   IF x4 < End4 THEN x4 = x4 + Stp4: y4 = FnY4(x4): Go = -1
    92.   IF x5 < End5 THEN x5 = x5 + Stp5: y5 = FnY5(x5): Go = -1
    93.     LINE (FnGetX(xo1), FnGetY(yo1))-(FnGetX(x1), FnGetY(y1)), 9
    94.     LINE (FnGetX(xo2), FnGetY(yo2))-(FnGetX(x2), FnGetY(y2)), 10
    95.     LINE (FnGetX(xo3), FnGetY(yo3))-(FnGetX(x3), FnGetY(y3)), 7
    96.     LINE (FnGetX(xo4), FnGetY(yo4))-(FnGetX(x4), FnGetY(y4)), 12
    97.     LINE (FnGetX(xo5), FnGetY(yo5))-(FnGetX(x5), FnGetY(y5)), 14
    98.   xo1 = x1: xo2 = x2: xo3 = x3: xo4 = x4: xo5 = x5  ' Старые координаты
    99.   yo1 = y1: yo2 = y2: yo3 = y3: yo4 = y4: yo5 = y5
    100. LOOP WHILE Go
    101.  
    102. WHILE INKEY$ = "": WEND   ' Ждать кнопку


    Перевести на лазарус(в паскаль синтаксис) - особых трудностей быть не должно. На лазарусе даже проще
    будет всё разметить, там хоть шрифты человеческие.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

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

    Daniel_Riccardo (03.10.2016), Free Admin (03.10.2016), nik_1 (03.10.2016)

  11. #9  
    Профи Аватар для nik_1
    Регистрация
    03.08.2014
    Сообщений
    283
    Сказал(а) спасибо
    160
    Поблагодарили 145 раз(а) в 109 сообщениях
    Записей в блоге
    1
    я так понял К - это маштабирующий коэффициент по оси у. если его ввести фигня полная выйдет. нам ни какого экрана не хватит чтобы график построить. с перемещением графика по оси у проблем нет.

    вложение 1827 у меня не открывается.


    я таки вас понял. заказчик хочет лицезреть весь график и по графику считывать промежуточные координаты. тогда есть такое решение график функции вписывается в экран. а на промежуточных участках применяется лупа. размер лупы и маштаб лупы задается пользователем.


    это уже на курсовик тянет.
    Последний раз редактировалось nik_1; 03.10.2016 в 07:21.
    Ответить с цитированием  
     

  12. #10  
    Новичок
    Регистрация
    29.09.2016
    Сообщений
    7
    Сказал(а) спасибо
    5
    Поблагодарили 1 раз в 1 сообщении
    Цитата Сообщение от nik_1 Посмотреть сообщение
    я так понял К - это маштабирующий коэффициент по оси у.
    .
    Нет, это коэффициент по оси Х. Не нужно никаких луп)
    Например, график должен выглядеть следующим образом при значениях: Chrome = 110,628, k = 5 и Xenon = 951,814. (т.е по осям ограничений быть не должно: максимальные значения могут достигать 40, 100, 200 и тд. )
    [Ссылки могут видеть только зарегистрированные пользователи. ],

    Вводим значения Xenon, Chrome, k.
    График должен строиться следующим образом:
    1) по оси Х всего 20 точек: В зависимости от коэффициента k:
    x1 = 0.1*K;
    x2=0.2*k;
    x3=0.3*k;
    x4=0.4*k;
    x5=0.5*k;
    x6=0.6*k;
    x7=0.7*k;
    x8=0.8*k;
    x9=0.9*k;
    x10 = k;
    x11 = 1.1*k;
    x12=1.2*k;
    x13=1.3*k;
    x14=1.4*k;
    x15=1.5*k;
    x16=1.6*k;
    x17=1.7*k;
    x18=1.8*k;
    x19=1.9*k;
    x20=2*k


    2) по оси Y всего 20 точек: по формуле:
    N20(1) = 25+Xenon*(1-EXP(-x1/Chrome));
    N20(2) = 25+Xenon*(1-EXP(-x2/Chrome));
    N20(3) = 25+Xenon*(1-EXP(-x3/Chrome));
    N20(4) = 25+Xenon*(1-EXP(-x4/Chrome));
    N20(5) = 25+Xenon*(1-EXP(-x5/Chrome));
    N20(6) = 25+Xenon*(1-EXP(-x6/Chrome));
    N20(7) = 25+Xenon*(1-EXP(-x7/Chrome));
    N20(8) = 25+Xenon*(1-EXP(-x8/Chrome));
    N20(9) = 25+Xenon*(1-EXP(-x9/Chrome));
    N20(10) = 25+Xenon*(1-EXP(-x10/Chrome));

    N20(11) = ЕСЛИ[N20(10)*EXP{-(x11-x10)/Chrome}<25;25;N20(10)*EXP{-(x11-x10)/Chrome}]
    т.е если значение выражения [N20(10)*EXP{-(x11-x10)/Chrome} меньше числа 25, то принять N20(11) = 25. Если же значение этого выражения получилось больше числа 25, то N20(11) = значению этого выражения

    N20(12) = ЕСЛИ[N20(10)*EXP{-(x12-x10)/Chrome}<25;25;N20(10)*EXP{-(x12-x10)/Chrome}];
    N20(13) = ЕСЛИ[N20(10)*EXP{-(x13-x10)/Chrome}<25;25;N20(10)*EXP{-(x13-x10)/Chrome}];
    N20(14) = ЕСЛИ[N20(10)*EXP{-(x14-x10)/Chrome}<25;25;N20(10)*EXP{-(x14-x10)/Chrome}];
    N20(15) = ЕСЛИ[N20(10)*EXP{-(x15-x10)/Chrome}<25;25;N20(10)*EXP{-(x15-x10)/Chrome}];
    N20(16) = ЕСЛИ[N20(10)*EXP{-(x16-x10)/Chrome}<25;25;N20(10)*EXP{-(x16-x10)/Chrome}];
    N20(17) = ЕСЛИ[N20(10)*EXP{-(x17-x10)/Chrome}<25;25;N20(10)*EXP{-(x17-x10)/Chrome}];
    N20(18) = ЕСЛИ[N20(10)*EXP{-(x18-x10)/Chrome}<25;25;N20(10)*EXP{-(x18-x10)/Chrome}];
    N20(19) = ЕСЛИ[N20(10)*EXP{-(x19-x10)/Chrome}<25;25;N20(10)*EXP{-(x19-x10)/Chrome}];
    N20(20) = ЕСЛИ[N20(10)*EXP{-(x20-x10)/Chrome}<25;25;N20(10)*EXP{-(x20-x10)/Chrome}].
    Последний раз редактировалось Daniel_Riccardo; 03.10.2016 в 11:32.
    Ответить с цитированием  
     

Страница 1 из 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
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •