Думаю каждый сталкивался с проблемой визуализации данных внутри своей программы. Особенно, если программа консольная. В топике я хочу рассказать о бесплатной (для некоммерческого использования) кроссплатформенной библиотеке DISLIN, которая разработана институтом исследований Солнечной системы имени М. Планка (Германия). DISLIN может как просто отображать графики, так и сразу их сохранять в файлы. Разработчики заявляют возможность использования в fortran, c/c++, Perl, Python, Java, .NET.
Библиотека поддерживает следующие типы дисплеев: VGA, X Windows, Windows API, OpenGL и Tektronix; и следующие форматы файлов GKSLIN, CGM, HPGL, PostScript, PDF, WMF, SVG, PNG, BMP, GIF, TIFF. При этом поддерживается импорт изображений в TeX, что не может не радовать.
Что же умеет DISLIN?
- Построение двух- и трехмерных графиков и поверхностей.
- Построение кривых, в том числе заданных параметрически.
- Элементарные операции построения линий, векторов, полей и геометрических фигур с различными типами заливки.
- Работа с текстом: легенда, подписи и т. д.
- Построение двух- и трехмерных гистограмм и диаграмм.
- Построение карт (обычных и контурных) в различных проекциях.
- Создание своего GUI.
Как использовать?
Покажу на примере c#. Чтобы включить DISLIN в свой проект нужно:
- Добавить в «References» файл disnet.dll. Все вызовы библиотеки собраны в классе dislin.
- Добавить в проект файл dislin.cs.
- В папку проекта положить библиотеку dislnc.dll.
// Определили формат вывода графика: xwin - вывод на экран
dislin.metafl ("xwin");
// Инициализировали библиотеку DISLIN
dislin.disini ();
// Определим заголовок
dislin.titlin ("3-D Colour Plot of the Function", 1);
dislin.titlin ("f(x,y) = sin(x) * cos(y)", 3);
// Подписи осей
dislin.name ("X-axis", "X");
dislin.name ("Y-axis", "Y");
dislin.name ("Z-axis", "Z");
// Вывели заголовок
dislin.title ();
// Задали размеры осей
dislin.ax3len(1000, 1000, 1000);
// Строим систему координат
dislin.graf3(0.0f, 360.0f, 0.0f, 90.0f, 0.0f, 360.0f, 0.0f, 90.0f, -2.0f, 2.0f, -2.0f, 1.0f);
// Выводим график. В массиве func хранятся предвычисленные значения функции
dislin.crvmat(func, n, n, 1, 1);
// Завершили работу с DISLIN
dislin.disfin ();
* This source code was highlighted with Source Code Highlighter.
А вот, что получилось:Теперь построим обычный двумерный график:
dislin.titlin("CURVE", 1);
dislin.titlin("SIN^2(X), SIN(X) + COS(X)", 3);
dislin.graf(0.0f, 360.0f, 0.0f, 90.0f, -2.0f, 2.0f, -1.0f, 0.5f);
dislin.title();
//Построим 2 кривые
dislin.color("red");
dislin.curve(xPoints, func1, n);
dislin.color("green");
dislin.curve(xPoints, func2, n);
* This source code was highlighted with Source Code Highlighter.
График в полярных координатах:
dislin.polar(1.0f, 0.0f, 0.2f, 0.0f, 30.0f);
dislin.curve(xPoint, func, n);
* This source code was highlighted with Source Code Highlighter.
И наконец, трехмерная поверхность:
dislin.view3d (-5.0f, -5.0f, 4.0f, "ABS");
dislin.graf3d (0.0f, 360.0f, 0.0f, 90.0f, 0.0f, 360.0f, 0.0f, 90.0f,
-3.0f, 3.0f, -3.0f, 1.0f);
dislin.color ("red");
//Задаем поверхность
dislin.surmat (func, n, m, 1, 1);
* This source code was highlighted with Source Code Highlighter.
Чтобы сразу сохранить график в файл, необходимо в функции metafl задать желаемое расширение, например:
dislin.metafl ("png");
В папке с программой появится файл dislin.png с картинкой.Минусы библиотеки:
- Фигура получается статичной: нельзя повращать трехмерную поверхность или изменить масштаб. Хотя параметры проекции настраиваются.
- Нет поддержки русского языка. Приходится подписи делать по-английски.
Что еще почитать?
Много примеров приведено на официальном сайте библиотеки: www.mps.mpg.de/dislin/examples.html
Также можете посмотреть пользовательскую галерею.
Презентация от разработчиков (англ.): www.mps.mpg.de/dislin/dislin.ppt
Онлайн руководство (англ.): www.mps.mpg.de/dislin/manual.html
Краткий справочник по функциям (англ.): www.mps.mpg.de/dislin/appa.html
Ссылка для скачивания (v. 10.1): www.mps.mpg.de/dislin/downloads.html
Между прочим, библиотеке DISLIN уже 25 лет. Первая версия вышла в свет в декабре 1986г.