所以我有一个有界平面(X轴范围0-1000,Y轴范围0-2000) 其中有多个点(x,y)和一个矩形(4个点构成矩形)。有些点在矩形中,有些则不在。像这样:
矩形能够移动并随时间改变它的大小。而积分是静态的,不会改变。我需要检查矩形变化后的哪些点。
问题:
给一个矩形,里面有什么点?
Set<Point> getPointsInsideRectangle(Rectangle rec);
我天真的解决方案:
对于每一点
返回Point Set
我的想法:
似乎每次矩形变化时迭代所有点似乎都非常无效,CPU使用率很高(有很多点)。有些东西告诉我使用HashMap,但由于矩形是X范围和Y范围(而不仅仅是1个值),似乎我不能使用它。
我的问题:
1.是否有可以处理这种情况的java数据结构?
2.如果没有,关于如何实现包含所有点的数据结构并给出矩形的任何想法都会返回其中的点?
答案 0 :(得分:0)
只是一些随意的想法:
可以尝试为特定范围创建某种容器,例如x从0到100,y从0到100 l,并重复使用更多容器,如x从100到200,y从0到100等,并添加你指向他们所属的地方。 像
这样的东西Class Container
{
Int minX;
Int maxX
Int minY;
Int maxY;
List<Point> points;
Check(int x, int y)
(
return x >= minX && x <= maxX && y >= minY && y <= maxY;
)
}
让我们调用矩形A(左上),B(右上),C(右下)和D(左下)的4个点。
开始使用A.X和A.Y检查所有容器,然后将容器的默认范围添加到A.X并再次检查所有尚未包含在您边界内的容器。重复直到小于B.X的默认范围,然后添加左边的内容。
与A.X和A.Y相同,D.X和D.Y,Y减少了默认的容器范围,依此类推...... ..
甚至可以创建包含容器的容器来进一步缩小比较量。
这样,您可以检查与矩形重叠的容器,并比较这些容器中的点。
甚至可以使用多线程来检查容器。
(抱歉编辑错误,我在手机上)
修改强> 现在我重读了这篇文章,我认为这可能导致一种树形结构
<强>更新强> 树似乎是正确的选择:Range Tree (Wikipedia)
示例实施:Java Range tree example ( by Robert Sedgewick and Kevin Wayne. )
答案 1 :(得分:0)
答案 2 :(得分:0)
答案 3 :(得分:0)
如前所述,空间索引有很多数据结构:
您必须在索引上执行窗口查询(有时称为矩形查询或范围查询),其中查询矩形将完全是您的移动矩形。
如果您正在寻找此类空间数据结构的各种实现,请查看http://example.com/Api/Image/Index(R * Tree,quadtrees,STR-loaded R-Tree),或者查看here ,它类似于四叉树,但更有效,而且固有的深度有限。