-
Исходные коды программы.
MainUnit.h
//---------------------------------------------------------------------------
#ifndef MainUnitH
#define MainUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Grids.hpp>
#include <vector.h>
#include "sSkinManager.hpp"
#include "sLabel.hpp"
#include "sBitBtn.hpp"
#include <Buttons.hpp>
#include "sGroupBox.hpp"
#include "sCheckBox.hpp"
#include "sPanel.hpp"
#include <ExtCtrls.hpp>
#include "sSkinProvider.hpp"
#include "sUpDown.hpp"
#include "sPageControl.hpp"
#include "Common.h"
#include "sColorSelect.hpp"
#include "sSpeedButton.hpp"
#include "acPNG.hpp"
#include "sTrackBar.hpp"
#include "sRadioButton.hpp"
#include "sStatusBar.hpp"
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published:
TsSkinManager *sSkinManager1;
TsSkinProvider *sSkinProvider1;
TsStatusBar *sStatusBar1;
TImage *Image1;
TsPanel *sPanel1;
TsColorSelect *sColorSelect1;
TsRadioButton *sRadioButton1;
TsRadioButton *sRadioButton2;
TsRadioButton *sRadioButton3;
TsBitBtn *sBitBtn1;
void __fastcall sBitBtn1Click(TObject *Sender);
void __fastcall check(TObject *Sender);
void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
void __fastcall Image1MouseLeave(TObject *Sender);
void __fastcall sColorSelectChange1(TObject *Sender);
void __fastcall sBitBtn2Click(TObject *Sender);
void __fastcall Image1Click(TObject *Sender);
void __fastcall sRadioButton1Click(TObject *Sender);
void __fastcall sColorSelect1MouseEnter(TObject *Sender);
void __fastcall sColorSelect1MouseLeave(TObject *Sender);
private:
vector<point> Fpoints[6];
vector< vector<point> > Fpoints2;
public:
__fastcall TMainForm(TComponent* Owner);
// Вычисления
void recount();
double f1(double, double);
double f2(double, double);
double y(double, double);
double x(double, double);
// Работа с графиками
void paint();
void functionPaint(TImage *, vector<functionOptions>, point, bool, bool);
void addFunction(vector<functionOptions> &, vector<point>, TColor, bool,
TPenStyle, AnsiString, int);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
MainUnit.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "MainUnit.h"
#include "EditUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "sPageControl"
#pragma link "sSkinManager"
#pragma link "sLabel"
#pragma link "sBitBtn"
#pragma link "sGroupBox"
#pragma link "sCheckBox"
#pragma link "sPanel"
#pragma link "sSkinProvider"
#pragma link "sUpDown"
#pragma link "sPageControl"
#pragma link "sColorSelect"
#pragma link "sSpeedButton"
#pragma link "acPNG"
#pragma link "sTrackBar"
#pragma link "sRadioButton"
#pragma link "sStatusBar"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner)
{
recount();
}
/*--- Заданные функции правых частей системы --------------------------------
* x, y - концентрации реагентов X и Y
*/
double TMainForm::f1(double x, double y)
{
return Options.b * x - x * x * y;
}
double TMainForm::f2(double x, double y)
{
return Options.a - (Options.b + 1) * x + x * x * y;
}
/*--- Поиск численных решений системы методом Рунге-Кутты 3-его порядка -----
* y_prev, x_prev - предыдущие значения функций
* Результат: Значение функции в точке t + h
*/
double TMainForm::y(double x_prev, double y_prev)
{
double k1 = f1(x_prev, y_prev);
double k2 = f1(x_prev + Options.h * Options.b2 * k1, y_prev + Options.h * Options.b2 * k1);
double k3 = f1(x_prev + Options.h * (Options.b31 * k1 + Options.b32 * k2), y_prev + Options.h * (Options.b31 * k1 + Options.b32 * k2));
return y_prev + Options.h * (Options.c1 * k1 + Options.c2 * k2 + Options.c3 * k3);
}
double TMainForm::x(double x_prev, double y_prev)
{
double k1 = f2(x_prev, y_prev);
double k2 = f2(x_prev + Options.h * Options.b2 * k1, y_prev + Options.h * Options.b2 * k1);
double k3 = f2(x_prev + Options.h * (Options.b31 * k1 + Options.b32 * k2), y_prev + Options.h * (Options.b31 * k1 + Options.b32 * k2));
return x_prev + Options.h * (Options.c1 * k1 + Options.c2 * k2 + Options.c3 * k3);
}
/*--- Поиск минимума и максимума в векторе точек функции на плоскости ------
* P - вектор точкек (x,y)
*/
double maxy(vector<point> P)
{
double max = 0;
if(P.size())
{
max = P.front().y;
for(int t = 1; t < P.size(); t++)
if(P[t].y > max) max = P[t].y;
}
return max;
}
double miny(vector<point> P)
{
double min = 0;
if(P.size())
{
min = P.front().y;
for(int t = 1; t < P.size(); t++)
if(P[t].y < min) min = P[t].y;
}
return min;
}
double maxx(vector<point> P)
{
double max = 0;
if(P.size())
{
max = P.front().x;
for(int t = 1; t < P.size(); t++)
if(P[t].x > max) max = P[t].x;
}
return max;
}
double minx(vector<point> P)
{
double min = 0;
if(P.size())
{
min = P.front().x;
for(int t = 1; t < P.size(); t++)
if(P[t].x < min) min = P[t].x;
}
return min;
}
//--- Расчёт задачи --------------------------------------------------------
void TMainForm::recount()
{
double ta = Options.ta;
double tb = Options.tb;
double h = Options.h;
double x0 = Options.x0;
double y0 = Options.y0;
// Коррекция шага
h = (tb - ta) / (int((tb - ta) / h) + 1.);
// Начальные условия
Fpoints[0].clear();
Fpoints[1].clear();
Fpoints[2].clear();
point P1 = {ta, y0};
point P2 = {ta, x0};
point P3 = {y0, x0};
Fpoints[0].push_back(P1);
Fpoints[1].push_back(P2);
Fpoints[2].push_back(P3);
// Поиск точек семейства решений
vector<point> T;
int j = 0, v = -1;
Fpoints2.clear();
for (int i = 0; j < 10; i++)
if(((y0 - 1) + i * 0.2) > 0)
{
if(v == -1)
v = i;
T.clear();
point P = {ta, (y0 - 1) + double(i) * 0.2};
if(fabs(P.y) < 0.00000001)
P.y = 0;
if(fabs(P.y - y0) < 0.00000001)
P.y = y0;
T.push_back(P);
if(Fpoints2.size() < 10)
Fpoints2.push_back(T);
j++;
}
j = 0;
for (int i = v; j < 10; i++)
if(((x0 - 1) + i * 0.2) > 0)
{
T.clear();
point P = {ta, (x0 - 1) + i * 0.2};
if(fabs(P.y) < 0.00000001)
P.y = 0;
if(fabs(P.y - x0) < 0.00000001)
P.y = x0;
T.push_back(P);
if(Fpoints2.size() < 20)
Fpoints2.push_back(T);
j++;
}
for (int i = 0; i < 10; i++)
{
T.clear();
point P = {Fpoints2[i].front().y, Fpoints2[i+10].front().y};
T.push_back(P);
Fpoints2.push_back(T);
}
for(int i = 0; i < 10; i++)
{
int j = 1;
for(double t = ta + h; t <= tb; t = ta + j * h)
{
point P1 = {t, y(Fpoints2[i + 10].back().y, Fpoints2[i].back().y)};
point P2 = {t, x(Fpoints2[i + 10].back().y, Fpoints2[i].back().y)};
point P3 = {P1.y, P2.y};
Fpoints2[i].push_back(P1);
Fpoints2[i + 10].push_back(P2);
Fpoints2[i + 20].push_back(P3);
j++;
}
}
paint();
MainForm->Refresh();
}
/*--- Построение графиков функций на компаненте TImage ---------------------
* Image - указатель на объект типа TImage
* Functions - вектор структур, определяющих точки графиков функции
* и задающих параметры отрисовки графиков (цвет, стиль и т. п.)
* showGrid - определяет, рисовать сетку или нет
* zoom - координата центра области для увеличения
* zoomed - определяет, увеличивать область или нет
*/
void TMainForm::functionPaint(TImage *Image, vector<functionOptions> Functions,
point zoom, bool zoomed = false, bool showGrid = true)
{
int i, j, x, y, labelpos;
vector<point> F;
TColor color;
int width, height, gridNumX, gridNumY, gridStepX, gridStepY;
double minY, maxY, minX, maxX, kx, ky;
minX = minx(Functions.front().points);
maxX = maxx(Functions.front().points);
minY = miny(Functions.front().points);
maxY = maxy(Functions.front().points);
if(minY == maxY)
{
minY = minY - 2;
maxY = maxY + 5;
}
width = Image->Width;
height = Image->Height;
gridNumX = 10;
gridNumY = 16;
gridStepX = width / gridNumX;
gridStepY = height / gridNumY;
kx = double((maxX - minX) / (width - 2 * gridStepX));
ky = double((maxY - minY) / (height - 2 * gridStepY));
if(zoomed)
{
minX = (zoom.x - 2 * gridStepX) * kx;
maxX = zoom.x * kx;
minY = (height - zoom.y - 2.5 * gridStepY)* ky;
maxY = (height - zoom.y + 0.5 * gridStepY)* ky;
kx = double((maxX - minX) / (width - 2 * gridStepX));
ky = double((maxY - minY) / (height - 2 * gridStepY));
}
// Фон
Image->Picture->Bitmap->Height = Image->Height;
Image->Picture->Bitmap->Width = Image->Width;
Image->Canvas->Pen->Color = clBlack;
Image->Canvas->Brush->Color = clWhite;
Image->Canvas->Rectangle(0, 0, width, height);
// Сетка
if(showGrid)
{
Image->Canvas->Pen->Color = clInactiveCaption;
Image->Canvas->Pen->Style = psDot;
for(i = 1; i < gridNumX; i++)
{
Image->Canvas->MoveTo(i * gridStepX, 1);
Image->Canvas->LineTo(i * gridStepX, height - 1);
}
for(i = gridNumY - 1; i >= 1 ; i--)
{
Image->Canvas->MoveTo(1, i * gridStepY);
Image->Canvas->LineTo(width - 1, i * gridStepY);
}
}
Image->Canvas->Pen->Color = clBlack;
Image->Canvas->Pen->Style = psSolid;
for(i = 1; i < gridNumX; i++)
{
Image->Canvas->MoveTo(i * gridStepX, height - gridStepY + 3);
Image->Canvas->LineTo(i * gridStepX, height - gridStepY - 4);
}
for(i = gridNumY - 1; i >= 1 ; i--)
{
Image->Canvas->MoveTo(gridStepX - 3, i * gridStepY);
Image->Canvas->LineTo(gridStepX + 4, i * gridStepY);
}
Image->Canvas->MoveTo(gridStepX - 3, 23); Image->Canvas->LineTo(gridStepX, 10);
Image->Canvas->MoveTo(gridStepX + 3, 23); Image->Canvas->LineTo(gridStepX, 10);
Image->Canvas->LineTo(gridStepX, height - 11);
Image->Canvas->MoveTo(10, (gridNumY - 1) * gridStepY);
Image->Canvas->LineTo(width - 11, (gridNumY - 1) * gridStepY);
Image->Canvas->MoveTo(width - 11, (gridNumY - 1) * gridStepY); Image->Canvas->LineTo(width - 24, (gridNumY - 1) * gridStepY - 3);
Image->Canvas->MoveTo(width - 11, (gridNumY - 1) * gridStepY); Image->Canvas->LineTo(width - 24, (gridNumY - 1) * gridStepY + 3);
Image->Canvas->Pen->Width = 1;
// Масштаб
AnsiString xLabel, yLabel;
Image->Canvas->Pen->Color = clBlack;
Image->Canvas->Brush->Style = bsClear;
Image->Canvas->Font->Color = clBlack;
for(i = (minY != minX) ? 1 : 3; i < gridNumX; i+= 2)
{
xLabel = FloatToStrF(minX + double((fabs(minX) + fabs(maxX)) * (i - 1) / (gridNumX - 2)), ffGeneral, 6, 0);
Image->Canvas->TextOutW(i * gridStepX + 1, height - gridStepY, xLabel);
}
for(i = gridNumY - 1; i >= 1; i-= 2)
{
yLabel = FloatToStrF(maxY - double((maxY - minY) * (i - 1) / (gridNumY - 2)), ffGeneral, 6, 0);
Image->Canvas->TextOutW(gridStepX - 6.5 * strlen(yLabel.c_str()), i * gridStepY + 1, yLabel);
}
// Графики функций
for(i = 0; i < Functions.size(); i++)
{
if(Functions[i].enabled)
{
F = Functions[i].points;
color = Functions[i].color;
AnsiString label = Functions[i].label;
labelpos = Functions[i].labelpos;
Image->Canvas->Pen->Color = color;
Image->Canvas->Brush->Color = color;
Image->Canvas->Font->Color = color;
for(j = 0; j < F.size(); j++)
{
x = gridStepX + (F[j].x - minX) / kx;
y = height - gridStepY - (F[j].y - minY) / ky;
if (Functions[i].style == psDot)
Image->Canvas->Ellipse(x - 3, y - 3, x + 3, y + 3);
else
{
if (j == 0)
Image->Canvas->MoveTo(x, y);
else
Image->Canvas->LineTo(x, y);
}
if (label != ' ' && labelpos <= j * 100 / F.size())
{
Image->Canvas->Brush->Style = bsClear;
Image->Canvas->TextOutW(x + 15, y + 5, label);
Image->Canvas->Brush->Color = color;
Image->Canvas->MoveTo(x, y);
label = ' ';
}
}
}
}
// Область для увеличения
if(zoom.x > 0 && zoom.y > 0 && !zoomed)
{
Image->Canvas->Brush->Style = bsClear;
Image->Canvas->Pen->Color = clSkyBlue;
Image->Canvas->Pen->Width = 2;
Image->Canvas->Rectangle(zoom.x - gridStepX, zoom.y - 1.5 * gridStepY, zoom.x + gridStepX, zoom.y + 1.5 * gridStepY);
Image->Canvas->Pen->Width = 1;
Image->Cursor = crCross;
}
else
Image->Cursor = crDefault;
Image->Refresh();
}
//---------------------------------------------------------------------------
void TMainForm::addFunction(vector<functionOptions> &F, vector<point> P, TColor C, bool enabled = true, TPenStyle style = psDash, AnsiString label = ' ', int labelpos = 0)
{
functionOptions O;
O.points = P;
O.color = C;
O.label = label;
O.labelpos = labelpos;
O.enabled = enabled;
O.style = style;
F.push_back(O);
}
//--- Перерисовка графиков функций для заданных точек -----------------------
void TMainForm::paint()
{
vector<functionOptions> F;
if(sRadioButton1->Checked)
{
for (int i = 0; i < 10; i++)
addFunction(F, Fpoints2[i], (Fpoints2[i].front().y != Options.y0) ? sColorSelect1->ColorValue : clGreen, (Options.show_all || Fpoints2[i].front().y == Options.y0));
addFunction(F, Fpoints[0], clBlack, true, psDot);
}
if(sRadioButton2->Checked)
{
for (int i = 10; i < 20; i++)
addFunction(F, Fpoints2[i], (Fpoints2[i].front().y != Options.x0) ? sColorSelect1->ColorValue : clGreen, (Options.show_all || Fpoints2[i].front().y == Options.x0));
addFunction(F, Fpoints[1], clBlack, true, psDot);
}
if(sRadioButton3->Checked)
{
for (int i = 20; i < 30; i++)
addFunction(F, Fpoints2[i], (Fpoints2[i].front().y != Options.x0 && Fpoints2[i].front().x != Options.y0) ? sColorSelect1->ColorValue : clGreen, (Options.show_all || (Fpoints2[i].front().y == Options.x0 && Fpoints2[i].front().x == Options.y0)));
}
if(sRadioButton1->Checked || sRadioButton2->Checked || sRadioButton3->Checked)
functionPaint(Image1, F, zoom, zoomed, Options.show_grid);
}
//--- Открыть окно настроек программы ------------------------------------------------
void __fastcall TMainForm::sBitBtn1Click(TObject *Sender)
{
Application->CreateForm(__classid(TEditForm1), &EditForm1);
EditForm1->ShowModal();
}
//--- Выбор графиков для отображения ----------------------------------------
void __fastcall TMainForm::check(TObject *Sender)
{
paint();
}
//--- Область для увеличения графика ----------------------------------------
void __fastcall TMainForm::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
int Y)
{
if(!zoomed)
{
zoom.x = X;
zoom.y = Y;
sStatusBar1->Panels->Items[0]->Text = " Щёлкните мышью, чтобы увеличить график";
paint();
}
else
sStatusBar1->Panels->Items[0]->Text = " Щёлкните мышью, чтобы уменьшить график";
}
void __fastcall TMainForm::Image1MouseLeave(TObject *Sender)
{
if(!zoomed)
{
zoom.x = zoom.y = 0;
paint();
}
sStatusBar1->Panels->Items[0]->Text = " Курсовая работа \"Автоколебания в химических реакциях\"";
}
void __fastcall TMainForm::Image1Click(TObject *Sender)
{
zoomed = !zoomed;
paint();
}
//--- Смена цвета графиков функций ------------------------------------------
void __fastcall TMainForm::sColorSelectChange1(TObject *Sender)
{
paint();
}
void __fastcall TMainForm::sColorSelect1MouseEnter(TObject *Sender)
{
sStatusBar1->Panels->Items[0]->Text = " Нажмите, чтобы изменить цвет графиков функций";
}
void __fastcall TMainForm::sColorSelect1MouseLeave(TObject *Sender)
{
sStatusBar1->Panels->Items[0]->Text = " Курсовая работа \"Автоколебания в химических реакциях\"";
}
//---------------------------------------------------------------------------
EditUnit.h
//---------------------------------------------------------------------------
#ifndef EditUnitH
#define EditUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "sBitBtn.hpp"
#include "sEdit.hpp"
#include "sLabel.hpp"
#include <Buttons.hpp>
#include "sSkinProvider.hpp"
#include "sComboBoxes.hpp"
#include <ComCtrls.hpp>
#include "sColorSelect.hpp"
#include "sSpeedButton.hpp"
#include "sCheckBox.hpp"
#include "sTrackBar.hpp"
//---------------------------------------------------------------------------
class TEditForm1 : public TForm
{
__published: // IDE-managed Components
TsLabel *sLabel1;
TsLabel *sLabel2;
TsLabel *sLabel3;
TsEdit *sEdit3;
TsEdit *sEdit4;
TsBitBtn *sBitBtn1;
TsBitBtn *sBitBtn2;
TsBitBtn *sBitBtn3;
TsSkinProvider *sSkinProvider1;
TsLabel *sLabel4;
TsEdit *sEdit5;
TsEdit *sEdit6;
TsEdit *sEdit7;
TsLabel *sLabel5;
TsLabel *sLabel6;
TsLabel *sLabel7;
TsLabel *sLabel8;
TsLabel *sLabel9;
TsLabel *sLabel10;
TsLabel *sLabel11;
TsLabel *sLabel12;
TsLabel *sLabel13;
TsLabel *sLabel14;
TsLabel *sLabel15;
TsLabel *sLabel16;
TsLabel *sLabel21;
TsLabel *sLabel17;
TsLabel *sLabel18;
TsLabel *sLabel19;
TsLabel *sLabel20;
TsCheckBox *sCheckBox1;
TsTrackBar *sTrackBar1;
TsTrackBar *sTrackBar2;
TsLabel *sLabel22;
TsLabel *sLabel23;
TsTrackBar *sTrackBar3;
TsTrackBar *sTrackBar4;
TsLabel *sLabel24;
TsLabel *sLabel25;
TsCheckBox *sCheckBox2;
void __fastcall sBitBtn1Click(TObject *Sender);
void __fastcall sBitBtn2Click(TObject *Sender);
void __fastcall sBitBtn3Click(TObject *Sender);
void __fastcall sTrackBar1Change(TObject *Sender);
void __fastcall sTrackBar2Change(TObject *Sender);
void __fastcall sCheckBox1Click(TObject *Sender);
void __fastcall sTrackBar3Change(TObject *Sender);
void __fastcall sTrackBar4Change(TObject *Sender);
void __fastcall sCheckBox2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TEditForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TEditForm1 *EditForm1;
//---------------------------------------------------------------------------
#endif
EditUnit.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include <string>
#include <boost/regex.hpp>
#pragma hdrstop
#include "EditUnit.h"
#include "MainUnit.h"
#include "Common.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "sBitBtn"
#pragma link "sEdit"
#pragma link "sLabel"
#pragma link "sSkinProvider"
#pragma link "sComboBoxes"
#pragma link "sColorSelect"
#pragma link "sSpeedButton"
#pragma link "sCheckBox"
#pragma link "sTrackBar"
#pragma resource "*.dfm"
TEditForm1 *EditForm1;
settings Options_old, Options_new;
//---------------------------------------------------------------------------
__fastcall TEditForm1::TEditForm1(TComponent* Owner)
: TForm(Owner)
{
Options_old = Options;
// Концентрации исходных веществ
sTrackBar1->Position = int(Options.a * 10.);
sTrackBar2->Position = int(Options.b * 10.);
sLabel22->Caption = FloatToStr(Options.a);
sLabel23->Caption = FloatToStr(Options.b);
// Отрезок времени
sEdit3->Text = "[" + FloatToStr(Options.ta) + ";" + FloatToStr(Options.tb) + "]";
// Шаг
sEdit4->Text = Options.h;
// Параметры метода Рунге-Кутты
sEdit5->Text = Options.a1;
sEdit6->Text = Options.a2;
sEdit7->Text = Options.a3;
// Начальные условия
sTrackBar3->Position = int(Options.y0 * 10.);
sTrackBar4->Position = int(Options.x0 * 10.);
sLabel24->Caption = FloatToStr(Options.y0);
sLabel25->Caption = FloatToStr(Options.x0);
// Сетка
sCheckBox1->Checked = Options.show_grid;
// Семейство решений
sCheckBox2->Checked = Options.show_all;
}
//--- Настройки по умолчанию ------------------------------------------------
void __fastcall TEditForm1::sBitBtn1Click(TObject *Sender)
{
// Концентрации исходных веществ
sTrackBar1->Position = int(Options_default.a * 10.);
sTrackBar2->Position = int(Options_default.b * 10.);
sLabel22->Caption = FloatToStr(Options_default.a);
sLabel23->Caption = FloatToStr(Options_default.b);
// Отрезок времени
sEdit3->Text = "[" + FloatToStr(Options_default.ta) + ";" +
FloatToStr(Options_default.tb) + "]";
// Шаг
sEdit4->Text = Options_default.h;
// Параметры метода Рунге-Кутты
sEdit5->Text = Options_default.a1;
sEdit6->Text = Options_default.a2;
sEdit7->Text = Options_default.a3;
// Начальные условия
sTrackBar3->Position = int(Options_default.y0 * 10.);
sTrackBar4->Position = int(Options_default.x0 * 10.);
sLabel24->Caption = FloatToStr(Options_default.y0);
sLabel25->Caption = FloatToStr(Options_default.x0);
// Сетка
sCheckBox1->Checked = Options_default.show_grid;
}
//--- Отмена сделанных изменений --------------------------------------------
void __fastcall TEditForm1::sBitBtn2Click(TObject *Sender)
{
Options = Options_old;
MainForm->recount();
Close();
}
//--- Сохранение настроект --------------------------------------------------
void __fastcall TEditForm1::sBitBtn3Click(TObject *Sender)
{
AnsiString ta, tb, segment, h, a1, a2, a3;
segment = sEdit3->Text.Trim();
h = sEdit4->Text.Trim();
a1 = sEdit5->Text.Trim();
a2 = sEdit6->Text.Trim();
a3 = sEdit7->Text.Trim();
if (segment == "" || h == "" || a1 == "" || a2 == "" || a3 == "")
{
MessageDlg ("Заполнены не все поля настроект!\nПожалуйста, введите
недостающие параметры.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
std::string str(segment.c_str());
boost::smatch results;
boost::regex regexp("\\s*\\[\\s*([\-\\d\.\,]+)\\s*;\\s*([\-
\\d\.\,]+)\\s*\\]\\s*");
if(!regex_match(str, results, regexp))
{
MessageDlg ("Неверный формат записи интервала!\nПожалуйста, проверьте
введённый интервал.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
try
{
Options_new.ta = StrToFloat(results[1].str().c_str());
Options_new.tb = StrToFloat(results[2].str().c_str());
}
catch (...)
{
MessageDlg ("Неверный формат записи интервала!\nПожалуйста, проверьте
введённый интервал.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
if(Options_new.ta >= Options_new.tb)
{
MessageDlg ("Неверный формат записи интервала!\nПожалуйста, проверьте
введённый интервал.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
try
{
Options_new.h = StrToFloat(h);
}
catch (...)
{
MessageDlg ("Шаг должны быть вещественными числом!\nПожалуйста, проверьте
введённое значение шага.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
if(Options_new.h <= 0)
{
MessageDlg ("Некорректное значение шага!\nПожалуйста, проверьте введённое
значение шага.", mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
try
{
Options_new.a1 = StrToFloat(a1);
Options_new.a2 = StrToFloat(a2);
Options_new.a3 = StrToFloat(a3);
}
catch (...)
{
MessageDlg ("Параметры метода должны быть вещественными
числами!\nПожалуйста, проверьте введённые значения параметров.", mtError,
TMsgDlgButtons() << mbOK, 0);
return;
}
if(Options_new.a1 != 0 || Options_new.a2 <= Options_new.a1 || Options_new.a3 <=
Options_new.a2 || Options_new.a3 > 1)
{
MessageDlg ("Параметры метода должны удовлетворять условию 0 = a1 < a2 <
a3 <= 1!\nПожалуйста, проверьте введённые значения параметров.", mtError,
TMsgDlgButtons() << mbOK, 0);
return;
}
Options_new.show_grid = sCheckBox1->Checked;
Options_new.show_all = sCheckBox2->Checked;
Options = Options_new;
MainForm->recount();
Close();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar1Change(TObject *Sender)
{
Options_new.a = Options.a = double(sTrackBar1->Position) / 10.;
sTrackBar2->Max = int((pow(Options.a,2) + 1) * 10.);
sLabel22->Caption = Options.a;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar2Change(TObject *Sender)
{
Options_new.b = Options.b = double(sTrackBar2->Position) / 10.;
sLabel23->Caption = Options.b;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sCheckBox1Click(TObject *Sender)
{
Options.show_grid = sCheckBox1->Checked;
MainForm->paint();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar3Change(TObject *Sender)
{
Options_new.y0 = Options.y0 = double(sTrackBar3->Position) / 10.;
sLabel24->Caption = Options.y0;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sTrackBar4Change(TObject *Sender)
{
Options_new.x0 = Options.x0 = double(sTrackBar4->Position) / 10.;
sLabel25->Caption = Options.x0;
MainForm->recount();
}
//---------------------------------------------------------------------------
void __fastcall TEditForm1::sCheckBox2Click(TObject *Sender)
{
Options.show_all = sCheckBox2->Checked;
MainForm->paint();
}
//---------------------------------------------------------------------------