将像素映射到数据

时间:2010-08-11 13:25:32

标签: java plot clojure graphing

我在Clojure / Java中使用drawLine()在修改过的JPanel的图形上下文中编写了一些基本的图形软件。绘图本身运行良好,但在尝试将点击的像素转换为最近的数据点时,我陷入了僵局。

我在所有像素列表之间有一个简单的双射,它标记了我的行的终点和我的实际原始数据。我需要的是从我的图形窗口的所有像素(例如,1200x600 px 2 )到我的像素列表中的像素的投射,给我一个简单的映射,从那里到我的实际数据点。

e.g。

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

这就是我现在想象的情况:

  • 在主图形窗口中单击一个像素,MouseListener捕获该事件并为我提供动作的<x,y>坐标。

  • 该信息被传递给一个函数,该函数返回一个谓词,该谓词确定传递给它的值是否“足够好”,并通过带有该pred的列表进行过滤,并取第一个值。

    • 可能代替谓词,它返回一个传递像素点列表的函数,并返回一个元组列表(x index),表示该点的大小为{{1这个点与x的关系。我用x点和y点都这样做。然后我过滤了那个并找到了一个带有max x的那个,并把那一个作为最有可能是用户意味着的点。

这些问题的合理解决方案是什么?似乎涉及置信度等级的解决方案(可能与pix-pt的距离)可能太重,如果我再次将所有点保持在内存中,那么内存就会很重。另一种解决方案,仅使用谓词,似乎并不总是准确的。

这是一个已解决的问题,正如其他图形库所示,但除了某些程序的来源之外,很难找到有关它的信息,并且必须有更好的方法然后挖掘成千上万行的Java来找到它。

如果可能的话,我正在寻找更好的解决方案,或者只是我提供的一般指示和建议。

2 个答案:

答案 0 :(得分:1)

所以我猜测JFreeChart之类的东西只是没有为你的应用程序削减它?如果你还没有沿着这条路走下去,我建议你先试一下自己的路。

无论如何,如果你正在寻找最接近鼠标事件的点,那么获得最小Euclidean distance点(如果它低于某个阈值)并且呈现该点将为用户提供最可预测的行为。缺点是欧几里德距离对于大型数据集来说相对较慢。您可以使用忽略平方根或BSP trees等技巧来加快速度。但是,如果这些优化甚至是必要的,那么实际上取决于您正在使用的数据点数。在进入优化模式之前,在典型案例中描述一些有点天真的解决方案。

答案 1 :(得分: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))))))