像mathematica这样的程序是如何绘制图形的?我如何制作这样的程序?

像mathematica这样的程序是如何绘制图形的?我如何制作这样的程序?,math,matlab,graphics,wolfram-mathematica,discrete-mathematics,Math,Matlab,Graphics,Wolfram Mathematica,Discrete Mathematics,我一直在想,mathematica和mathlab等程序是如何优雅而快速地绘制函数图的。有谁能向我解释一下他们是如何做到的,还有,我是如何做到的?它与计算机编程或数学的某个方面或课程有关吗?那么哪个呢?对于MATLAB,由于其跨平台的要求,使用时没有其他选择。MATLAB运行时用C++编写,非轴GUI采用java Swing。因此,MatlabPlot可能是C++/OpenGL/Swing的混合体 实际上,MATLAB图形比视频游戏图形复杂得多。我认为更容易找到视频游戏图形的教程,然后将其“缩小

我一直在想,mathematica和mathlab等程序是如何优雅而快速地绘制函数图的。有谁能向我解释一下他们是如何做到的,还有,我是如何做到的?它与计算机编程或数学的某个方面或课程有关吗?那么哪个呢?

对于MATLAB,由于其跨平台的要求,使用时没有其他选择。MATLAB运行时用C++编写,非轴GUI采用java Swing。因此,MatlabPlot可能是C++/OpenGL/Swing的混合体

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


最重要的概念可能是。

基本上,大多数绘制任何类型图形(特别是具有合理复杂性的图形)的程序都将使用某种类型的第三方库

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

对于.Net应用程序,您可以使用Crystal reports

对于Java,您可以使用JFreeChart。 等等

您可能会发现,无论您决定使用何种语言编写代码,都有大量的库

如果您想在特定的项目中实现此功能,我建议您使用库,尤其是初学者。这些图形库如何实现的内部复杂性非常重要,因为存在许多问题,如跨平台兼容性、图形渲染优化(即:确保图形渲染快速且“漂亮”),以及与图形上元素定位相关的数学问题等等

最后,我怀疑你是否会在这门课程中找到具体的课程(或需要这些课程),因为同样排除了非常具体的案例,程序员总是使用已经存在的库

如果有人已经写了,为什么还要自己编写呢 已经为你解决了问题


好吧,在贝里萨里乌斯的鼓励下,这里有一个我的评论作为回答:试着看看。从主页:

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

它最初的灵感来自于MATLAB的绘图功能,尽管从那时起它已经发展了很多。这是一个可靠的软件,并且是开源的,在BSD许可下,所以你不仅可以阅读源代码,还可以对其进行黑客攻击,并在任何你喜欢的地方使用它

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

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

它还可以进行3D打印,而matplotlib则不这样做,而且它已经存在了很长时间。我之所以首先想到matplotlib,是因为它是一个用于更高级语言的库,而不是一个独立的应用程序,所以我猜它可能更容易阅读

另一个建议,只是为了了解Mathematica在幕后所做的事情,就是看看。特别是,如果你看看可用的选项,你可以推断出一些事情

MaxRecursion
Automatic
允许的最大递归细分数
方法
自动
用于细化曲线的方法
PerformanceGoal
$PerformanceGoal
尝试优化的性能方面
绘图点
自动
采样点的初始数量


MaxRecursion
PlotPoints
中,您可以看到它正在进行初始采样,然后以某种方式决定需要细分(重采样)哪些区域以获得准确的绘图视图。从那以后,这就是魔法:有一些
方法可以实现这一点,还有一个
性能自我的
来指导它…

一个好的开始就是理解图形有一个语法,在收到绘图命令后,你想要构建的是图形的符号表示。对于Mathematica,您可以执行以下操作

FullForm[Plot[Sin[x], {x, 0, 2 Pi}]]
要查看Mathematica使用的内部表示形式。基本上,您需要根据颜色和坐标来描述要绘制的线段(2D)或网格(3D)。此外,还需要了解有关图形比例以及如何绘制记号、标记轴等的信息

这就引出了问题的核心,如何确定要从函数和范围中绘制的线段?如果您在帮助文件中查找plot,您会看到一些东西。首先有一个plotpoints选项和一个MaxRecursion选项。这让我相信(这只是一个有根据的猜测,但我会这样做),Mathematica在范围内的偶数区间上绘制初始点数,以获得起始值。下一部分是识别变化超过某个阈值的区域,然后对更多点进行采样,直到线段中任意两点之间的“变化”低于阈值。Mathematica,这种情况会再次发生吗