绘制数学函数而不渲染人工制品

时间:2011-06-16 08:37:34

标签: javascript svg

我认为没有一个好的答案,但我想知道是否有更好的方法来做到这一点。

我需要绘制一个数学函数,它在显示器的一端几乎是平的,而在另一端几乎是垂直的。圆的左下象限将是一个很好的模型。我可以根据需要自动生成多个点。

问题是,如果没有各种各样的文物,我不能这样做。

我没有试过Bezier拟合;我认为这甚至不会接近。我的理解是Bezier是一次性手工构造的漂亮图形,而不是真正的曲线拟合。

留下折线。我可以用折线做两件事 - 我可以选择线长(换句话说,我自动生成的点数),我可以禁用消除锯齿(setAttributeNS(null,“shape-rendering”, “脆边”)。

如果我产生很多分数,那么我到处都会遇到麻烦,结果无法使用。它看起来也非常像是振荡,这使我看起来错误地计算了函数。抗锯齿没有任何区别,因为它不能跨点边界运行。

我得到的唯一解决方案是绘制更少的点,这样很明显我正在绘制细分。它不再平滑,但至少没有锯齿或振荡。我使用默认的抗锯齿来绘制它。

有什么想法吗?

编辑: 似乎这个的唯一答案是实际上贝塞尔曲线拟合。您必须预处理以查找所需段的参数,然后绘制结果。谷歌在与贝济耶的曲线拟合中获得了大量的点击。

2 个答案:

答案 0 :(得分:0)

您具有数学函数,因此可以根据需要生成任意数量的点。

我认为问题是因为您不知道输出分辨率(SVG与设备无关),您不知道要生成多少个点。否则,您可以创建一条折线,其中每条线的长度约为1个像素。

将数学函数拟合到贝塞尔曲线(可能)不会得到完美的匹配 - 就像圆不能通过立方贝塞尔曲线完美匹配。我认为将函数拟合为bezier曲线的任务并不是微不足道的(我从未这样做过)。

您是否可以将数学函数输出到canvas元素?然后你可以写一些javascript代码来绘制你的数学函数取决于输出分辨率。与图形系统呈现贝塞尔曲线的方式类似。

你知道图形系统如何渲染贝塞尔曲线吗?它们使用折线近似贝塞尔曲线,然后测量折线和贝塞尔曲线之间的误差差异。如果差值大于某个公差 - ,其中公差由输出分辨率确定 - 贝塞尔曲线被细分,并且每个贝塞尔曲线重复该过程。当贝塞尔曲线和折线之间的差异低于公差时,将绘制折线。 http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Computer_graphics

答案 1 :(得分:0)

我想你想在某个区间[a,b]

画一个y = f(x)

经典解决方案是在[a,b]上均匀分布N个点,以计算这些点上的f并绘制线(或多项式)。

它当然不适用于您的情况,因为y在某些区域几乎是垂直的。但是你为什么不在这些领域获得更多的分数(以及功能几乎水平的点数更少)?

你可以计算你的函数的导数(或用(f(x + h)-f(x))/ h和h小近似该导数,并用这个导数确定两个连续点之间的步长