我正在使用 java2d 绘制一个简单的图形,此时我通过为每个对象/形状调用 contains(MousePoint) 来实现拾取,这有效但线性缩放。
有没有更有效的方法在 java2d 中进行挑选?
是的,虽然完整的答案对于这个空间来说太长了。
首先,除非您有很多节点,否则线性很可能会很好,除非性能已经受到影响,否则您不应更改任何内容。
其次,一般来说,您想要的是应用某种层次分解,例如四叉树。这是一种在所谓的“广泛阶段”中使用更多内存(以及更多时间,在搜索期间摊销)来消除考虑项目的方法。在网络上进行一些努力会有所帮助,Christer Ericson的“实时碰撞检测”一书也会有所帮助。
只要您只选择区域形状(矩形、圆形),它就应该与 contains() 方法一起使用。只有一个陷阱,以防万一您有重叠的形状并且您指向一个形状实际上重叠的地方。但这是一个要求的问题,您是否要选择所有形状、顶部的形状或您在收藏中找到的第一个形状。
如果您想选择 Line2D 类型的形状,contains() 方法将不起作用。它们没有区域,因此 contains() 方法总是返回 false。但是对于这个问题已经有了解决方案。