Skip to content

Simple C++ SFML-based library for drawing graphs of functions

Notifications You must be signed in to change notification settings

busyBeaver1/graph

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 

Repository files navigation

О программе

Это простая 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.

Класс Graph

Ниже тип 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_н - использовать ли логарифмическую шкалу по вертикальной оси. Остальные поля используются внутри класса и для пользователя библиотеки интереса не должны представлять.

Лицензия

Весь код этой библиотеки передаётся в общественное достояние, на сколько это возможно. Код может быть использован кем угодно с любой целью без указания автора.

About

Simple C++ SFML-based library for drawing graphs of functions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages