Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Windows,Math, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart;
- type
- TForm1 = class(TForm)
- Chart1: TChart;
- Series1: TPointSeries;
- Label1: TLabel;
- Edit1: TEdit;
- FirstRadio: TRadioButton; //Здесь, понятно, создаются "радио" кнопки и прочие элементы Unit'a
- SecondRadio: TRadioButton;
- ThirdRadio: TRadioButton;
- FourRadio: TRadioButton;
- Button1: TButton;
- Label2: TLabel;
- Edit2: TEdit;
- procedure Button1Click(Sender: TObject); // инициализация процедуры заранее,
- procedure First(range,a:double); // для возможности прописать ее действия
- procedure Second(range,a:double); // в любой части кода после
- procedure Third(); // в третьем графике никакие параметры не нужны,поэтому просто процедура)
- procedure Fourth(range,a:double);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- procedure TForm1.Button1Click(Sender: TObject);
- var range,param:double; // ну собсна инициализируем переменные для кнопки простроения.
- begin
- Chart1.BottomAxis.Automatic := true; //это ось х. она будет автоматически подстраиваться под графики.
- Chart1.LeftAxis.Automatic := true; //это ось у, это нужно потому, что в одном из графиков нужно жестко задавать границы осей.
- Series1.Clear; //очистка графика. Фактически эти три команды возвращают в состояние по умолчанию, которое потом
- //уже другие процедуры возможно будут менять.
- param:= StrToFloat(Edit1.Text); //вводим переменную 'a' из графиков. у тебя только одна 'a' в графиках из параметров.
- range:= abs(StrToFloat(Edit2.Text)); // это больше для удобства, это диапазон x от минус range до плюс range. abs - чтобы не сломать счетчики отрицательными значениями)))
- if FirstRadio.Checked then //проверка на "отмеченную" радио-кнопку. Видимо в пределах одного Unit'a все кнопки зависимы,
- First(range,param); //вызываем процедуру,передаем ей диапазон и 'a'.
- if SecondRadio.Checked then // то есть если отметим одну,вторая автоматически снимит с себя отметку.
- Second(range,param);
- if ThirdRadio.Checked then //это избавляет от проверки типа "если отмечена эта и не отмечены та,та и та".
- Third(); // В третьем графике нет параметров, так как график существует только на t[-pi;pi]. ни x ни 'a' сюда не нужны.
- if FourRadio.Checked then
- Fourth(range,param);
- end;
- procedure TForm1.First(range,a:double);
- var x,y,znam:double; //инициализируем локальные переменные каждой подпрограммы(процедуры). это делается между инициализацией и описанием(блоком begin-end) процедуры.
- begin
- Chart1.LeftAxis.SetMinMax(-range,range); // а вот и то место,где меняется масштаб по y. к сожалению там y улетает ввысь/низь из-за пары точек.
- x:=-range; //вводим минимальный x.
- while x < range do //начинаем цикл,который будет перебирать все x(-range;range)
- begin
- x:=x+0.01; //каждую итерацию(проход) цикла будет инкрименировать(увеличивать) x на небольшую величину. чем меньше величина, тем больше точек, тем больше график похож на линию.
- znam := (2*a-x); //вспомогательно ввожу значение для знаменателя в графике.
- if znam <> 0 then//проверяю на 0,чтобы вселенная не схлопнулась))))
- begin //В блоке условия провожу все вычисления, чтобы не получилось так, что по знаменателю точки не существует,но из-за предыдущего значения y появилась лишняя точка
- y:= Power(x,3) / znam ; //получаем y^2. тут всё просто
- if y> 0 then //внутри создаем еще один блок, так как y может получиться отрицательных - точки не существует. из -y корень не извлечь
- begin
- Series1.AddXY(x,sqrt(y)); //отмечаем точку с sqrt(y^2).
- Series1.AddXY(x,-sqrt(y)); //отмечаем точку с -sqrt(y^2).
- end;
- end;
- end;
- Chart1.SaveToBitmapFile('first.bmp'); //сохраняем график в картинку bmp.
- end;
- procedure TForm1.Second(range,a:double);
- var x, y, p,f:double;
- begin
- Chart1.LeftAxis.SetMinMax(-a*2,a*2); //снова меняем размеры
- range:=min(5,range); //так как f это параметр для cos/sin, не имеет смысл ему быть больше pi. я поставил 5) если ввести range 2, то будет 2)
- f:= -range; //начало отсчета
- while f < range do
- begin
- f:=f+0.02;
- if cos(f)<>0 then //здесь запариваться в хранении знаменателя нет смысла.
- begin
- p:= -a*cos(2*f)/cos(f); //получаем ро по графику из задания.
- x:=p*cos(f); //для перевода из полярной системы координат в нашу обычную нужно сделать вот так.
- y:=p*sin(f); //и вот так.
- Series1.AddXY(x,y); //отмечаем точку на графике)
- end;
- end;
- Chart1.SaveToBitmapFile('second.bmp');
- end;
- procedure TForm1.Third(); //здесь я думаю по аналогии все понятно.
- var x, y, t:double;
- begin
- t:= -10;
- while t< 10 do
- begin
- t:=t+0.01;
- if cos(abs(t)) >=0 then begin //чтоб под корень отрицательный косинус не попал.
- x:= sin(t)*cos(t)*ln(abs(t));
- y:= sqrt(cos(abs(t)))*power(abs(t),0.3);
- Series1.AddXY(x,y);
- end;
- end;
- Chart1.SaveToBitmapFile('third.bmp');
- end;
- procedure TForm1.Fourth(range,a:double); //здесь как в первом графике всё почти идентично
- var x, yq :double;
- begin
- x:= -range;
- while x< range do
- begin
- x:=x+0.05;
- yq := (a-x)*sqr(8*a+x)/(27*a); //поделили левую часть на 27a. ничего более
- if yq >=0 then //здесь заранее просчитать знак, чтоб не считать выражение затратнее чем просто посчитать выражение. опять же проверяем, чтоб выносить корень из - не пришлось.
- begin
- Series1.AddXY(x,sqrt(yq)); //как в первом графике
- Series1.AddXY(x,-sqrt(yq));
- end;
- end;
- Chart1.SaveToBitmapFile('fourth.bmp');
- end;
- //И всё. Вы восхитительны! =)
- end.
Advertisement
Add Comment
Please, Sign In to add comment