Научная графика

В математике и в науке (в физике, например) существует проблема изображения трехмерных объектов, заданных системой точек в трехмерном пространстве. Очень часто надо изобразить трехмерную поверхность, заданную уравнением z(x,y) как решение уравнения f(x,y,z)=const. Если поверхность однозначная, то наиболее распространенный прием — это рисование карты разной степени серого цвета в прямоугольнике. При этом отдельно каждой степени серого ставится в соответствие координата z, либо любая другая функция. И вообще вместо x, y и z могут быть самые разные параметры: температура, плотность и так далее.

Черно-белые карты наиболее точно показывают область аргументов. Но в старые времена существовал и другой способ, а именно, контурные карты. Такие карты часто рисовали в учебниках географии, изображая высоты гор и глубины океанов. Контур соответствовал решению уравнения z(x,y)=const. При этом на разных линиях ставились значения константы. Все эти методы и сейчас существуют.

А есть и другие методы, когда рисовалась аксонометрическая проекция объекта в виде сетки линий z(x) при постоянном y и z(y) при постоянном x. При этом для наглядности оставлялись только видимые части линий, а невидимые, то есть за горизонтом, убирались. Хотя такой метод более наглядный, он скрывает часть информации. Поэтому приходилось показывать несколько таких картинок, а то и вообще вращать объект относительно вертикальной оси.

Так как я сам пишу программы научных расчетов, то я, естественно, сделал для себя и программы рисования таких вот картинок. Сделал я это очень давно, еще во времена первых и очень слабых компьютеров. А потом появились pdf файлы, и в научных статьях стали использовать цвет. Я долго сопротивлялся новой моде. Но в прошлом году у меня приняли статью в печать и даже предложили один мой рисунок поставить на обложку, но сразу сказали, что им нужен цветной рисунок и более высокой четкости, чем в статье.

Пришлось мне срочно, буквально за один день, переписать свою программу рисования и ввести цветовую палитру. Я решил сделать палитру типа (синее, красное, белое), что имело аналог в природе, а именно синий океан с его глубинами, красная глина на земле и белые шапки высоких гор. Рисунок поставили на обложку, а у меня в программе появился цвет, хотя я, по-прежнему, не любил его использовать. И вчера я понял, что был не прав. Я вычислил новый результат в очередной задаче и вдруг увидел, что черно-белая карта дает мало информации, и что цветные карты более наглядны, так как позволяют более наглядно показать области разной высоты.

Более того, я понял, что палитра должна содержать больше цветов, тогда получается более высокая детализация. И я ввел еще одну палитру типа (черное, синее, зеленое, красное, белое). На рисунке слева показана картинка, которая получилась. Картинка рассчитана на весь экран, поэтому при уменьшении числа и текст стали маленькие. Но если кликнуть на картинке, то можно увидеть оригинал в полный размер в отдельном окне.

Затем я сделал следующий шаг, который давно собирался сделать. Я попробовал нарисовать аксонометрическую цветную проекцию с помощью программы Gnuplot. Я уже писал вот тут, что недавно узнал о существовании этой программы под Виндовс, причем очень свежей версии. Я решил нарисовать этот же массив данных, но с помощью своей программы на языке ACL. Начать с того, что у меня была матрица в бинарном виде размером 911*702 точек. Для аксонометрической проекции это много. Я выделил из нее более рыхлую матрицу размером 228*233 точек.

Далее, для Gnuplot необходимо в эту матрицу также записать значения аргументов по обеим осям, что увеличивает ее размер до 229*234 точки. И самое сложное — это то, что моя программа записывает бинарные файлы так как в Юникс и Линукс, то есть старшие байты вперед, а Gnuplot для Виндовс читает бинарные файлы как в Виндовс, то есть младшие байты вперед. То есть мне в бинарном файле было необходимо поменять порядок каждых четырех байтов. Первоначально мне эта задача казалась сложной, но потом я обнаружил, что на ACL она решается в три команды, которые записываются на одной строке.

После того, как массив был готов, осталось записать программу рисунка на языке Gnuplot в файл, записать командный файл и запустить его. В конце концов, программа Gnuplot сделал рисунок как бы в процессе выполнения моей ACL программы. В этом отличие программ, создаваемых в системе Юникс от программ для Виндовс. Система Юникс (Линукс) рассчитана на программистов, а система Виндовс — на неграмотных людей, которые покупают компьютер только для того, чтобы играть в игры, или общаться по скайпу.

Я читал, что некоторые считают систему команд Gnuplot языком программирования. Это, на мой взгляд, не совсем так, потому что в этой системе не все можно сделать. Это просто система описания рисунка. Но эта система достаточно развита, хотя позволяет делать рисунок и одной командой, когда все устанавливается по умолчанию. Вместе с тем, мне показалось, что не всем можно управлять и это тоже минус. Но в любом случае задание форматирования рисунка текстом — это намного лучше, чем тыкать в многочисленные окна и кнопки, как это любят пользователи Виндовс. К сожалению на такую систему соблазняются даже вполне умные люди, даже академики, которые по каким то причинам не желают изучать программирование.

Важно знать, что программа Gnuplot официально бесплатная, имеет хорошее описание (правда на английском языке) и даже большой набор демонстрационных примеров. Здесь я покажу только два из них. Так на рисунке слева показаны трехмерные поверхности, заданные параметрически, в виде двух торов, взаимно проникающих один в другой. Сами поверхности задаются формулами. Рисование объектов по формулам имеет только учебные и демонстрационные цели, потому что реальные результаты получаются в результате решения много более сложных уравнений.

С другой стороны, программа позволяет рисовать цветные карты, контуры, аксономертические проекции как отдельно, так и вместе. Более того, контуры можно рисовать даже на поверхности. На рисунке слева это как раз и демонстрируется. Я для себя таких сложных программ не делал, потому что не видел в этом пользы. Если честно, то такие сложные рисунки хороши в презентациях, а не в публикациях. Но как говорится, была бы возможность, а применение найдется. Вообще-то в Gnuplot есть возможность записывать рисунки в файл, но я сам просто копирую в файл часть экрана по своей программе vkSM.jar. Так иногда проще и быстрее.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s