2010-08-11 118 views
3

我已經在Clojure/Java中使用drawLine()在修改的JPanel的圖形上下文中編寫了一些基本的圖形軟件。繪圖本身很好,但我試圖將點擊的像素轉換爲最近的數據點時陷入了僵局。將像素映射到數據

我有一個簡單的雙射線之間的所有像素的列表標記我的線的終點和我的實際原始數據。我需要的是我的圖形窗口中的所有像素(比如說,1200x600像素)對像素列表中的像素的投影,給我一個從那個到我的實際數據點的簡單映射。

例如

<x,y>(px) ----> <~x,~y>(pixel points) ----> <x,y>(data) 

這是我現在想象它的情況:

  • 像素點擊主圖形窗口和的MouseListener捕獲的事件,可以讓我的的<x,y>座標行動。

  • 該信息被傳遞給一個函數,該函數返回一個謂詞,該謂詞決定傳遞給它的值是否「足夠好」,並使用該pred過濾列表,並獲取第一個值。

    • 可能,而不是一個謂詞,它返回它經過的像素點的列表的功能,並返回元組(x index)的列表,它表示點有多好與x幅度,並在該點與index。我會用x點和y點來做到這一點。然後,我通過篩選並找到最大x的那個,並將其作爲最有可能成爲用戶意義的那一點。

對於這個問題,這些合理的解決辦法?看來,解決方案涉及信心評級(可能距pix-pt的距離)可能太重,而且如果我將所有的點再次放在內存中,則會佔用很多內存。另一個解決方案只使用謂詞,似乎並不總是準確的。

這是一個解決問題,因爲其它的繪圖庫的顯示,但它很難找到關於它的其他信息相比,在這些程序的來源,我們有了一個更好的辦法,然後挖通成千上萬的Java線路發現了這一點。

我正在尋找更好的解決方案,或只是一般指針和我提供的建議,如果可能的話。

回答

1

所以我猜想像JFreeChart只是沒有削減它爲您的應用程序?如果你還沒有走下那條路,我建議在試圖推出自己的產品之前檢查一下。

無論如何,如果您正在尋找與鼠標事件最近的點,請獲取點數最少爲Euclidean distance(如果它低於某個閾值),並展示給用戶最可預測的行爲。缺點是大數據集的歐幾里德距離相對較慢。您可以使用像忽略平方根或BSP trees這樣的技巧來加速它。但是,如果這些優化甚至需要真正取決於您使用的數據點數。在進入優化模式之前,在一個典型的案例中描述一個有點天真的解決方案

+0

的JFreeChart會一直補充說,我不想處理了一層複雜性,但大多是太慢了。我每秒重繪數千個點。歐幾里德距離是有意義的;它本質上就是我現在正在玩弄的東西,但是將它改造成方法sqrt(sq xdiff)(sq ydiff)是很有幫助的。謝謝! – Isaac 2010-08-11 14:21:31

+0

@Isaac:哇。所以你實際上每秒重複繪製所有這些點數?如果你還沒有使用加速表面,可能值得考慮。 另外:如果你正在尋找千分之一的點,並且想要一個交互式響應,那麼像BSP樹這樣的空間優化將成爲必然。寫作也會很糟糕。儘管如此,BSP確實並行。 在深入研究解決方案時,請保持更新。我對你最終結果感興趣。 – 2010-08-11 14:44:23

+0

感謝您的提示:加速表面;當我在加速繪圖時,我可能會看一看。現在,這不是一個太大的問題。我通常不會每秒重繪數千點以上,這並不是很難處理。至於BSP,從維基百科的文章來看,這聽起來並不像他們特別適用:或許我錯過了什麼? – Isaac 2010-08-11 20:03:58

0

我認爲你的方法是體面的。這基本上只需要通過數據數組進行一次迭代,每一步都有一些簡單的數學計算和分配,所以應該非常快。

除非您開始使用某種形式的空間分區方案(如四叉樹),否則這可能與您將要獲得的一樣好,如果您的數據數組非常大,那麼這樣做纔有意義。

一些Clojure的代碼,可以幫助:

(defn squared-distance [x y point] 
    (let [dx (- x (.x point)) 
     dy (- y (.y point))] 
    (+ (* dx dx) (* dy dy)))) 

(defn closest 
    ([x y points] 
    (let [v (first points)] 
     (closest x y (rest points) (squared-distance x y v) v))) 
    ([x y points bestdist best] 
    (if (empty? points) 
     best 
     (let [v (first points) 
      dist (squared-distance x y v)] 
     (if (< dist bestdist) 
      (recur x y (rest points) dist v) 
      (recur x y (rest points) bestdist best)))))) 
+0

謝謝!在這種情況下,距離對我來說工作不太好,但空間分區可能 - 我會研究它。 – Isaac 2010-08-13 14:34:47