вторник, 19 января 2016 г.

Строим графики используя gnuplot

Gnuplot - знакомая многим пользователям линукса свободная кросс-платформенная программа, позволяющая строить двухмерные и трехмерные графики. К сожалению, в Qt нет встроенного виджета для отрисовки графиков, но есть сторонние библиотеки позволяющие это сделать. Так есть QwtPlot3D (последний раз обновлялся в 2007 году) для отрисовки трехмерных графиков, для двухмерных графиков есть, например, Qwt. Но сегодня пойдет речь о Gnuplot-iostream interface, позволяющему использовать всю мощь программы gnuplot с минимумом затрат. Эта библиотека представляет собой iostream pipe, независимый от используемой платформы. И так, приступим.
Для начала нам понадобятся сама библиотека, представляющая собой один-единственный заголовочный файл, установленное приложение gnuplot и установленная библиотека Boost (как устанавливать описано тут).
В Windows необходимо также добавить путь к приложению gnuplot в системную переменную Path (например, этот путь может быть следующим C:\Program Files (x86)\gnuplot\bin). Для работы с gnuplot-iostream понадобится также подключить три библиотеки из Boost: filesystem, system и iostreams. Необходимо соблюдать именно такой порядок, иначе получим ошибку. Пример файла проекта Qt:
Не забываем подключить заголовочный файл:
#include "gnuplot-iostream.h"
Использование gnuplot-iostream выглядит следующим образом:
Для Windows указываем "gnuplot.exe -persist", это не дает сразу же закрыться окну. В линуксе и без этого все хорошо работает.
Рассмотрим простой пример. На главном окне (MainWindow) будет располагаться поле для ввода уравнения f(x,y) и две кнопки. По клику на одну кнопку мы строим через приложение gnuplot график уравнения f(x,y), по клику по другой кнопке мы строим выводим график заданного массива точек (x,y,z).
 
Файл проекта приведен выше. Заголовочный файл главного окна mainwindow.h:
Файл mainwindow.cpp:
В итоге, при нажатии кнопки "Plot expression" получаем:
Весь проект доступен для скачивания на github: https://github.com/qtneko/qt-cat/tree/master/gnuplot

Комментариев нет:

Отправить комментарий