检测图中的奇点

时间:2010-03-07 19:06:43

标签: java algorithm math graphics graph

我在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.98x = 2.04 ,在这个等式中完全有效。例如:

Bag Asymptote http://content.imagesocket.com/images/bad_linef6e.png

在这种情况下,我增加了左右一个单位的窗口。

我的问题是:有没有办法使用这种缩放方法来处理奇点,以便生成的线在数学上看起来正确?

我自己曾想过实现二元搜索式方法,如果它发现它计算了一个点,然后下一个点离最后一个点很远,它会在这些点之间搜索一个域错误。然而,我无法弄清楚如何让它在实践中发挥作用。

感谢您提供任何帮助!

4 个答案:

答案 0 :(得分:2)

您可以使用区间运算(http://en.wikipedia.org/wiki/Interval_arithmetic)并计算每个区间[x(i),x(i + 1)]上的函数区间。如果结果间隔是无限的,则跳过该线段。速度方面,这应该只比评估功能慢几倍。

答案 1 :(得分:1)

我认为你大部分时间都在正确的轨道上。

  1. 我认为图2在数学上不正确。
  2. 对于奖励积分,您应该有一个例程来检查两个连续值y1和amp;之间的差异。 y2,如果它大于阈值,则在y1和y2之间插入更多的点,直到没有diff大于阈值。如果此迭代rountine在10次迭代之后无法离开while循环,则表示存在奇点,并且可以删除y1和y2之间的绘图。那将给你图1。

答案 2 :(得分:1)

我终于想出了一种方法,可以正确地绘制奇点。

基本上我所做的是图表上的每个点,我检查它是否在可见的图形剪辑中。如果我点击图表上可见剪辑之外的点,我会在剪辑外面绘制第一个点,然后在此之后停止绘制任何不可见点。

我继续计算点并检查它们是否在可见剪辑内,而不是绘制剪辑外部的点。一旦我再次触及剪辑内的点,我会在之前绘制点,然后绘制当前点的图形。

我一直这样做,直到我画出整条线。这就产生了一种错觉,即当只有可见部分时,整条线就开始绘制。

如果窗口很大并且实际图形大小(以像素为单位)很小,这将不起作用,但它对我来说就足够了。

答案 3 :(得分:0)

如果morpehus的解决方案对你来说太慢,你可以考虑两个连续函数值之间跳跃的所有绝对值,并尝试识别大outliers - 这些将是无限跳跃。

如果您决定尝试此操作并需要帮助,请在此处发表评论。