我在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来找到它。
如果可能的话,我正在寻找更好的解决方案,或者只是我提供的一般指示和建议。
答案 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))))))