2010-08-11 120 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