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

Окно, с полями для ввода мат. функций, возможностью построения их графиков на сист. коорд. More...

#include <Graphix_window.h>

Inheritance diagram for Graphix_window:
Collaboration diagram for Graphix_window:

Public Member Functions

 Graphix_window ()
 
 Graphix_window (Graph_lib::Point left_corner, pix_amount _width, pix_amount _height, const std::string &title, pix_amount _unit_intr)
 Инициализирует новый экземпляр Graphix_window.
 
void attach (Shape &)
 
void attach (Widget &)
 
void detach (Shape &)
 Удаляет фигуру из соотв. списка
 
void detach (Widget &)
 Отвязывает виджет от окна, деактивируя коллбэки
 
pix_amount h () const
 
void put_on_top (Shape &)
 
void put_on_top (Widget &)
 
void resize (pix_amount _width, pix_amount _height)
 
void set_label (const std::string &s)
 
pix_amount w () const
 
void wait_for_button ()
 Запускает цикл ожидания нажатия кнопки и перерисовывает всё
 
bool window_is_open () const
 

Protected Member Functions

void draw ()
 

Private Member Functions

void change_unit_intr ()
 Устанавливает пользовательский масштаб (длину ед. отрезка по нему)
 
void clear_deriv (size_t func_index, bool need_delete=true)
 Удаляет график производной мат. функции
 
void clear_graphix (size_t func_index, bool need_delete=true)
 Удаляет график мат. функции
 
void clear_points ()
 Удаляет особые точки графиков мат. функций
 
void decr_unit_intr ()
 Уменьшает значение ед. отрезка
 
void draw_deriv (size_t func_index)
 Рисует график производной мат. функции
 
void draw_graphix (size_t func_index)
 Рисует график мат. функции
 
void fill_inputed_funcs ()
 Обновляет все введенные мат. функции
 
void hide_deriv (size_t func_index)
 Скрывает график производной мат. функции (не удаляя его)
 
void hide_graphix (size_t func_index)
 Скрывает график мат. функции (не удаляя его)
 
void hide_points ()
 Скрывает все особые точки графиков мат. функций (удаляя их)
 
void incr_unit_intr ()
 Увеличивает значение ед. отрезка
 
void init () override
 Инициализирует всё то, что не было проиниц. в конструкторах
 
void initial_attach ()
 Привязывает к окну все проиниц. виджеты и фигуры
 
void new_func_box ()
 Добавляет новый бокс для ввода мат. функции
 
void quit ()
 Завершает работу окна
 
void rem_func_box (size_t func_index)
 Удаляет бокс для ввода мат. функции
 
void show_points ()
 Отображает все особые точки графиков мат. функций
 
void update_deriv (size_t func_index)
 Обновляет график производной мат. функции
 
void update_graphix (size_t func_index)
 Обновляет график мат. функции
 
void update_inputed_func (size_t func_index, bool need_update_strings=true)
 Обновляет введенную мат. функцию
 
void update_points ()
 Обновляет особые точки графиков мат. функций
 
void update_unit_intr (double new_unit_intr)
 Обновляет значение единич. отрезка
 

Static Private Member Functions

static void cb_change_unit_intr (void *, void *widget)
 
static void cb_decr_unit_intr (void *, void *widget)
 
static void cb_deriv_draw (void *, void *widget)
 
static void cb_deriv_hide (void *, void *widget)
 
static void cb_graphix_draw (void *, void *widget)
 
static void cb_graphix_hide (void *, void *widget)
 
static void cb_hide_points (void *, void *widget)
 
static void cb_incr_unit_intr (void *, void *widget)
 
static void cb_new_func (void *, void *widget)
 
static void cb_quit (void *, void *widget)
 
static void cb_rem_func (void *, void *widget)
 
static void cb_show_points (void *, void *widget)
 

Private Attributes

std::vector< Graph_lib::Marks * > all_points
 Все особые точки графиков
 
Graph_lib::Line border
 Линия - ограничитель системы координат от меню ввода
 
Graph_lib::Button decr_button
 Кнопка уменьшения масштаба
 
std::vector< Graphix_calc::Segmented_graphix * > derivs
 Нарисованные пользователем графики производных мат. функций
 
std::vector< Graphix_calc::Function_box * > enter_menu
 Поля для ввода мат. функций и кнопки по управлению их графиков
 
std::vector< Graphix_calc::Segmented_graphix * > graphics
 Нарисованные пользователем графики мат. функций
 
pix_amount height
 
Graph_lib::Button incr_button
 Кнопка увеличения масштаба
 
std::vector< Math_func::functioninputed_funcs
 Введенные пользователем валидные мат. функции
 
std::vector< std::string > inputed_strings
 Введенные пользователем строки
 
bool is_points_visible {false}
 
Graph_lib::Button new_func_button
 Создания нового поля для ввода мат. функции
 
Graph_lib::Point origin
 Начало координат
 
Graphix_calc::Point_box point_box
 Две кнопки, связанные с отображением особых точек графиков
 
Graph_lib::Button quit_button
 Кнопка выхода из программы
 
bool quit_button_pushed {false}
 
Graphix_calc::Bothput_box scale_box
 Поле для ввода пользовательского масштаба и вывода текущего
 
Graph_lib::Button scale_button
 Кнопка, изменяющая масштаб по введенному пользователем
 
std::vector< Shape * > shapes
 
bool some_button_pushed {false}
 
double unit_intr
 Длина единичного отрезка
 
pix_amount width
 
Graphix_calc::Axisx_axis
 Горизонтальная ось
 
Graphix_calc::Axisy_axis
 Вертикальная ось
 

Detailed Description

Окно, с полями для ввода мат. функций, возможностью построения их графиков на сист. коорд.

Constructor & Destructor Documentation

◆ Graphix_window() [1/2]

Graphix_window::Graphix_window ( )
22 : Graph_lib::Window({10, 10}, 1000, 750, "FIDocalcus"),
23 unit_intr{50.0},
24 // точка начала системы координат смещена вправо, чтобы графики и оси не
25 // заезжали на меню
26 origin{(w() + func_box_w) / 2, h() / 2},
28 // кнопки изменения масштаба находятся справа и являются квадратами
38 in_box_w - btn_w, in_box_h, "1:"},
43 cb_quit}
44
45{
46 init();
47}
Definition Window.h:16
pix_amount w() const
Definition Window.h:26
pix_amount h() const
Definition Window.h:28
Graph_lib::Button incr_button
Кнопка увеличения масштаба
Definition Graphix_window.h:85
Graph_lib::Button decr_button
Кнопка уменьшения масштаба
Definition Graphix_window.h:87
void init() override
Инициализирует всё то, что не было проиниц. в конструкторах
Definition Graphix_window_init.cpp:79
static void cb_hide_points(void *, void *widget)
Definition Graphix_window_callbacks.cpp:88
Graph_lib::Button quit_button
Кнопка выхода из программы
Definition Graphix_window.h:103
Graph_lib::Point origin
Начало координат
Definition Graphix_window.h:57
Graph_lib::Button new_func_button
Создания нового поля для ввода мат. функции
Definition Graphix_window.h:97
Graphix_calc::Point_box point_box
Две кнопки, связанные с отображением особых точек графиков
Definition Graphix_window.h:94
static void cb_quit(void *, void *widget)
Definition Graphix_window_callbacks.cpp:103
static void cb_new_func(void *, void *widget)
Definition Graphix_window_callbacks.cpp:93
Graph_lib::Button scale_button
Кнопка, изменяющая масштаб по введенному пользователем
Definition Graphix_window.h:89
Graph_lib::Line border
Линия - ограничитель системы координат от меню ввода
Definition Graphix_window.h:80
double unit_intr
Длина единичного отрезка
Definition Graphix_window.h:54
Graphix_calc::Bothput_box scale_box
Поле для ввода пользовательского масштаба и вывода текущего
Definition Graphix_window.h:91
static void cb_incr_unit_intr(void *, void *widget)
Definition Graphix_window_callbacks.cpp:48
static void cb_decr_unit_intr(void *, void *widget)
Definition Graphix_window_callbacks.cpp:53
static void cb_change_unit_intr(void *, void *widget)
Definition Graphix_window_callbacks.cpp:58
static void cb_show_points(void *, void *widget)
Definition Graphix_window_callbacks.cpp:83
constexpr pix_amount border_dist
Расстояние, на котором находится линия-ограничитель
Definition constants.h:69
constexpr pix_amount scl_btn_side
сторона квадратной кнопки (кнопки изменения масштаба)
Definition constants.h:48
constexpr pix_amount func_box_w
Длина всего бокса, где пользователь может рисовать графики
Definition constants.h:64
constexpr pix_amount in_box_label_w
Кол-во пикселей, захваченных лейблом для in_box (т.е. "y = ")
Definition constants.h:51
constexpr pix_amount in_box_h
Высота поля для ввода
Definition constants.h:56
constexpr pix_amount btn_w
Стандартная ширина кнопки
Definition constants.h:43
constexpr pix_amount in_box_w
Длина поля для ввода (исключая его лейбл "y = ")
Definition constants.h:54
constexpr pix_amount btn_h
Стандартная высота кнопки
Definition constants.h:45
Definition Point.h:7

◆ Graphix_window() [2/2]

Graphix_window::Graphix_window ( Graph_lib::Point left_corner,
pix_amount _width,
pix_amount _height,
const std::string & title,
pix_amount _unit_intr )

Инициализирует новый экземпляр Graphix_window.

Parameters
left_cornerточка - левый верхний угол
_widthширина
_heightвысота
titleзаголовок
_unit_intrдлина ед. отрезка
52 : Graph_lib::Window(left_corner, _width, _height, title),
53 unit_intr{double(_unit_intr)},
54 // точка начала системы координат смещена вправо, чтобы графики и оси не
55 // заезжали на меню
56 origin{(w() + func_box_w) / 2, h() / 2},
58 // кнопки изменения масштаба находятся справа и являются квадратами
68 in_box_w - btn_w, in_box_h, "1:"},
73 cb_quit}
74
75{
76 init();
77}
Here is the call graph for this function:

Member Function Documentation

◆ attach() [1/2]

void Graph_lib::Window::attach ( Shape & shape)
inherited
41{ shapes.push_back(&shape); }
std::vector< Shape * > shapes
Definition Window.h:54
Here is the caller graph for this function:

◆ attach() [2/2]

void Graph_lib::Window::attach ( Widget & widget)
inherited
31 {
32 Fl_Group::begin(); // FTLK: начинаем прикреплять к этому окну новые
33 // Fl_Widgets
34 widget.attach(*this); // позволяем виджету создать свои Fl_Widgets
35 Fl_Group::end(); // FTLK: прекращаем прикреплять новые
36 // Fl_Widgets к этому окну
37}

◆ cb_change_unit_intr()

void Graphix_window::cb_change_unit_intr ( void * ,
void * widget )
staticprivate
58 {
59 auto& btn = Graph_lib::reference_to<Button>(widget);
60 dynamic_cast<Graphix_window&>(btn.window()).change_unit_intr();
61}
Окно, с полями для ввода мат. функций, возможностью построения их графиков на сист....
Definition Graphix_window.h:25
void change_unit_intr()
Устанавливает пользовательский масштаб (длину ед. отрезка по нему)
Definition Graphix_window_callbacks.cpp:126
W & reference_to(void *ptr_wid)
Definition Widgets.h:16
Here is the call graph for this function:

◆ cb_decr_unit_intr()

void Graphix_window::cb_decr_unit_intr ( void * ,
void * widget )
staticprivate
53 {
54 auto& btn = Graph_lib::reference_to<Button>(widget);
55 dynamic_cast<Graphix_window&>(btn.window()).decr_unit_intr();
56}
void decr_unit_intr()
Уменьшает значение ед. отрезка
Definition Graphix_window_callbacks.cpp:118
Here is the call graph for this function:

◆ cb_deriv_draw()

void Graphix_window::cb_deriv_draw ( void * ,
void * widget )
staticprivate
73 {
75 dynamic_cast<Graphix_window&>(btn.window()).draw_deriv(btn.get_number());
76}
void draw_deriv(size_t func_index)
Рисует график производной мат. функции
Definition Graphix_window_callbacks.cpp:159
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_deriv_hide()

void Graphix_window::cb_deriv_hide ( void * ,
void * widget )
staticprivate
78 {
80 dynamic_cast<Graphix_window&>(btn.window()).hide_deriv(btn.get_number());
81}
void hide_deriv(size_t func_index)
Скрывает график производной мат. функции (не удаляя его)
Definition Graphix_window_callbacks.cpp:174
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_graphix_draw()

void Graphix_window::cb_graphix_draw ( void * ,
void * widget )
staticprivate
63 {
65 dynamic_cast<Graphix_window&>(btn.window()).draw_graphix(btn.get_number());
66}
void draw_graphix(size_t func_index)
Рисует график мат. функции
Definition Graphix_window_callbacks.cpp:140
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_graphix_hide()

void Graphix_window::cb_graphix_hide ( void * ,
void * widget )
staticprivate
68 {
70 dynamic_cast<Graphix_window&>(btn.window()).hide_graphix(btn.get_number());
71}
void hide_graphix(size_t func_index)
Скрывает график мат. функции (не удаляя его)
Definition Graphix_window_callbacks.cpp:149
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_hide_points()

void Graphix_window::cb_hide_points ( void * ,
void * widget )
staticprivate
88 {
89 auto& btn = Graph_lib::reference_to<Button>(widget);
90 dynamic_cast<Graphix_window&>(btn.window()).hide_points();
91}
void hide_points()
Скрывает все особые точки графиков мат. функций (удаляя их)
Definition Graphix_window_callbacks.cpp:196
Here is the call graph for this function:

◆ cb_incr_unit_intr()

void Graphix_window::cb_incr_unit_intr ( void * ,
void * widget )
staticprivate
48 {
49 auto& btn = Graph_lib::reference_to<Button>(widget);
50 dynamic_cast<Graphix_window&>(btn.window()).incr_unit_intr();
51}
void incr_unit_intr()
Увеличивает значение ед. отрезка
Definition Graphix_window_callbacks.cpp:110
Here is the call graph for this function:

◆ cb_new_func()

void Graphix_window::cb_new_func ( void * ,
void * widget )
staticprivate
93 {
94 auto& btn = Graph_lib::reference_to<Button>(widget);
95 dynamic_cast<Graphix_window&>(btn.window()).new_func_box();
96}
void new_func_box()
Добавляет новый бокс для ввода мат. функции
Definition Graphix_window_callbacks.cpp:205
Here is the call graph for this function:

◆ cb_quit()

void Graphix_window::cb_quit ( void * ,
void * widget )
staticprivate
103 {
104 auto& btn = Graph_lib::reference_to<Button>(widget);
105 dynamic_cast<Graphix_window&>(btn.window()).quit();
106}
void quit()
Завершает работу окна
Definition Graphix_window.h:195
Here is the call graph for this function:

◆ cb_rem_func()

void Graphix_window::cb_rem_func ( void * ,
void * widget )
staticprivate
98 {
100 dynamic_cast<Graphix_window&>(btn.window()).rem_func_box(btn.get_number());
101}
void rem_func_box(size_t func_index)
Удаляет бокс для ввода мат. функции
Definition Graphix_window_callbacks.cpp:236
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_show_points()

void Graphix_window::cb_show_points ( void * ,
void * widget )
staticprivate
83 {
84 auto& btn = Graph_lib::reference_to<Button>(widget);
85 dynamic_cast<Graphix_window&>(btn.window()).show_points();
86}
void show_points()
Отображает все особые точки графиков мат. функций
Definition Graphix_window_callbacks.cpp:187
Here is the call graph for this function:

◆ change_unit_intr()

void Graphix_window::change_unit_intr ( )
private

Устанавливает пользовательский масштаб (длину ед. отрезка по нему)

126 {
127 try {
128 // домножаем пользовательский масштаб на длину маркированного отрезка
129 double new_unit_intr = stod(scale_box.get_string()) * mark_intr;
130 update_unit_intr(new_unit_intr);
131 } catch (...) // ошибка может вылететь от std::stod
132 {
133 // TODO: добавить уведомление, что были превышены макс./мин. масштаба
134 scale_box.put_string("invalid input");
135 }
136
137 some_button_pushed = true;
138}
void put_string(const std::string &)
Definition Bothput_box.cpp:28
std::string get_string() const
Definition Bothput_box.cpp:23
bool some_button_pushed
Definition Graphix_window.h:109
void update_unit_intr(double new_unit_intr)
Обновляет значение единич. отрезка
Definition Graphix_window_updaters.cpp:22
constexpr pix_amount mark_intr
Размер маркируемого отрезка, на котором ставится насечка
Definition constants.h:72
Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_deriv()

void Graphix_window::clear_deriv ( size_t func_index,
bool need_delete = true )
private

Удаляет график производной мат. функции

Parameters
func_indexиндекс мат. функции
need_deleteфакт необходимости отчистки памяти

График производной мат. функции, поделенный на отрезки

204 {
205 /// @brief График производной мат. функции, поделенный на отрезки
206 Segmented_graphix*& seged_deriv = derivs[func_index];
207
208 // отвязываем от окна
209 detach(*seged_deriv);
210
211 // и чистим память (если необходимо)
212 if (need_delete) delete seged_deriv;
213}
void detach(Shape &)
Удаляет фигуру из соотв. списка
Definition Window.cpp:43
Фигура, представляющая собой график мат. функции, поделенный на
Definition Segmented_graphix.h:20
std::vector< Graphix_calc::Segmented_graphix * > derivs
Нарисованные пользователем графики производных мат. функций
Definition Graphix_window.h:74
Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_graphix()

void Graphix_window::clear_graphix ( size_t func_index,
bool need_delete = true )
private

Удаляет график мат. функции

Parameters
func_indexиндекс мат. функции
need_deleteфакт необходимости отчистки памяти

График мат. функции, поделенный на отрезки

166 {
167 /// @brief График мат. функции, поделенный на отрезки
168 Graphix_calc::Segmented_graphix*& seged_graphix = graphics[func_index];
169
170 // отвязываем от окна
171 detach(*seged_graphix);
172
173 // и чистим память (если необходимо)
174 if (need_delete) delete seged_graphix;
175}
std::vector< Graphix_calc::Segmented_graphix * > graphics
Нарисованные пользователем графики мат. функций
Definition Graphix_window.h:72
Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_points()

void Graphix_window::clear_points ( )
private

Удаляет особые точки графиков мат. функций

305 {
306 // проходимся по всем особым точкам, отображаемым в виде марков
307 // (что удобно, если вектор всех точек пустой - лишнего удаления не случится)
308 // (мы просто не зайдём в данный цикл)
309 for (const auto& points : all_points) {
310 // отвязываем от окна и чистим память
311 detach(*points);
312 delete points;
313 }
314
315 // изменяем размеры самого вектора
316 all_points.clear();
317}
std::vector< Graph_lib::Marks * > all_points
Все особые точки графиков
Definition Graphix_window.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ decr_unit_intr()

void Graphix_window::decr_unit_intr ( )
private

Уменьшает значение ед. отрезка

118 {
120 // (только при делении будет верное значение)
122
123 some_button_pushed = true;
124}
constexpr double unit_intr_coef
Коэф. увеличения/уменьшения ед. отрезка при изменении масштаба
Definition constants.h:37
constexpr unsigned int scale_format_prec
Количество знаков после точки для строки масштаба
Definition constants.h:84
string format(double num, unsigned int after_comma_digits_amount)
Definition utilities.cpp:9
Here is the call graph for this function:
Here is the caller graph for this function:

◆ detach() [1/2]

void Graph_lib::Window::detach ( Shape & shape)
inherited

Удаляет фигуру из соотв. списка

43 {
44 // последнее прикрепленное будет выпущено первым
45 for (unsigned int i = shapes.size(); 0 < i; --i)
46 if (shapes[i - 1] == &shape) shapes.erase(shapes.begin() + (i - 1));
47}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ detach() [2/2]

void Graph_lib::Window::detach ( Widget & widget)
inherited

Отвязывает виджет от окна, деактивируя коллбэки

39{ widget.hide(); }

◆ draw()

void Graph_lib::Window::draw ( )
protectedinherited
26 {
27 Fl_Window::draw();
28 for (unsigned int i = 0; i < shapes.size(); ++i) shapes[i]->draw();
29}
void draw()
Definition Window.cpp:26
Here is the call graph for this function:
Here is the caller graph for this function:

◆ draw_deriv()

void Graphix_window::draw_deriv ( size_t func_index)
private

Рисует график производной мат. функции

Parameters
func_indexиндекс мат. функции
159 {
160 update_deriv(func_index);
161
162 // обновляем флаг
163 enter_menu[func_index]->deriv_show();
164
165 // устанавливаем в соотв. поле строку мат. функции,
166 // от которой рисуем график производной
167 if (enter_menu[func_index]->is_input_valid())
168 enter_menu[func_index]->set_deriv_message(
169 "(" + inputed_funcs[func_index].get_func_str() + ")'");
170
171 some_button_pushed = true;
172}
std::vector< Math_func::function > inputed_funcs
Введенные пользователем валидные мат. функции
Definition Graphix_window.h:62
void update_deriv(size_t func_index)
Обновляет график производной мат. функции
Definition Graphix_window_updaters.cpp:177
std::vector< Graphix_calc::Function_box * > enter_menu
Поля для ввода мат. функций и кнопки по управлению их графиков
Definition Graphix_window.h:100
Here is the call graph for this function:
Here is the caller graph for this function:

◆ draw_graphix()

void Graphix_window::draw_graphix ( size_t func_index)
private

Рисует график мат. функции

Parameters
func_indexиндекс мат. функции
140 {
141 update_graphix(func_index);
142
143 // обновляем флаг
144 enter_menu[func_index]->graphix_show();
145
146 some_button_pushed = true;
147}
void update_graphix(size_t func_index)
Обновляет график мат. функции
Definition Graphix_window_updaters.cpp:129
Here is the call graph for this function:
Here is the caller graph for this function:

◆ fill_inputed_funcs()

void Graphix_window::fill_inputed_funcs ( )
private

Обновляет все введенные мат. функции

124 {
125 // (так как соотв. функция принимает индекс, проходимся таким образом)
126 for (size_t i = 0; i < enter_menu.size(); i++) update_inputed_func(i);
127}
void update_inputed_func(size_t func_index, bool need_update_strings=true)
Обновляет введенную мат. функцию
Definition Graphix_window_updaters.cpp:64
Here is the call graph for this function:
Here is the caller graph for this function:

◆ h()

pix_amount Graph_lib::Window::h ( ) const
inlineinherited
28{ return height; }
pix_amount height
Definition Window.h:56
Here is the caller graph for this function:

◆ hide_deriv()

void Graphix_window::hide_deriv ( size_t func_index)
private

Скрывает график производной мат. функции (не удаляя его)

Parameters
func_indexиндекс мат. функции
174 {
175 // (мы просто прячем, нам не надо удалять его насовсем)
176 clear_deriv(func_index, false);
177
178 // обновляем флаг
179 enter_menu[func_index]->deriv_hide();
180
181 // устанавливаем в соотв. поле пустую строку
182 enter_menu[func_index]->set_deriv_message(empty_str);
183
184 some_button_pushed = true;
185}
void clear_deriv(size_t func_index, bool need_delete=true)
Удаляет график производной мат. функции
Definition Graphix_window_updaters.cpp:204
const std::string empty_str
Definition constants.h:15
Here is the call graph for this function:
Here is the caller graph for this function:

◆ hide_graphix()

void Graphix_window::hide_graphix ( size_t func_index)
private

Скрывает график мат. функции (не удаляя его)

Parameters
func_indexиндекс мат. функции
149 {
150 // (мы просто прячем, нам не надо удалять его насовсем)
151 clear_graphix(func_index, false);
152
153 // обновляем флаг
154 enter_menu[func_index]->graphix_hide();
155
156 some_button_pushed = true;
157}
void clear_graphix(size_t func_index, bool need_delete=true)
Удаляет график мат. функции
Definition Graphix_window_updaters.cpp:166
Here is the call graph for this function:
Here is the caller graph for this function:

◆ hide_points()

void Graphix_window::hide_points ( )
private

Скрывает все особые точки графиков мат. функций (удаляя их)

196 {
197 clear_points();
198
199 // обновляем флаг
200 is_points_visible = false;
201
202 some_button_pushed = true;
203}
void clear_points()
Удаляет особые точки графиков мат. функций
Definition Graphix_window_updaters.cpp:305
bool is_points_visible
Definition Graphix_window.h:107
Here is the call graph for this function:
Here is the caller graph for this function:

◆ incr_unit_intr()

void Graphix_window::incr_unit_intr ( )
private

Увеличивает значение ед. отрезка

110 {
112 // (только при делении будет верное значение)
114
115 some_button_pushed = true;
116}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init()

void Graphix_window::init ( )
overrideprivatevirtual

Инициализирует всё то, что не было проиниц. в конструкторах

Reimplemented from Graph_lib::Window.

79 {
80 // установка интервала изменения размеров окна
81 // (а именно нулевого)
82 size_range(w(), h(), w(), h());
83
84 // задаём цвет окну
85 // this->color(Color::white);
86
87 // задаем цвет ограничивающей линии
88 border.set_color(Color::black);
89
90 // инициализируем первые элементы соотв. векторов
91 // (так как с самого начала у нас есть 1 бокс для ввода)
92
93 inputed_strings.push_back(empty_str);
94 inputed_funcs.push_back(empty_func);
95
96 Function_box* func_box =
99 enter_menu.push_back(func_box);
100
101 graphics.push_back(new Segmented_graphix());
102 derivs.push_back(new Segmented_graphix());
103
104 // создаём оси с заданным в конструкторе значением ед. отрезка
105
106 x_axis = new Axis{Axis::Orientation::horizontal,
107 origin,
108 w() - func_box_w,
109 unit_intr,
110 mark_intr,
111 "X"};
112 y_axis = new Axis{
113 Axis::Orientation::vertical, origin, h(), unit_intr, mark_intr, "Y"};
114
115 // задаём цвет этим осям
116 x_axis->set_color(Color::Color_type::dark_cyan);
117 y_axis->set_color(Color::Color_type::dark_cyan);
118
119 // привязываем всё созданное к окну
121}
void set_color(Color _color)
Definition Shapes.h:189
Фигура, представляющая собой мат. ось координат
Definition Axis.h:12
void set_color(Graph_lib::Color c)
Definition Axis.cpp:60
Класс с вводом мат. функции, кнопками для графиков, вывод ошибок
Definition Function_box.h:16
static void cb_deriv_hide(void *, void *widget)
Definition Graphix_window_callbacks.cpp:78
static void cb_deriv_draw(void *, void *widget)
Definition Graphix_window_callbacks.cpp:73
static void cb_rem_func(void *, void *widget)
Definition Graphix_window_callbacks.cpp:98
std::vector< std::string > inputed_strings
Введенные пользователем строки
Definition Graphix_window.h:60
static void cb_graphix_draw(void *, void *widget)
Definition Graphix_window_callbacks.cpp:63
static void cb_graphix_hide(void *, void *widget)
Definition Graphix_window_callbacks.cpp:68
Graphix_calc::Axis * y_axis
Вертикальная ось
Definition Graphix_window.h:69
void initial_attach()
Привязывает к окну все проиниц. виджеты и фигуры
Definition Graphix_window_init.cpp:123
Graphix_calc::Axis * x_axis
Горизонтальная ось
Definition Graphix_window.h:67
const Math_func::function empty_func
Пустая (нулевая) мат. функция
Definition constants.h:26
Here is the call graph for this function:
Here is the caller graph for this function:

◆ initial_attach()

void Graphix_window::initial_attach ( )
private

Привязывает к окну все проиниц. виджеты и фигуры

123 {
124 attach(border);
125 attach(*x_axis);
126 attach(*y_axis);
133
134 attach(*enter_menu[0]);
136}
void attach(Shape &)
Definition Window.cpp:41
Here is the call graph for this function:
Here is the caller graph for this function:

◆ new_func_box()

void Graphix_window::new_func_box ( )
private

Добавляет новый бокс для ввода мат. функции

205 {
206 // если до увеличения вектор боксов был пуст, то мы обратно
207 // двигаем кнопку создания нового поля для ввода мат. функции
209
210 // создаем новый бокс (с индексом последний + 1 (= размер))
211 Function_box* func_box =
214
215 // привязываем его к окну
216 attach(*func_box);
217
218 // добавляем новый бокс в соотв. вектор
219 enter_menu.push_back(func_box);
220
221 // инициализируем (по умолчанию) следующий элемент в соотв. векторах
222
223 graphics.push_back(new Segmented_graphix());
224 derivs.push_back(new Segmented_graphix());
225
226 inputed_strings.push_back(empty_str);
227 inputed_funcs.push_back(empty_func);
228
229 // если количество боксов стало максимально,
230 // скрываем кнопку создания нового поля для ввода мат. функции
232
233 some_button_pushed = true;
234}
virtual void move(int dx, int dy)
Definition Widgets.cpp:9
constexpr unsigned long long int max_functions_amount
Максимальное количество вводимых мат. функций пользователем
Definition constants.h:34
Here is the call graph for this function:
Here is the caller graph for this function:

◆ put_on_top() [1/2]

void Graph_lib::Window::put_on_top ( Shape & shape)
inherited
49 {
50 detach(shape);
51 attach(shape);
52}
Here is the call graph for this function:

◆ put_on_top() [2/2]

void Graph_lib::Window::put_on_top ( Widget & widget)
inherited
54 {
55 detach(widget);
56 attach(widget);
57}
Here is the call graph for this function:

◆ quit()

void Graphix_window::quit ( )
inlineprivate

Завершает работу окна

196 {
197 Fl_Window::hide();
198
199 quit_button_pushed = true;
200 }
bool quit_button_pushed
Definition Graphix_window.h:110
Here is the caller graph for this function:

◆ rem_func_box()

void Graphix_window::rem_func_box ( size_t func_index)
private

Удаляет бокс для ввода мат. функции

Parameters
func_indexиндекс мат. функции
236 {
237 // отвязываем соотв. бокс от окна
238 enter_menu[func_index]->detach(*this);
239
240 // проходимся по всем боксам начиная со следующего
241 for (size_t j = func_index + 1; j < enter_menu.size(); ++j) {
242 // двигаем их вверх и меняем номер на перед стоящий
243 enter_menu[j]->move(0, -func_box_h);
244 enter_menu[j]->set_index(enter_menu[j]->get_index() - 1);
245 }
246
247 // не забываем чистить память
248 delete enter_menu[func_index];
249
250 // также изменяем размеры соотв. векторов
251
252 enter_menu.erase(enter_menu.begin() + func_index);
253
254 inputed_strings.erase(inputed_strings.begin() + func_index);
255 inputed_funcs.erase(inputed_funcs.begin() + func_index);
256
257 // отвязываем график, график производной (там же чистим память)
258 clear_graphix(func_index);
259 clear_deriv(func_index);
260
261 // изменяем размеры соотв. векторов
262
263 graphics.erase(graphics.begin() + func_index);
264 derivs.erase(derivs.begin() + func_index);
265
266 // возвращаем кнопку создания нового поля для ввода мат. функции,
267 // если количество боксов перестало быть максимальным
269
270 // если не осталось боксов, двигаем кнопку
271 // создания нового поля для ввода мат. функции
272 if (enter_menu.empty()) new_func_button.move(-border_dist, 0);
273
274 some_button_pushed = true;
275}
constexpr pix_amount func_box_h
Высота всего бокса, где пользователь может рисовать графики
Definition constants.h:66
Here is the call graph for this function:
Here is the caller graph for this function:

◆ resize()

void Graph_lib::Window::resize ( pix_amount _width,
pix_amount _height )
inlineinherited
30 {
31 width = _width;
33 size(_width, _height);
34 }
pix_amount width
Definition Window.h:55
Here is the call graph for this function:

◆ set_label()

void Graph_lib::Window::set_label ( const std::string & s)
inlineinherited
36{ label(s.c_str()); }

◆ show_points()

void Graphix_window::show_points ( )
private

Отображает все особые точки графиков мат. функций

187 {
189
190 // обновляем флаг
191 is_points_visible = true;
192
193 some_button_pushed = true;
194}
void update_points()
Обновляет особые точки графиков мат. функций
Definition Graphix_window_updaters.cpp:215
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_deriv()

void Graphix_window::update_deriv ( size_t func_index)
private

Обновляет график производной мат. функции

Parameters
func_indexиндекс мат. функции

Введенная мат. функция

График производной мат. функции, поделенный на отрезки

177 {
178 // записываем в вектор введенных мат. функций, что ввёл пользователь
179 // (заодно проверяем)
180 update_inputed_func(func_index);
181
182 // если проверка прошла успешна, рисуем график производной по
183 // введённой валидной мат. функции
184 if (enter_menu[func_index]->is_input_valid()) {
185 /// @brief Введенная мат. функция
186 const Math_func::function& func = inputed_funcs[func_index];
187
188 /// @brief График производной мат. функции, поделенный на отрезки
189 Segmented_graphix* seged_deriv = new Segmented_graphix(
190 func.differentiate, unit_intr, origin, {border_dist, h()}, {w(), 0});
191
192 // чистим то, что лежало там до этого
193 clear_deriv(func_index);
194
195 // задаем цвет и привязываем к окну
196 seged_deriv->set_color(Color::dark_red);
197 attach(*seged_deriv);
198
199 // передаем во владение соотв. вектора
200 derivs[func_index] = seged_deriv;
201 }
202}
Математическая функция
Definition function.h:14
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_graphix()

void Graphix_window::update_graphix ( size_t func_index)
private

Обновляет график мат. функции

Parameters
func_indexиндекс мат. функции

Введенная мат. функция

График мат. функции, поделенный на отрезки

129 {
130 // записываем в вектор введенных мат. функций, что ввёл пользователь
131 // (заодно проверяем)
132 update_inputed_func(func_index);
133
134 // если проверка успешна, рисуем график по введённой валидной мат. функции
135 if (enter_menu[func_index]->is_input_valid()) {
136 /// @brief Введенная мат. функция
137 const Math_func::function& func = inputed_funcs[func_index];
138
139 /// @brief График мат. функции, поделенный на отрезки
140 Segmented_graphix* seged_graphix;
141
142 // если есть переменная, используем конструктор сегментированного график
143 if (func.has_var())
144 seged_graphix = new Segmented_graphix(func.calculate, unit_intr, origin,
145 {border_dist, h()}, {w(), 0});
146 // иначе мы просто рисуем простой график
147 else
148 seged_graphix = new Segmented_graphix{new Graphix{
149 func.calculate,
151 converted_to_real({w(), 0}, origin, unit_intr).x, origin, 2,
152 unit_intr}};
153
154 // чистим то, что лежало там до этого
155 clear_graphix(func_index);
156
157 // задаем цвет и привязываем к окну
158 seged_graphix->set_color(Color::black);
159 attach(*seged_graphix);
160
161 // передаем во владение соотв. вектора
162 graphics[func_index] = seged_graphix;
163 }
164}
Фигура, представляющая собой график мат. функции
Definition Graphix.h:13
void set_color(Graph_lib::Color c)
Definition Segmented_graphix.cpp:45
Math_calc::Point converted_to_real(Graph_lib::Point p, Graph_lib::Point origin, double unit_intr)
Definition utilities.cpp:33
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_inputed_func()

void Graphix_window::update_inputed_func ( size_t func_index,
bool need_update_strings = true )
private

Обновляет введенную мат. функцию

Parameters
func_indexиндекс мат. функции
need_update_stringsфакт необходимости обновления введ. строк

Введенная строка - возможная строка мат. функции

Вектор всех номеров мат. функций, которые зависят от возможной

65 {
66 // если требуется, обновляем все строки
67 // (не требоваться может при рекурсивном вызове)
68 if (need_update_strings) {
69 for (size_t i = 0; i < enter_menu.size(); i++)
70 inputed_strings[i] = enter_menu[i]->get_string();
71 }
72
73 /// @brief Введенная строка - возможная строка мат. функции
74 // (важно именно копировать её из соотв. вектора)
75 string estimated_func_str = inputed_strings[func_index];
76
77 /// @brief Вектор всех номеров мат. функций, которые зависят от возможной
78 vector<size_t> dependencies;
79
80 try {
81 // раскрываем все зависимости вида y_n
82 // (это модифицирующий входные данный в конструкторе класс)
83 // (поэтому было важно копировать)
84 // (так как в векторе введенных пользователем строк хочется)
85 // (оставлять изначальные значения)
86 Math_func::expose_func_str exposed{inputed_strings, estimated_func_str};
87
88 // записываем зависимости
89 // (к сожалению, лучше чем геттер - мы ничего не придумали)
90 dependencies = exposed.get_dependencies();
91
92 // обновляем все зависимые от возможной мат. функции
93 for (const auto& n : dependencies) update_inputed_func(n - 1, false);
94
95 // создаём мат. функцию по строке
96 Math_func::function func{estimated_func_str};
97
98 // если ранее не было выброшено исключений, то возможная мат. функция
99 // валидна записываем её в соотв. вектор
100 inputed_funcs[func_index] = func;
101
102 // меняем состояние флага и устанавливаем пустую строку в поле вывода
103 enter_menu[func_index]->input_valid();
104 enter_menu[func_index]->set_message(empty_str);
105 }
106
107 catch (const std::exception& e) {
108 // (пользователь мог указать номер еще не созданной мат. функции)
109 if (func_index < enter_menu.size()) {
110 // скрываем всё нарисованное в этом боксе до этого
111 clear_graphix(func_index, false);
112 clear_deriv(func_index, false);
113
114 // меняем состояние флага и устанавливаем соотв. сообщение в поле вывода
115 enter_menu[func_index]->input_invalid();
116 enter_menu[func_index]->set_message(string{e.what()});
117
118 // устанавливаем пустую строку в поле текущей производной мат. функции
119 enter_menu[func_index]->set_deriv_message(empty_str);
120 }
121 }
122}
Класс, который при иниц. мод. строку, обозначающую мат. функцию, хранит все номера мат....
Definition expose_func_str.h:13
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_points()

void Graphix_window::update_points ( )
private

Обновляет особые точки графиков мат. функций

Введенная мат. функция

Особые точки

Особые точки в виде символов

Другая введенная мат. функция

215 {
216 // чистим память и окно от всех предыдущих точек
217 clear_points();
218
219 // так как у нас есть пересечения, нам надо заполнить каждую мат. функцию
221
222 // переводим границы экрана в вещественные, чтобы использовать для
223 // бэкендовских функций
224 Math_calc::Point left_bottom =
227
228 // FIXME: естественно, она не должна быть константой
229 double point_prec = 0.0001;
230
231 // проходимся по вектору, куда мат. функций и рисуем их экстремумы, корни
232 // (проходиться нужно именно таким образом, ибо у нас вложенный перебор)
233 for (size_t i = 0; i < enter_menu.size(); i++) {
234 /// @brief Введенная мат. функция
235 const Math_func::function& func = inputed_funcs[i];
236
237 /// @brief Особые точки
238 // (каждый раз перезаписывается)
239 vector<Math_calc::Point> points;
240
241 /// @brief Особые точки в виде символов
242 Marks* marks = new Marks{empty_str};
243
244 // отображаем корни и экстремумы, если мат. функция валидна
245 if (enter_menu[i]->is_input_valid()) {
246 // (вот именно для этой красивой передачи было перегружено явное
247 // преобразование) записываем все корни в вектор особых точек
248 points = vector<Math_calc::Point>(
249 Math_calc::function_roots{func, left_bottom, right_top, point_prec});
250
251 // записываем особые точки в марки, которые привязываем к окну
252 // (выбираем соотв. символ)
253 // TODO: создать пользовательский класс нужных для нас точек на экране
254
255 marks = new Marks{"x"};
256 for (const auto& root_point : points)
257 marks->add(converted_to_pix(root_point, origin, unit_intr));
258 attach(*marks);
259
260 // добавляем в общий вектор всех особых точек на экране
261 all_points.push_back(marks);
262
263 // перезаписываем все экстремумы в вектор особых точек
264 points = vector<Math_calc::Point>(Math_calc::function_extremes{
265 func, left_bottom, right_top, point_prec});
266
267 // перезаписываем особые точки в марки, которые привязываем к окну
268 // (выбираем соотв. символ)
269 Marks* marks = new Marks{"#"};
270 for (const auto& extreme_point : points)
271 marks->add(converted_to_pix(extreme_point, origin, unit_intr));
272 attach(*marks);
273
274 // добавляем в общий вектор всех особых точек на экране
275 all_points.push_back(marks);
276 }
277
278 // проходимся по вектору, куда вводит мат. функций и рисуем их пересечения
279 // (начинаем идти со следующего номера, чтобы не было самопересечения)
280 for (size_t j = i + 1; j < enter_menu.size(); j++) {
281 /// @brief Другая введенная мат. функция
282 const Math_func::function& oth_func = inputed_funcs[j];
283
284 // отображаем пересечения в том случае, если обе мат. функции валидны
285 if (enter_menu[i]->is_input_valid() && enter_menu[j]->is_input_valid()) {
286 // перезаписываем все пресечения в вектор особых точек
287 points = vector<Math_calc::Point>(Math_calc::function_crosses{
288 {func, oth_func}, left_bottom, right_top, point_prec});
289
290 // перезаписываем особые точки в марки, которые привязываем к окну
291 // (выбираем соотв. символ)
292 marks = new Marks{"o"};
293 for (const auto& cross_point : points)
294 marks->add(converted_to_pix(cross_point, origin, unit_intr));
295 attach(*marks);
296
297 // добавляем в общий вектор всех особых точек на экране
298 all_points.push_back(marks);
299 }
300 }
301 }
302}
Definition Shapes.h:350
void fill_inputed_funcs()
Обновляет все введенные мат. функции
Definition Graphix_window_updaters.cpp:124
Класс, хранящий в себе вектор точек - пересечений двух мат. функций
Definition function_crosses.h:15
Класс, хранящий в себе вектор точек - лок. экстремумы мат. функции
Definition function_extremes.h:14
Класс, хранящий в себе точки - пересеч. графика мат. функ. с осью Ox.
Definition function_roots.h:16
Graph_lib::Point converted_to_pix(Math_calc::Point p, Graph_lib::Point origin, double unit_intr)
Definition utilities.cpp:27
Вещественная точка
Definition math_base.h:9
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_unit_intr()

void Graphix_window::update_unit_intr ( double new_unit_intr)
private

Обновляет значение единич. отрезка

Parameters
new_unit_intrновое значение единич. отрезка
22 {
23 // если выбранный масштаб допустим
24 if (new_unit_intr < max_unit_intr && new_unit_intr > min_unit_intr) {
25 unit_intr = new_unit_intr;
26
27 // отвязываем оси и высвобождаем память
28 detach(*x_axis);
29 detach(*y_axis);
30 delete x_axis;
31 delete y_axis;
32
33 // создаём новые оси и задаём цвет
34
35 x_axis = new Axis{Axis::Orientation::horizontal,
36 origin,
37 w() - func_box_w,
40 "X"};
41 x_axis->set_color(Color::Color_type::dark_cyan);
42
43 y_axis = new Axis{
44 Axis::Orientation::vertical, origin, h(), unit_intr, mark_intr, "Y"};
45 y_axis->set_color(Color::Color_type::dark_cyan);
46
47 // привязываем новые оси
48 attach(*x_axis);
49 attach(*y_axis);
50
51 // перерисовываем все графики
52 for (size_t i = 0; i < enter_menu.size(); ++i)
53 if (!enter_menu[i]->is_graphix_hidden()) update_graphix(i);
54
55 // перерисовываем все производные
56 for (size_t i = 0; i < enter_menu.size(); ++i)
57 if (!enter_menu[i]->is_deriv_hidden()) update_deriv(i);
58
59 // перерисовываем все точки, если они видны
61 }
62}
constexpr pix_amount min_unit_intr
Минимальное кол-во пикселей в ед. отрезке
Definition constants.h:29
Here is the call graph for this function:
Here is the caller graph for this function:

◆ w()

pix_amount Graph_lib::Window::w ( ) const
inlineinherited
26{ return width; }
Here is the caller graph for this function:

◆ wait_for_button()

void Graphix_window::wait_for_button ( )

Запускает цикл ожидания нажатия кнопки и перерисовывает всё

28 {
29 while (!some_button_pushed && Fl::wait())
30 ;
31
32 // TEMP: временные выводы в консоль
33
34 cout << "some button pushed" << endl;
35 cout << "unit_intr: " << unit_intr << endl;
36 cout << "inputed_strings: ";
38 cout << "inputed_func_strs: ";
40 cout << endl << endl;
41
42 some_button_pushed = false;
43 Fl::redraw();
44}
void print(const std::vector< T > &v)
Выводит все элементы вектора в консоль
Definition temp_help.h:27
Here is the call graph for this function:
Here is the caller graph for this function:

◆ window_is_open()

bool Graphix_window::window_is_open ( ) const
inline
46{ return !quit_button_pushed; }

Member Data Documentation

◆ all_points

std::vector<Graph_lib::Marks*> Graphix_window::all_points
private

Все особые точки графиков

◆ border

Graph_lib::Line Graphix_window::border
private

Линия - ограничитель системы координат от меню ввода

◆ decr_button

Graph_lib::Button Graphix_window::decr_button
private

Кнопка уменьшения масштаба

◆ derivs

std::vector<Graphix_calc::Segmented_graphix*> Graphix_window::derivs
private

Нарисованные пользователем графики производных мат. функций

◆ enter_menu

std::vector<Graphix_calc::Function_box*> Graphix_window::enter_menu
private

Поля для ввода мат. функций и кнопки по управлению их графиков

◆ graphics

std::vector<Graphix_calc::Segmented_graphix*> Graphix_window::graphics
private

Нарисованные пользователем графики мат. функций

◆ height

pix_amount Graph_lib::Window::height
privateinherited

◆ incr_button

Graph_lib::Button Graphix_window::incr_button
private

Кнопка увеличения масштаба

◆ inputed_funcs

std::vector<Math_func::function> Graphix_window::inputed_funcs
private

Введенные пользователем валидные мат. функции

◆ inputed_strings

std::vector<std::string> Graphix_window::inputed_strings
private

Введенные пользователем строки

◆ is_points_visible

bool Graphix_window::is_points_visible {false}
private
107{false};

◆ new_func_button

Graph_lib::Button Graphix_window::new_func_button
private

Создания нового поля для ввода мат. функции

◆ origin

Graph_lib::Point Graphix_window::origin
private

Начало координат

◆ point_box

Graphix_calc::Point_box Graphix_window::point_box
private

Две кнопки, связанные с отображением особых точек графиков

◆ quit_button

Graph_lib::Button Graphix_window::quit_button
private

Кнопка выхода из программы

◆ quit_button_pushed

bool Graphix_window::quit_button_pushed {false}
private
110{false};

◆ scale_box

Graphix_calc::Bothput_box Graphix_window::scale_box
private

Поле для ввода пользовательского масштаба и вывода текущего

◆ scale_button

Graph_lib::Button Graphix_window::scale_button
private

Кнопка, изменяющая масштаб по введенному пользователем

◆ shapes

std::vector<Shape*> Graph_lib::Window::shapes
privateinherited

◆ some_button_pushed

bool Graphix_window::some_button_pushed {false}
private
109{false};

◆ unit_intr

double Graphix_window::unit_intr
private

Длина единичного отрезка

◆ width

pix_amount Graph_lib::Window::width
privateinherited

◆ x_axis

Graphix_calc::Axis* Graphix_window::x_axis
private

Горизонтальная ось

◆ y_axis

Graphix_calc::Axis* Graphix_window::y_axis
private

Вертикальная ось


The documentation for this class was generated from the following files: