Graphic Calculator: FIDocalcus
Проект трёх первокурсников (по инженерному практикуму в первом семестре) по созданию графического калькулятора на FLTK C++
Loading...
Searching...
No Matches
Math_calc Namespace Reference

Classes

class  function_crosses
 Класс, хранящий в себе вектор точек - пересечений двух мат. функций More...
 
class  function_extremes
 Класс, хранящий в себе вектор точек - лок. экстремумы мат. функции More...
 
class  function_roots
 Класс, хранящий в себе точки - пересеч. графика мат. функ. с осью Ox. More...
 
struct  Point
 Вещественная точка More...
 
struct  Segment
 Вещественный отрезок More...
 

Functions

vector< Segmentdomain_segments (const function< double(double)> &calc, Math_calc::Point left_bottom, Math_calc::Point right_top, double precision)
 
std::vector< Segmentdomain_segments (const std::function< double(double)> &calc, Math_calc::Point left_bottom, Math_calc::Point right_top, double precision)
 Считает вещественные отрезки, где мат. функция определена
 

Function Documentation

◆ domain_segments() [1/2]

vector< Segment > Math_calc::domain_segments ( const function< double(double)> & calc,
Math_calc::Point left_bottom,
Math_calc::Point right_top,
double precision )

Начало отрезка уже было записано

Текущий отрезок

11 {
12 double max_x = right_top.x;
13 double max_y = right_top.y * 2; // для большей точности
14 double min_x = left_bottom.x;
15 double min_y = left_bottom.y * 2; // для большей точности
16
17 std::vector<Segment> res;
18
19 /// @brief Начало отрезка уже было записано
20 bool is_x_started = false;
21
22 /// @brief Текущий отрезок
23 Segment seg;
24
25 for (double x = min_x; x < max_x; x += precision) {
26 if (!is_x_started) {
27 // если мы еще не записали начало отрезка, проверяем на то, что значение
28 // не нарушает ОДЗ и не больше максимально допустимой высоты
29 try {
30 double y = calc(x);
31 if ((y > min_y) && (y < max_y)) {
32 seg.start = x;
33 is_x_started = true;
34 }
35 } catch (...) {
36 // в случае возникновение какой-либо ошибки, игнорируем эту точку, так
37 // как значение на ней нам точно не подходит
38 }
39 } else {
40 try {
41 double y = calc(x);
42 // в случае, если значение мат. функции превысило допустимое - обрезаем
43 // отрезок предыдущим значением
44 if ((y > max_y) || (y < min_y)) {
45 seg.end = x - precision;
46 is_x_started = false;
47 if (seg.start < seg.end) res.push_back(seg);
48 seg = Segment();
49 }
50 } catch (...) {
51 // в этом случае также обрезаем отрезок предыдущим значением, так как на
52 // текущем мы получили ошибку
53 seg.end = x - precision;
54 is_x_started = false;
55 if (seg.start < seg.end) res.push_back(seg);
56 seg = Segment();
57 }
58 }
59 }
60
61 // если в самом конце не успели закрыть отрезок, делаем это правой границей
62 // (скорее всего, мы её просто перескочили или дошли до max_x - precision)
63 if (is_x_started) {
64 seg.end = max_x;
65 if (seg.start < seg.end) res.push_back(seg);
66 }
67
68 // (этот кусок может пригодится для поиска нужных формул точности)
69 // for (const auto& i : res)
70 // cout << "{" << i.start << ", " << i.end << "}, ";
71 // cout << endl;
72
73 return res;
74}
Вещественный отрезок
Definition math_base.h:22
Here is the caller graph for this function:

◆ domain_segments() [2/2]

std::vector< Segment > Math_calc::domain_segments ( const std::function< double(double)> & calc,
Math_calc::Point left_bottom,
Math_calc::Point right_top,
double precision )

Считает вещественные отрезки, где мат. функция определена

Деление на сегменты происходит на прямоуг. области, края - точки

Parameters
calcлямбда-выражение от мат. функции
left_bottomлевая нижняя точка - начало области деления на сегменты
right_topправая верхняя точка - конец области деления на сегменты
precisionточность
Returns
std::vector<Segment>: вещественные отрезки