2010-07-26 49 views
6

我一直在使用Incanter来满足我的图形需求,这对我以前的需求来说已经足够,但速度很慢。快速图形库

现在我需要在JPanel中嵌入一个图。用户需要通过拖动和点击来与图表交互(例如点击程序需要接收和处理的某些点)。放大出局也是必须的。

我听说过有关其他SO讨论的JFreeChart,但我看到Incanter使用它作为图形引擎,而且它看起来有点慢。它实际上速度很快,但也许Incanter正在做的事情会减慢速度?

我正在绘制200万点(简单的xy-plots,真的),虽然通常会减少图形。使用Matlab,这是在几秒钟内绘制的,但Incanter可以挂几分钟。

那么JFreeChart的路要走吗?还是别的,给我的需求?

(同时,也必须是免费的,因为它是用于研究。)

+1

替代JFreeChart:http:// java- source.net/open-source/charting-and-reporting – h3xStream 2010-07-26 17:17:25

回答

5

不幸的是,通用的图形解决方案可能不会很好地扩展至2万点 - 这足够大,你将需要如果您想要交互式性能,那么就是专门的东西

我可以看到几个明智的选择:

  • 写您自己定制的“绘图”,即绘制大量的点进行优化的功能。你必须测试它,但我想你可能只是通过使用setRGB直接将点写入BufferedImage来获得所需的性能。如果仍然不够快,可以将这些点直接写入一个字节数组并构造一个MemoryImageSource。

  • 排除积分,以便您只绘制例如最多10,000点。只要你真的关心散点图的整体形状而不是个别点,这可能是完全可以接受的。

  • 将所有点预呈现为例如一个大的BufferedImage然后允许用户放大和缩小/与这个静态图像进行交互。你可能会“破解”JFreeChart来做到这一点。

  • 如果OpenGL是一个选项(将需要本地代码+起床一个陡峭的学习曲线!),然后将所有点放在一个大顶点阵列中,并让显卡完成这一切。将会毫无困难地实时处理200万个点。

+0

感谢您的建议:我可能会考虑使用OpenGL,或者在特定时间只绘制尽可能多的点数,但MatLab似乎要处理1-2百分点相当不错 - 这是在一个旧的,蹩脚的戴尔 – Isaac 2010-07-27 15:20:20

+0

你可以减少任意点的数量,同时使用Douglas-Peucker算法保持整体形状:http://en.wikipedia.org/wiki/Ramer- Douglas-Peucker_algorithm – sanityinc 2010-07-28 12:39:12

+0

@Isaac - 我期待MatLab内部使用类似我提到过的方法之一。 – mikera 2010-07-28 17:40:02

1

MathGL是快速和免费的(GPL)绘图库。但我从来没有测试它的java接口(基于swig),因为我不熟悉java :(所以,如果有人可以帮助测试,那么我会很感激