我已经在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线路发现了这一点。
我正在寻找更好的解决方案,或只是一般指针和我提供的建议,如果可能的话。
的JFreeChart会一直补充说,我不想处理了一层复杂性,但大多是太慢了。我每秒重绘数千个点。欧几里德距离是有意义的;它本质上就是我现在正在玩弄的东西,但是将它改造成方法sqrt(sq xdiff)(sq ydiff)是很有帮助的。谢谢! – Isaac 2010-08-11 14:21:31
@Isaac:哇。所以你实际上每秒重复绘制所有这些点数?如果你还没有使用加速表面,可能值得考虑。 另外:如果你正在寻找千分之一的点,并且想要一个交互式响应,那么像BSP树这样的空间优化将成为必然。写作也会很糟糕。尽管如此,BSP确实并行。 在深入研究解决方案时,请保持更新。我对你最终结果感兴趣。 – 2010-08-11 14:44:23
感谢您的提示:加速表面;当我在加速绘图时,我可能会看一看。现在,这不是一个太大的问题。我通常不会每秒重绘数千点以上,这并不是很难处理。至于BSP,从维基百科的文章来看,这听起来并不像他们特别适用:或许我错过了什么? – Isaac 2010-08-11 20:03:58