我一直想知道像mathematica和mathlab等程序如何优雅而快速地绘制函数图。任何人都可以向我解释他们是如何做到这一点的,而且,我怎么做到这一点?它与计算机程序设计或数学中的方面或课程有关吗?然后呢?
答案 0 :(得分:5)
答案 1 :(得分:1)
对于MATLAB,由于其跨平台要求,没有使用OpenGL的替代方案。 MATLAB运行时用C ++编写,非轴GUI用Java Swing编写。因此,MATLAB Plot可能是C ++ / OpenGL / Swing混合物。
实际上,MATLAB图形远比视频游戏图形复杂得多。我认为更容易找到有关视频游戏图形的教程,然后将其“缩小”为MATLAB功能,比如用相同的颜色绘制一条线。
最重要的概念可能是Transformation Matrix。
答案 2 :(得分:1)
基本上,大多数绘制任何类型图形的程序(特别是任何合理复杂的图形)都将使用某种类型的第三方库。
使用的特定库取决于正在使用的编程语言。 例如:
对于.Net应用程序,您可以使用Crystal报表。 http://en.wikipedia.org/wiki/Crystal_Reports
对于Java,您可以使用JFreeChart。 http://www.jfree.org/jfreechart/ 等等...
您可能会为您决定编码的语言找到数字库。
如果您想在特定项目中完成此功能,我建议您使用库,尤其是如果您是初学者。由于许多问题,例如跨平台兼容性,图形渲染优化(即:确保图形快速渲染和“漂亮”),与元素定位相关的数学,这些图形库如何实现的内部复杂性将是重要的。图表等等。
最后,我怀疑你会发现这个主题的特定课程(或要求它们)再次排除非常具体的案例程序员将始终使用已经存在的库。
为什么有人自己编写代码呢? 已经为你解决了这个问题?
答案 3 :(得分:0)
一个好的起点是要了解图形的语法,并且在接收绘图命令时要构建的是图形的符号表示。对于Mathematica,您可以执行类似
的操作FullForm[Plot[Sin[x], {x, 0, 2 Pi}]]
查看Mathematica使用的内部表示。基本上,您需要根据颜色和坐标描述要绘制的线段(2D)或网格(3D)。此外,还需要有关图表比例以及如何绘制刻度线,标签轴等的信息。
这引出了我们问题的核心,您如何确定要从函数和范围中绘制的线段?如果你在帮助文件中挖掘情节,你会看到一些东西。首先是绘图点选项和MaxRecursion选项。这让我相信(这只是一个有根据的猜测,但我是这样做的),Mathematica在该范围内以均匀间隔绘制初始点数以获得起始值。下一部分是确定变化超过某个阈值的区域,然后采样更多点,直到线段中任意两点之间的“变化”低于阈值。 Mathematica递归地执行此操作,因此MaxRecursion选项。
到目前为止,我对定义变化率一直非常模糊。描述变化的更有用的方法是在线段上花费3分。假设第1点和第3点之间存在线性关系,假设这种线性关系,则预测第2点是什么。如果该预测的误差足够低,则考虑下一组三个点。如果误差高于阈值,那么您应该在该区域中采样更多点,直到达到阈值。通过这种方式,您将需要相对较少的点,其中曲线相对较直,而更多的点位于“有趣”的部分,它在新的方向上弯曲。您绘制的曲线的平滑度将与您在点的线性预测中愿意容忍的误差成比例。