题
我已经写了一些基本的制图软件和/Java使用 drawLine()
在图形方面的修改JPanel.绘图本身工作很好,但我已经来到一个僵局,同时试图转换击素最近的数据点。
我有一个简单的双向映射列表之间的所有像素,标志着结束点,我和我的实际原始数据。我需要的是一个surjection从所有像素(说,1200x600px2)我的图形窗口素在我的像素清单,给我一个微不足道的映射从我的实际上的数据点。
例如
<x,y>(px) ----> <~x,~y>(pixel points) ----> <x,y>(data)
这种情况,作为我想象它现在:
一个象素点击,在主要的图形窗口,并MouseListener抓住这一事件,并给我的
<x,y>
坐标的行动。这一信息被传递到一个函数,返回一个判断而确定是否有价值的传递给它的"足够好的",而虽然过滤器清单与pred,采取的第一个价值okays.
- 可能的话,而不是一个判断,它返回其功能是通过列表的象素点,返回一个单元组
(x index)
它指出如何良好点是与大小的x
, ,并在这一点上是有index
.我这样做有两个x点和y点。然后我虽然过滤器,并发现一个具有最大的x,并采取一个要点,它是最有可能是一个用户的意思。
- 可能的话,而不是一个判断,它返回其功能是通过列表的象素点,返回一个单元组
这些是合理的这个问题的解决方案?它似乎是解决方案,它涉及信评级(距离pix-pt,也许)可能过处理重,和一位记忆沉重,如果我保持你所有的点记忆。其他解决方案,只使用语,似乎并不喜欢它们总是准确的。
这是一个 解决了 问题,作为其他制图库所显示的,但很难找到相关信息的来源,这些节目,并有一个更好的方法,然后挖通过的成千上万的行Java找到了这一点。
我在寻找更好的解决方案,或者只是一般指针和建议那些我已经提供,如果可能的话。
解决方案
所以我猜喜欢的东西 JFreeChart 只是不切对于你的程序?如果你还没有走上了这条路然而,我会检查出来之前试图滚你自己的。
无论如何,如果你想寻找最近的点到老鼠的事件,获取点,与最低 欧几里德距离 (如果它的下一阈值)和介绍,将得到最可预测的行为。其缺点是欧几里德距离相对较慢的大数据集。你可以使用的技巧喜欢忽视的平方根 BSP树 为加速这一点。但是,如果这些优化,甚至是必要的实际上取决于许多数据点,你的工作。档案有点天真的解决方案中的一个典型的情况下,在进入最优化模式。
其他提示
我想你的做法是不错的。这基本上只需要一个迭代过你的阵列数据,一点点的简单的数学和没有拨款在每一个步骤,因此应该非常迅速。
它可能不如你去除非你开始采用某种形式的空间划分的方案喜欢一个叉树,这将只有真正意义,如果你的阵列数据是非常大的。
一些质量的技术资源码这可能会有所帮助:
(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))))))