【问题标题】:How do programs like mathematica draw graphs and how can I make such a program?像mathematica 这样的程序是如何绘制图形的,我该如何制作这样的程序?
【发布时间】:2011-01-23 07:12:53
【问题描述】:

我一直在想,mathematica 和 mathlab 等程序是如何如此优雅、快速地绘制函数图的。谁能向我解释他们是如何做到这一点的,此外,我该如何做到这一点?它与计算机编程或数学的某个方面或课程有关吗?然后呢?

【问题讨论】:

  • 您可能有兴趣查看matplotlib,这是一个python 中的二维绘图库。它采用 BSD 风格的许可证,因此您可以随心所欲地阅读和使用源代码。
  • 我认为@Jefromi 的评论是最好的答案,因为没有人能够告诉你 Matlab 或 Mathematica 是如何工作的。在一个强大的图形库中有很多很多微妙的问题需要解决,对你来说没有简单的答案,对不起
  • underlying rendering of plots in sage 也是用 matplotlib 完成的。
  • 虽然贝利撒留是对的(其中的微妙之处需要整个职业生涯才能理解),但您可以从这里的其他问题中获得一些关于基础知识的好提示。雅罗斯拉夫对此给出了绝妙的回答:stackoverflow.com/questions/4572183/… 真正深入了解了该过程的基础知识。

标签: math matlab graphics wolfram-mathematica discrete-mathematics


【解决方案1】:

好吧,在 belisarius 的鼓励下,这是我的评论作为答案:尝试查看 matplotlib。从主页:

matplotlib 是一个 python 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量图形。 matplotlib 可用于 python 脚本、python 和 ipython shell(ala MATLAB®* 或 Mathematica®†)、Web 应用程序服务器和六个图形用户界面工具包。

它最初的灵感来自 MATLAB 的绘图功能,尽管从那以后它发展了很多。它是可靠的软件——它是开源的,在 BSD 许可下,所以你不仅可以阅读源代码,还可以破解它并在任何你喜欢的地方使用它。

您可以查看的另一个地方是gnuplot。它不是常见的开源许可证之一,但它肯定是开源的,具有一些修改权限等。

Gnuplot 是一个便携式命令行驱动的绘图实用程序,适用于 linux、OS/2、MS Windows、OSX、VMS 和许多其他平台。源代码受版权保护,但可以免费分发(即,您不必为此付费)。它最初是为了让科学家和学生以交互方式可视化数学函数和数据而创建的,但已经发展到支持许多非交互用途,例如 Web 脚本。它还被 Octave 等第三方应用程序用作绘图引擎。自 1986 年以来,Gnuplot 一直受到支持并正在积极开发中。

它还可以进行 3D 绘图,而 matplotlib 不这样做,而且它的存在时间要长得多。我首先想到 matplotlib 的原因是它旨在作为高级语言的库,而不是独立的应用程序,所以我猜它可能更容易阅读。

另一个建议是查看 documentation for Plot,以了解 Mathematica 在幕后所做的各种事情。特别是,如果您查看可用选项,您可以推断出一些东西。

MaxRecursionAutomatic允许的最大递归细分数 Method Automatic 用于细化曲线的方法 PerformanceGoal$PerformanceGoal性能方面尝试优化 PlotPointsAutomatic初始采样点数

MaxRecursionPlotPoints,您可以看到它正在进行初始采样,然后以某种方式决定需要细分(重新采样)哪些区域以获得准确的绘图视图。从那里开始,这就是魔法:有一些 Method 用于此,还有 PerformanceGoal 来指导它...

【讨论】:

    【解决方案2】:

    对于 MATLAB,由于其跨平台要求,没有其他替代方法可以使用 OpenGL。 MATLAB 运行时使用 C++ 编写,非轴 GUI 使用 Java Swing。因此 MATLAB Plot 可能是 C++/OpenGL/Swing 的混合体。

    实际上,MATLAB 图形比视频游戏图形复杂得多。我认为更容易找到有关视频游戏图形的教程,然后将其“缩小”为 MATLAB 功能,例如用相同颜色绘制一条线。

    最重要的概念大概是Transformation Matrix

    【讨论】:

    • 我怀疑 MATLAB 除了 OpenGL 之外还有许多渲染引擎,虽然我不能说明事实。这种跨平台环境使用原生 2D/3D 图形 API 很常见他们正在运行的系统(GDI/DirectX,X11,Quartz,...)
    【解决方案3】:

    基本上,大多数绘制任何类型图形(尤其是任何合理复杂的图形)的程序都会使用某种类型的第三方库。

    使用的特定库取决于所使用的编程语言。 例如:

    对于 .Net 应用程序,您可以使用 Crystal 报表。 http://en.wikipedia.org/wiki/Crystal_Reports

    对于 Java,您可以使用 JFreeChart。 http://www.jfree.org/jfreechart/ 等等……

    无论您决定使用哪种语言编写代码,您都可能会找到大量库。

    如果您想在您的特定项目中完成此功能,我建议您使用库,特别是如果您是初学者。由于许多问题,例如跨平台兼容性、图形渲染优化(即:确保图形快速且“漂亮”地渲染)、与元素在图表等等。

    最后,我怀疑您是否会找到该主题的特定课程(或需要它们),因为再次排除非常特定的情况,程序员将始终使用已经存在的库。

    当有人有代码时,为什么要自己编写代码 已经为您解决了问题?

    【讨论】:

    • 所以计算机科学课程从不涉及,比如说,创建编译器,因为已经有编译器,对吧?
    • 你是个白痴!在您将来回复我之前,请阅读我写的内容并在上下文中阅读。 (或者只是不要!)如果我想表现得像个无知者,我相信我可以挑剔你的答案并提出类似的聪明声明。
    • 稳住。 OP 不想绘制图表,他/她想了解如何绘制图表的一些细节。 Jefromi 关于查看 matplotlib 细节的建议对此有所帮助;你的没有。
    【解决方案4】:

    一个好的起点是了解图形有一个语法,并且您在接收到绘图命令时想要构建的是图形的符号表示。对于 Mathematica,您可以执行类似

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

    查看 Mathematica 使用的内部表示。基本上,您需要根据颜色和坐标来描述要绘制的线段 (2D) 或网格 (3D)。此外,还需要有关图形比例以及如何绘制刻度线、标签轴等信息。

    这将我们引向问题的核心,如何确定要从函数和范围中绘制的线段?如果您在绘图的帮助文件中四处寻找,您会看到一些东西。首先有一个绘图点选项和一个 MaxRecursion 选项。这让我相信(这只是一个有根据的猜测,但我会这样做)Mathematica 在该范围内的偶数间隔上绘制初始点数以获得起始值。下一部分是识别变化超过某个阈值的区域,然后对更多点进行采样,直到线段中任意两个点之间的“变化”低于阈值。 Mathematica 以递归方式执行此操作,因此使用 MaxRecursion 选项。

    到目前为止,我对定义变化率一直很模糊。描述变化的更有用的方法是在你的线段上取 3 分。假设第 1 点和第 3 点之间存在线性关系,并假设这种线性关系,预测第 2 点将是什么。如果这个预测的误差足够低,那么考虑下一组三点。如果误差高于阈值,则应在该区域中采样更多点,直到达到阈值。通过这种方式,您将需要相对较少的曲线相对笔直的点,而在新方向弯曲的“有趣”部分需要更多点。您绘制的曲线的平滑度将与您愿意在点的线性预测中容忍的误差成正比。

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 1970-01-01
      • 2022-11-18
      • 2012-10-30
      • 2023-03-17
      • 2018-01-29
      • 1970-01-01
      • 2020-09-09
      • 2018-03-23
      相关资源
      最近更新 更多