2010-07-26 97 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 :(所以,如果有人可以幫助測試,那麼我會很感激