Это простая C++ библиотека, основанная на SFML, для рисования математических графиков в графическом окне. Поддерживается обычная линейная шкала и логарифмическая шкала.
Библиотека была создана для удобства выполнения лабораторных и курсовых работ, требующих построения графиков, в рамках курса прикладной математики.
Графики из точек | Плавные графики |
---|---|
Установите SFML, например, по инструкции с официального сайта. Для linux достаточно установить пакет библиотеки SFML (в разных дистрибутивах он может называться по-разному).
Скачайте из этого репозитория файл graph.hpp
и файл шрифта DejaVuSans.ttf
из этого архива и поместите их в папку проекта. DejaVuSans.ttf
должен находиться в той папке, в которой скомпилированный код запускается (обычно это папка проекта).
Добавьте в начало вашего кода #include "graph.hpp"
.
Пример команды для компиляции с помошью gcc:
g++ test.cpp -o test -lsfml-graphics -lsfml-window -lsfml-system
test.cpp
замените на файл с вашим кодом и test
- на файл, куда записывать скомпилированный бинарник.
Почти все возможности библиотеки показаны в файле test.cpp
. Он содержит 5 примеров, рисующих разные вещи с помощью библиотеки. Примеры запускаются по очереди, каждый после закрытия окна пользователем. Весь код примеров подробно документирован комментариями. Если у вас проблемы с запуском библиотеки, советую начать с запуска примеров.
Библиотека содержит единственный класс Graph
, который отвечает за создание окна и отрисовку графиков. Примерно следующим образом выглядит стандартное использование класса:
Graph g; // создание экземпляра g
std::vector<double> X, Y; // создание массивов для значений по осям X и Y
// здесь нужно эти массивы как-то заполнить
g.graph(X, Y); // добавление графика в окно
g.show(-1); // запуск отображения окна до момента закрытия пользователем
Описание методов и полей класса см. ниже.
- Зажав ЛКМ, можно перетаскивать картинку. Когда курсор выходит за рамки окна, он автоматически телепортируется на другую сторону окна, чтобы продолжать перетаскивание бесконечно.
- Колёсиком мыши можно приближать/отдалять картинку с центром в курсоре.
- Зажатая кнопка TAB ускоряет приближение/отдаление.
- Зажатая кнопка Shift разрешает приближение/отдаление только по горизонтальной оси.
- Зажатая кнопка Ctrl разрешает приближение/отдаление только по вертикальной оси.
- Кнопка Alt делает одинаковые масштабы по обеим осям (чтобы пропорции графика не были искажены). При этом точка, находившаяся под курсором, сохраняется.
- Кнопка O переносит начало координат под курсор.
- Кнопка Home переносит картинку так, чтобы графики ровно входили в окно по высоте и ширине.
- Кнопка X включает/выключает логарифмическую шкалу по оси X.
- Кнопка Y включает/выключает логарифмическую шкалу по оси Y.
Ниже тип dtype
это псевдоним для double
.
Graph(sf::String label = "Graph", int xsize = 1080, int ysize = 720)
Создаёт новое окно с графиками размером xsize
на ysize
и с заголовком label
. Окно не будет отображено до первого вызова show
.
void Graph::graph(std::vector<dtype> x_values, std::vector<dtype> y_values, sf::Color color = sf::Color::White)
Добавляет график (ломанную), соединяющий точки с координатами по горизонтали x_values
и повертикали - y_values
, цвет графика будет color
. x_values
и y_values
должны быть типа std::vector<dtype>
. Длины x_values
и y_values
должны совпадать. Новый график добавляется в стек графиков. Он может быть удалён с конца стека вызовом pop()
.
void Graph::graph_points(std::vector<dtype> x_values, std::vector<dtype> y_values, sf::Color color = sf::Color::White, dtype rad = 5)
Добавляет график из отдельных точек с координатами по горизонтали x_values
и повертикали - y_values
, цвет графика будет color
, rad
- видимый радиус точек. Отличие от graph
заключается в том, что будут отображаться только сами переданные точки, вместо того, чтобы отображалась ломаная, соединяющая точки. Новый график добавляется в стек точечных графиков. Он может быть удалён с конца стека вызовом pop_points()
.
void Graph::pop()
Удаляет последний не точечный (обычный) график.
void Graph::pop_points()
Удаляет последний точечный график.
int Graph::size()
Возвращает текущее количество обычных графиков.
int Graph::size_points()
Возвращает текущее количество точечных графиков.
void Graph::reset_placement(bool fixed_ratio = false)
Автоматически сбрасывает расположение системы координат в окне, так, чтобы графики ровно входили по высоте и по ширине. Если задать fixed_ratio
как true
, то масштаб по вертикальной и горизонтальной осям будет одинаковым, так что пропорции графика не исказятся. При этом ровно в окно графики войдут только по одной из осей, по ширине или по высоте, а по второй будут находиться в середине.
Сброс также автоматически происходит при открытии окна (первом и после того, как оно было закрыто), если сброс не был сделан вручную (этим методом).
void Graph::reset_placement(dtype x_min, dtype x_max, dtype y_min, dtype y_max, bool fixed_ratio = false)
То же самое, как предыдущая перегрузка метода, но вместо того, чтобы вмещать в окно все графики, метод вмещает в окно заданный прямоугольник [x_min, x_max]x[y_min, y_max]. В том числе работает в режиме логарифмической шкалы.
void Graph::close()
Закрывает окно.
bool Graph::show(float duration = 0.0f)
Запускает отображение окна и обработку пользовательского ввода на время duration
в секундах, или до тех пор, пока пользователь не закроет окно. Отрицательное значение duration
означает, что обработка не будет прекращена, пока пользователь не закроет окно. duration = 0
означает, что будет отрисован один кадр. Во время работы метода картинка в окне постоянно перерисовывается с частотой кадров, записанной в поле fps
. Возвращает, открыто ли до сих пор окно.
void Graph::set_logscale_x(bool logx)
Включает логарифмическую шкалу по оси X при logx = true
, при logx = false
- отключает. Автоматически обрабатывает перенос системы координат, так, чтобы сохранились крайние значения по оси X (на правом и левом конце окна). Вместо вызова этого метода, можно просто присвоить значение в поле logscale_x
, но тогда перенос системы координат не будет осуществлён и значения по оси просто перейдут в степени десятки, т. е. там, где отображалось 4, станет 10000.
void Graph::set_logscale_y(bool logy)
То же самое, что set_logscale_x
, но для оси Y.
void Graph::clear()
Удалить все графики, включая обычные и точечные.
Остальные методы используются внутри класса и для пользователя библиотеки интереса не должны представлять.
sf::Color background
- цвет фона. По умолчанию - чёрный.sf::Font font
- шрифт надписей на осях. По умолчанию берётся из файлаCyrilicOld.TTF
.float fontsize
- размер шрифта. По умолчанию - 20.int fps
- частота кадров отрисовки. По умолчанию - 30.int axis_thickness
- визуальная ширина линий осей координат в пикселях. По умолчанию - 1.int axis_mark_thickness
- визуальная ширина засечек на координатных осях. По умолчанию - 1.int axis_mark_length
- визуальная длина засечек на координатных осях. По умолчанию - 19.int text_xshift, text_yshift
- смещение начала текста подписи над засечкой относительно центра засечки в пикселях. По умолчанию - (4, 23).int text_xshift, text_yshift
- смещение начала текста подписи над засечкой относительно центра засечки в пикселях. По умолчанию - (4, 23).int label_spacing
- минимальное визуальное расстояние между соседними засечками на координатных осях в пикселях.dtype scale_k
- во сколько раз изменяется масштаб при прокрутке колёсика мыши на один шаг. По умолчанию - 1.1.dtype big_scale_k
- во сколько раз изменяется масштаб при прокрутке колёсика мыши на один шаг при зажатом TAB. По умолчанию - 4.dtype big_scale_k
- во сколько раз изменяется масштаб при прокрутке колёсика мыши на один шаг при зажатом TAB. По умолчанию - 4.sf::Color axes_color
- цвет координатных осей и подписей к ним. По умолчанию - белый.sf::String label
- заголовок окна. По умолчанию - "Graph".bool logscale_x
- использовать ли логарифмическую шкалу по горизонтальной оси.bool logscale_н
- использовать ли логарифмическую шкалу по вертикальной оси. Остальные поля используются внутри класса и для пользователя библиотеки интереса не должны представлять.
Весь код этой библиотеки передаётся в общественное достояние, на сколько это возможно. Код может быть использован кем угодно с любой целью без указания автора.