Java 确定离鼠标最近的元素最有效的方法是什么?

Java 确定离鼠标最近的元素最有效的方法是什么?,java,graph,mouselistener,Java,Graph,Mouselistener,我目前正在从事一个pet项目,该项目允许用户用Java在屏幕上创建图形(顶点/边)。我将顶点实现为JComponents,但将边实现为Line2D。当用户在画布上移动鼠标时,如果在某个接近某条边(或Line2D)的阈值范围内,则该边(最靠近鼠标的边)将高亮显示 我的问题是如何实现哪条边最靠近鼠标。现在我有一个鼠标听筒,可以检测运动;每次移动鼠标时,我的程序都会遍历所有的线(边),并使用Line2D的ptDistSeg()函数确定最近的线。如果该值在阈值范围内,则会亮显该值(在Paint Comp

我目前正在从事一个pet项目,该项目允许用户用Java在屏幕上创建图形(顶点/边)。我将顶点实现为JComponents,但将边实现为Line2D。当用户在画布上移动鼠标时,如果在某个接近某条边(或Line2D)的阈值范围内,则该边(最靠近鼠标的边)将高亮显示

我的问题是如何实现哪条边最靠近鼠标。现在我有一个鼠标听筒,可以检测运动;每次移动鼠标时,我的程序都会遍历所有的线(边),并使用Line2D的ptDistSeg()函数确定最近的线。如果该值在阈值范围内,则会亮显该值(在Paint Component中使用较粗的笔划)

对我来说,这似乎非常低效,因为每次移动鼠标时,它都必须重新计算距离鼠标的所有边距离。对于顶点,这不是问题,因为鼠标侦听器与每个顶点关联,因此顶点知道何时需要处理事件。不幸的是,我不能用边来做这件事,因为它们被表示为Line2D,不能实现鼠标侦听器

那么,有没有更有效的方法来找到最近的边,或者我应该以不同的方式实现这些边


谢谢。

可能有更好的数据结构,但其中一个选项是计算每条边的轴对齐边界框,以获得每条边的一个矩形,然后将所有这些矩形存储在空间数据结构中,如。R-树支持“给我所有与某个点重叠的矩形”形式的高效查询,因此您可以使用该查询将所有线段过滤到可能触及鼠标点的线段,然后对其进行测试

这里的缺点是,由于更改边界框的成本,移动节点将需要大量的R树重建,并且您需要找到一个好的R树库,因为R树不太容易从头开始实现


希望这有帮助

您是否真的看到了性能问题,或者这纯粹是理论问题?该程序似乎处理得很好。当我有大量的边(如26个顶点上的完整图形)时,它会滞后(当然),但不会过度滞后。我只是想让它现在尽可能的高效,而不是让它成为程序未来的一个问题。这似乎可以通过游戏中的碰撞检测技术来解决。您可以将几何图形存储在专门的数据结构(如四叉树)中,并获得比完整线性搜索更好的性能。我快速浏览了四叉树上的wiki,它看起来非常有趣。谢谢你的回复,我会更详细地看它们(和你说的碰撞检测)。非常感谢!我根本就没有想到过包围盒,这是我不知道的事情。我做这个项目的原因是学习处理这些问题的新数据结构。我一定会去看看R树。再次感谢。