将彼此靠近的点分组

7

我有一些浮点坐标的二维点(x,y),当我绘制它们时,需要根据一个固定大小的矩形将靠近彼此的点分组。问题是这些矩形不应相交且所有相邻的点都应该被分组。
如果你身边有一张纸,可以画一个大矩形,比如4*5cm - 所有点所在的区域。现在随机放置点,如果两个点之间的距离为1厘米,则它们应该被分组到一个2*3的矩形中。

我找不到如何实现它的算法,并且性能也很重要... 我查找了嵌套、聚类等算法,但我需要的有点不同。顺便说一句,如果有些分组矩形必须超出公共区域以符合条件,那就让它存在吧,这不是问题。例如,你有一个4*5的区域和一些点。

(1,0), (2,1), (4,1), (4,3), (2,4) 

那么结果应该像这样:矩形(0,0-3,2)和(3,1-6,3),还有一个剩下的点(2,4),因为所有其他点都被分组了,而此点现在没有任何邻居。
我的点坐标不是整数,而是浮点数,点的数量可以达到几百个(多达500个)。我不想将区域分成相同的矩形,只是计算有多少点在其中。我的意思是,例如上面的例子中,我可以制作矩形(0,0-3,2),(3,0-6,2),(0,3-3,6),(3,3-6,6),并总结第一个矩形的2个点,第二个矩形的1个点(!)表示保持原样,第三个矩形的1个点和第4个矩形的1个点=>将绘制一个矩形和所有其他点=>根据任务得出错误的结果。 有什么想法吗?至少哪些算法可能有帮助,去哪里寻找...

P.S. 目前结果中的组/点数并不重要,即上面的另一个允许的结果可能是(1,0-4,2)和(2,2-5,4)矩形,没有剩余的点。


那么,你可以使用的矩形的尺寸是固定的,并且它是轴对齐的?我想你想要最小化留下的点的数量,对吗? - Jacob
是的,尺寸是固定的(xy),我无法旋转它们(xy意味着xy,我不能将它们切换成yx),并且它们是轴对齐的。目前不考虑最小化。结果只需不包含距离给定值以下的另一点更近的点,就可以了。 - Maxym
它必须是矩形和准确的吗?您可以使用类似k均值聚类的东西:http://jsfiddle.net/8NpNp/2/ - david
你为什么没有在问题中放置一张图片?这里有示例! - Bitterblue
1个回答

1
一般问题是"最近邻居"搜索。解决方案在计算上很困难(时间复杂度)。对于人类来说,这是一个相当简单的任务,但在计算上并不容易。

现在我在用矩形覆盖点的问题上遇到了更多困难 :) 假设我知道所有需要分组的点集,如何将矩形放置在它们上面,以确保所有矩形不会相互交叉... - Maxym
1
我正在挑战我对空间划分算法的知识极限,但似乎kd树旨在缓解搜索重叠区域的O(n^2)痛苦。事实上,如果您使用kd树来划分原始点集,则非重叠矩形将是结果的不变属性。http://en.wikipedia.org/wiki/Kd_tree - msw
也许,也许……但我担心当我们拥有比维基示例更多的数据,并考虑到我用来覆盖它们的矩形的大小时,它就不起作用了。我必须再考虑一下。是的,分解关心重叠,但通常分解不关心矩形的大小——这就是为什么我不确定的原因。但值得思考。谢谢你的指出。 - Maxym

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接