Darkrai1337

unit1

Nov 25th, 2021
666
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows,Math, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Chart1: TChart;
  12.     Series1: TPointSeries;
  13.     Label1: TLabel;
  14.     Edit1: TEdit;
  15.     FirstRadio: TRadioButton;  //Здесь, понятно, создаются "радио" кнопки и прочие элементы Unit'a
  16.     SecondRadio: TRadioButton;
  17.     ThirdRadio: TRadioButton;
  18.     FourRadio: TRadioButton;
  19.     Button1: TButton;
  20.     Label2: TLabel;
  21.     Edit2: TEdit;
  22.     procedure Button1Click(Sender: TObject);  // инициализация процедуры заранее,
  23.     procedure First(range,a:double);          // для возможности прописать ее действия
  24.     procedure Second(range,a:double);         // в любой части кода после
  25.     procedure Third();                    // в третьем графике никакие параметры не нужны,поэтому просто процедура)
  26.     procedure Fourth(range,a:double);
  27.   private
  28.     { Private declarations }
  29.   public
  30.     { Public declarations }
  31.   end;
  32.  
  33. var
  34.   Form1: TForm1;
  35.  
  36.  
  37. implementation
  38.  
  39. {$R *.dfm}
  40.  
  41.  
  42. procedure TForm1.Button1Click(Sender: TObject);
  43. var range,param:double;   // ну собсна инициализируем переменные для кнопки простроения.
  44. begin
  45. Chart1.BottomAxis.Automatic := true; //это ось х. она будет автоматически подстраиваться под графики.
  46. Chart1.LeftAxis.Automatic := true;   //это ось у, это нужно потому, что в одном из графиков нужно жестко задавать границы осей.
  47. Series1.Clear;                       //очистка графика. Фактически эти три команды возвращают в состояние по умолчанию, которое потом
  48.                                      //уже другие процедуры возможно будут менять.
  49.  
  50.  param:= StrToFloat(Edit1.Text);      //вводим переменную 'a' из графиков. у тебя только одна 'a' в графиках из параметров.
  51.  range:= abs(StrToFloat(Edit2.Text)); // это больше для удобства, это диапазон x от минус range до плюс range. abs - чтобы не сломать счетчики отрицательными значениями)))
  52. if FirstRadio.Checked then    //проверка на "отмеченную" радио-кнопку. Видимо в пределах одного Unit'a все кнопки зависимы,
  53. First(range,param);   //вызываем процедуру,передаем ей диапазон и 'a'.
  54. if SecondRadio.Checked then   // то есть если отметим одну,вторая автоматически снимит с себя отметку.
  55. Second(range,param);
  56. if ThirdRadio.Checked then    //это избавляет от проверки типа "если отмечена эта и не отмечены та,та и та".
  57. Third();              // В третьем графике нет параметров, так как график существует только на t[-pi;pi]. ни x ни 'a' сюда не нужны.
  58. if FourRadio.Checked then
  59. Fourth(range,param);
  60. end;
  61.  
  62. procedure TForm1.First(range,a:double);
  63. var x,y,znam:double;    //инициализируем локальные переменные каждой подпрограммы(процедуры). это делается между инициализацией и описанием(блоком begin-end) процедуры.
  64. begin
  65. Chart1.LeftAxis.SetMinMax(-range,range);  // а вот и то место,где меняется масштаб по y. к сожалению там y улетает ввысь/низь из-за пары точек.
  66. x:=-range;   //вводим минимальный x.
  67.  
  68. while x < range do   //начинаем цикл,который будет перебирать все x(-range;range)
  69. begin
  70. x:=x+0.01;  //каждую итерацию(проход) цикла будет инкрименировать(увеличивать) x на небольшую величину. чем меньше величина, тем больше точек, тем больше график похож на линию.
  71. znam := (2*a-x); //вспомогательно ввожу значение для знаменателя в графике.
  72. if znam <> 0 then//проверяю на 0,чтобы вселенная не схлопнулась))))
  73. begin         //В блоке условия провожу все вычисления, чтобы не получилось так, что по знаменателю точки не существует,но из-за предыдущего значения y появилась лишняя точка
  74. y:= Power(x,3) / znam ;   //получаем y^2. тут всё просто
  75. if y> 0 then  //внутри создаем еще один блок, так как y может получиться отрицательных - точки не существует. из -y корень не извлечь
  76. begin
  77. Series1.AddXY(x,sqrt(y));   //отмечаем точку с sqrt(y^2).
  78. Series1.AddXY(x,-sqrt(y));  //отмечаем точку с -sqrt(y^2).
  79. end;
  80. end;
  81.  
  82. end;
  83. Chart1.SaveToBitmapFile('first.bmp'); //сохраняем график в картинку bmp.
  84. end;
  85.  
  86.  
  87. procedure TForm1.Second(range,a:double);
  88. var x, y, p,f:double;
  89. begin
  90. Chart1.LeftAxis.SetMinMax(-a*2,a*2);    //снова меняем размеры
  91. range:=min(5,range);  //так как f это параметр для cos/sin, не имеет смысл ему быть больше pi. я поставил 5) если ввести range 2,  то будет 2)
  92. f:= -range; //начало отсчета
  93.  
  94. while f < range do
  95. begin
  96. f:=f+0.02;  
  97. if cos(f)<>0 then //здесь запариваться в хранении знаменателя нет смысла.
  98. begin
  99. p:= -a*cos(2*f)/cos(f);   //получаем ро по графику из задания.
  100. x:=p*cos(f);  //для перевода из полярной системы координат в нашу обычную нужно сделать вот так.
  101. y:=p*sin(f);  //и вот так.
  102. Series1.AddXY(x,y); //отмечаем точку на графике)
  103. end;
  104. end;
  105.  
  106. Chart1.SaveToBitmapFile('second.bmp');
  107. end;
  108.  
  109.  
  110. procedure TForm1.Third(); //здесь я думаю по аналогии все понятно.
  111. var x, y, t:double;
  112. begin
  113. t:= -10;    
  114. while t< 10 do
  115. begin
  116. t:=t+0.01;
  117. if cos(abs(t)) >=0 then begin   //чтоб под корень отрицательный косинус не попал.
  118. x:= sin(t)*cos(t)*ln(abs(t));
  119. y:= sqrt(cos(abs(t)))*power(abs(t),0.3);
  120. Series1.AddXY(x,y);
  121. end;
  122. end;
  123. Chart1.SaveToBitmapFile('third.bmp');
  124. end;
  125.  
  126.  
  127. procedure TForm1.Fourth(range,a:double);  //здесь как в первом графике всё почти идентично
  128. var x, yq :double;
  129. begin
  130. x:= -range;
  131. while x< range do
  132. begin
  133. x:=x+0.05;
  134. yq := (a-x)*sqr(8*a+x)/(27*a);  //поделили левую часть на 27a. ничего более
  135. if yq >=0 then  //здесь заранее просчитать знак, чтоб не считать выражение затратнее чем просто посчитать выражение. опять же проверяем, чтоб выносить корень из - не пришлось.
  136. begin
  137. Series1.AddXY(x,sqrt(yq));    //как в первом графике
  138. Series1.AddXY(x,-sqrt(yq));
  139. end;
  140. end;
  141.  
  142.  Chart1.SaveToBitmapFile('fourth.bmp');
  143. end;
  144.  
  145. //И всё. Вы восхитительны! =)
  146.  
  147. end.
  148.  
RAW Paste Data