我在Java中创建一个图形计算器作为我的编程类的项目。这个计算器有两个主要组成部分:绘制线条的图形本身和方程式评估器,它将方程式作为String
并且......好吧,对它进行评估。
要创建该行,我创建一个Path2D.Double
实例,并遍历该行上的点。为此,我计算了图表宽度的多个点(例如,如果图形本身是500px宽,我计算500点),然后将其缩放到图形窗口。
现在,这适用于大多数线路。但是,在处理singularities时没有。
如果在计算点时,图形遇到域错误(例如1/0),图形将关闭Path2D.Double
实例中的形状并开始一条新线,以使该线在数学上看起来正确。例如:
Good Asymptote http://content.imagesocket.com/images/good_line7cd.png
然而,由于它的缩放方式,有时它被正确渲染,有时它不是。如果不是,则显示实际的渐近线,因为在这500个点内,它跳过等式x = 2.0
中的1 / (x-2)
,并且仅x = 1.98
和x = 2.04
,在这个等式中完全有效。例如:
Bag Asymptote http://content.imagesocket.com/images/bad_linef6e.png
在这种情况下,我增加了左右一个单位的窗口。
我的问题是:有没有办法使用这种缩放方法来处理奇点,以便生成的线在数学上看起来正确?
我自己曾想过实现二元搜索式方法,如果它发现它计算了一个点,然后下一个点离最后一个点很远,它会在这些点之间搜索一个域错误。然而,我无法弄清楚如何让它在实践中发挥作用。
感谢您提供任何帮助!
答案 0 :(得分:2)
您可以使用区间运算(http://en.wikipedia.org/wiki/Interval_arithmetic)并计算每个区间[x(i),x(i + 1)]上的函数区间。如果结果间隔是无限的,则跳过该线段。速度方面,这应该只比评估功能慢几倍。
答案 1 :(得分:1)
我认为你大部分时间都在正确的轨道上。
答案 2 :(得分:1)
我终于想出了一种方法,可以正确地绘制奇点。
基本上我所做的是图表上的每个点,我检查它是否在可见的图形剪辑中。如果我点击图表上可见剪辑之外的点,我会在剪辑外面绘制第一个点,然后在此之后停止绘制任何不可见点。
我继续计算点并检查它们是否在可见剪辑内,而不是绘制剪辑外部的点。一旦我再次触及剪辑内的点,我会在之前绘制点,然后绘制当前点的图形。
我一直这样做,直到我画出整条线。这就产生了一种错觉,即当只有可见部分时,整条线就开始绘制。
如果窗口很大并且实际图形大小(以像素为单位)很小,这将不起作用,但它对我来说就足够了。
答案 3 :(得分:0)
如果morpehus的解决方案对你来说太慢,你可以考虑两个连续函数值之间跳跃的所有绝对值,并尝试识别大outliers - 这些将是无限跳跃。
如果您决定尝试此操作并需要帮助,请在此处发表评论。