我目前正致力于一个允许用户在Java中在屏幕上创建图形(顶点/边)的宠物项目。我将顶点实现为JComponents但我将边缘实现为Line2D。当用户在画布上移动鼠标时,如果它在某个边缘(或Line2D)附近的某个阈值内,则该边缘(最靠近鼠标)会突出显示。
我的问题涉及我实现哪个边最接近鼠标的方式。现在我有一个检测运动的mouselistener;每次移动鼠标时,程序都会遍历所有行(边)并使用Line2D的ptDistSeg()函数确定最接近的行。如果这在阈值范围内,则会突出显示(使用paintcomponent中较粗的笔划)。
对我而言,这似乎非常低效,因为它必须在每次移动时重新计算鼠标的所有边缘距离。对于顶点,这不是问题,因为mouselisteners与每个顶点相关联,因此顶点知道它们何时需要处理事件。不幸的是我不能用边缘来做这个,因为它们被表示为Line2D,它们无法实现mouseListener。
那么有更有效的方法来找到最近的边缘,还是应该以不同的方式实现边缘?
感谢。
答案 0 :(得分:2)
这可能是一个更好的数据结构,但有一个选择是计算每个边的轴对齐边界框以获得每个边的一个矩形,然后将所有这些矩形存储在像R-tree这样的空间数据结构。 R-tree支持对表单进行有效查询"给我所有矩形重叠某些点,"所以你可以使用它来将所有线段过滤掉那些可能会触及鼠标点的线段,然后再测试它们。
这里的缺点是移动节点需要大量的R树重建,因为更改边界框的成本以及你需要找到一个好的R树库,因为R-trees从头开始实施起来并不容易。
希望这有帮助!