Как такие программы, как mathematica, рисуют графики и как я могу создать такую ​​программу? - PullRequest
8 голосов
/ 23 января 2011

Мне было интересно, как такие программы, как mathematica, mathlab и т. Д., Так грациозно и быстро строят графики функций.Может кто-нибудь объяснить мне, как они это делают, и, кроме того, как я могу это сделать?Это связано с аспектом или курсом в области компьютерного программирования или математики?Который тогда?

Ответы [ 4 ]

5 голосов
/ 23 января 2011

Что ж, с некоторой поддержкой от Велисария вот мой комментарий в качестве ответа: попробуйте посмотреть на matplotlib . С домашней страницы:

matplotlib - это библиотека 2D-черчения Python, которая генерирует показатели качества публикаций в различных печатных форматах и ​​интерактивных средах на разных платформах. Matplotlib может использоваться в скриптах python, оболочке python и ipython (ala MATLAB® * или Mathematica® †), серверах веб-приложений и шести наборах инструментов графического интерфейса пользователя.

Первоначально он был вдохновлен возможностями черчения MATLAB, хотя с тех пор он сильно вырос. Это твердое программное обеспечение - и это с открытым исходным кодом, под лицензией BSD, поэтому вы можете не только читать исходный код, но и взламывать его и использовать по своему усмотрению.

Еще одно место, которое вы можете посмотреть, это gnuplot . Это не одна из распространенных лицензий с открытым исходным кодом, но это, безусловно, с открытым исходным кодом, с некоторыми разрешениями на изменение и тому подобное.

Gnuplot - это портативная графическая утилита, управляемая из командной строки, для Linux, OS / 2, MS Windows, OSX, VMS и многих других платформ. Исходный код защищен авторским правом, но распространяется свободно (т. Е. Вам не нужно за него платить). Первоначально он был создан, чтобы позволить ученым и студентам интерактивно визуализировать математические функции и данные, но теперь он поддерживает многие неинтерактивные приложения, такие как веб-сценарии. Он также используется в качестве средства построения графиков сторонними приложениями, такими как Octave. Gnuplot поддерживается и активно развивается с 1986 года.

Он также выполняет 3D-черчение, чего не делает matplotlib, и он существует намного дольше. Причина, по которой я сначала подумал о matplotlib, заключается в том, что он предназначен как библиотека для языка более высокого уровня, а не как отдельное приложение, поэтому я предполагаю, что вам будет немного легче его читать.

Еще одно предложение, просто чтобы получить представление о том, что Mathematica делает под капотом, - взглянуть на документацию для Plot . В частности, если вы посмотрите на доступные варианты, вы можете сделать вывод.

MaxRecursion Automatic максимально допустимое количество рекурсивных подразделений Method Automatic метод, используемый для уточнения кривых PerformanceGoal $PerformanceGoal аспекты производительности, чтобы попытаться оптимизировать PlotPoints Automatic начальное количество точек выборки

Из MaxRecursion и PlotPoints вы можете видеть, что он выполняет начальную выборку, а затем каким-то образом решает, какие регионы необходимо подразделить (пересчитать), чтобы получить точное представление о графике. И с этого момента, это волшебство: есть некоторые Method для этого и PerformanceGoal, чтобы направлять это ...

1 голос
/ 23 января 2011

В основном большинство программ, которые строят графики любого типа (особенно любые графики разумной сложности), используют сторонние библиотеки.

Конкретная используемая библиотека будет зависеть от используемого языка программирования.Например:

Для приложения .Net вы можете использовать отчеты Crystal.http://en.wikipedia.org/wiki/Crystal_Reports

Для Java вы можете использовать JFreeChart.http://www.jfree.org/jfreechart/ И так далее ...

Скорее всего, вы найдете множество библиотек для любого языка, на котором вы решите кодировать.

Если вы хотите реализовать эту функцию в вашем конкретном проектеЯ предлагаю использовать библиотеку, особенно если вы новичок.Внутренние сложности реализации этих библиотек графов были бы значительными из-за многих проблем, таких как кросс-платформенная совместимость, оптимизация рендеринга графики (то есть: обеспечение быстрой и «привлекательной» визуализации графики, математика, связанная с позиционированием элементов награфик и т. д.

Наконец, я сомневаюсь, что вы найдете конкретные курсы по этому предмету (или потребуете их), поскольку опять-таки, за исключением ОЧЕНЬ конкретных случаев, программисты всегда будут использовать библиотеки, которые уже существуют.

Зачем кодировать это самостоятельно, если кто-то уже решил проблему для вас?

1 голос
/ 23 января 2011

Для MATLAB из-за его кроссплатформенного требования нет альтернативы использованию OpenGL .Среда выполнения MATLAB написана на C ++, а неосевой графический интерфейс использует Java Swing.Следовательно, MATLAB Plot, вероятно, представляет собой смесь C ++ / OpenGL / Swing.

На самом деле графика MATLAB намного менее сложна, чем графика видеоигр.Я думаю, что легче найти учебники по графике видеоигр, а затем «уменьшить» их до функциональности MATLAB, например, нарисовать одну линию одного цвета.

Наиболее важной концепцией, вероятно, является Transformation Matrix .

0 голосов
/ 26 января 2011

Хорошее место для начала - это понять, что в графике есть грамматика и что вы хотите построить после получения команды plot, это символическое представление графика.Для Mathematica вы можете сделать что-то вроде

FullForm[Plot[Sin[x], {x, 0, 2 Pi}]]

, чтобы увидеть внутреннее представление, используемое Mathematica.В основном вам нужно описать отрезки линий (2D) или сетки (3D), которые вы хотите нарисовать, с точки зрения их цвета и координат.Кроме того, требуется информация о масштабе графика и о том, как рисовать метки, оси меток и т. Д.

Это подводит нас к сути вопроса: как определить сегмент линии, который вы хотитеизвлечь из функции и диапазона?Если вы покопаетесь в файле справки для сюжета, вы увидите несколько вещей.Сначала есть опция точек заговора и опция MaxRecursion.Это заставляет меня поверить (и это просто обоснованное предположение, но я так и сделаю), что Mathematica строит начальное количество точек на четном интервале в диапазоне, чтобы получить начальное значение.Следующая часть должна определить регионы, где изменение превышает некоторый порог, а затем отобрать больше точек, пока «изменение» между любыми двумя точками в вашем отрезке не окажется ниже порога.Mathematica делает это рекурсивно, отсюда опция MaxRecursion.

До сих пор я довольно неопределенно определял скорость изменения.Более полезный способ описать изменение - это взять 3 очка на свой линейный сегмент.Предположим, что линейная зависимость между 1-й и 3-й точкой и, предполагая эту линейную зависимость, делает прогноз о том, какой будет 2-я точка.Если ошибка этого прогноза достаточно мала, то рассмотрим следующую группу из трех точек.Если ошибка превышает пороговое значение, вам следует выбрать еще несколько точек в этом регионе до достижения порогового значения.Таким образом, вам потребуется относительно немного точек, где кривая относительно прямая, и больше в «интересных» частях, где она изгибается в новых направлениях.Гладкость кривой, которую вы рисуете, будет пропорциональна погрешности, которую вы готовы допустить при линейном прогнозировании точек.

...