我有一个点[xmin,ymin,xmax,ymax]的列表,每个点都按黑点显示
请注意,有许多这样的矩形,如图像所示。红色的应检测删除,绿色的应保留。
输入是 n 矩形 输出是覆盖区域和它覆盖的矩形 id 。最好给出一些算法和解释。
这不是一个答案,只是一个暗示:
您可能会发现四叉树空间细分数据结构非常有用。如果布置得好,那么你可以大大减少碰撞检测的数量。
这种结构被各种2D精灵引擎在旧的街机视频游戏机中使用,它在图形方面也有其他应用。
您的问题看起来就像搜索高效的2D sprite引擎。在电子游戏中,点集经常变化(精灵到处飞),因此算法必须快速。
如果你的任务可以简化为这个问题,那么你应该能够找到许多不同语言的现有代码。
假设矩形列表是< code>L,最后只有绿色矩形的列表是< code>G。可以将矩形一个接一个地添加到G中。每次添加之前,都会对照< code>G中的列表进行检查。如果它与其中一个重叠,比较它们的大小(面积)。如果它大于列表中的值,则替换它,否则不添加到< code>G中。
< code>G永远不会有两个重叠的矩形(这是算法不变量)。这样,您只需检查那些最终出现在最终列表中的候选人。
如果矩形有随机重叠,这肯定比O(n^2)好。但最坏的情况仍然是O(n^2)-当<code>L<code>中的所有输入矩形都不重叠时。在这种情况下,每个重叠检查都是O(n)操作。
但是可以优化重叠检查。通过维护基于X和Y的点的排序列表,可以仅对最接近矩形的xmin、xmax、ymin和ymax的点进行重叠检查。我认为这有点棘手,尤其是当新矩形仅部分重叠或与多个矩形重叠时。但这是可以做到的。
在任何情况下,重叠检查都可以在一定程度上加速,不必针对< code>G中的所有矩形。我无法量化它,但如果做得正确,我相信,它可以在O(nlogn)中完成。
给定两个矩形的边的长度,我必须编写代码来检查第一个矩形是否可以被第二个矩形完全覆盖。只能旋转第二个矩形,看看它是否可以覆盖第一个矩形。 A和B是第一个矩形的边的长度,我们要覆盖的那个,C和D是第二个矩形的边的长度,它将覆盖第一个。 我尝试了两种代码,但仍然不起作用。第一个是天真的解决方案,但我不知道它是否正确。 然后我用我的数学技巧找出第二个矩形(和)的边应该
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 第2*n个矩形的覆盖方法等于第2*(n-1)加上第2*(n-2)的方法。 f = lambda n: 1 if n < 2 else f(n - 1) + f(n - 2)
题目链接 NowCoder 题目描述 我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法? 解题思路 当 n 为 1 时,只有一种覆盖方法: 当 n 为 2 时,有两种覆盖方法: 要覆盖 2*n 的大矩形,可以先覆盖 2*1 的矩形,再覆盖 2*(n-1) 的矩形;或者先覆盖 2*2 的矩形,再覆盖 2*(
假设我有一组矩形(维度不同或相同)。 任务是从集合中查找(并删除)大于或等于给定矩形的矩形 它也应该是集合中可以包含给定矩形的最小矩形 这很容易通过线性搜索/更新在O(n)时间内解决,但是有可能获得更好的结果吗?我认为O(log n)是最佳值。Insert和removal也必须比O(n)快,这样在我的例子中才有用。 是否可以通过不找到最佳矩形来制定任何快捷方式,而是将第二个限制放宽为:“它也应该是
在上面的图片中,我展示了两个矩形 矩形1,其x可以从-900到13700不等,Y可以从-600到6458 矩形2,其坐标X可以从0到3000变化,而y可以从0到2000变化 同样:矩形2的起点位于左上角位置(0,0),而矩形1的起点位于左上角位置(宽度/2,高度/2)。 我需要做的是:使用缩放或平移将矩形1的点转换为矩形2的点。 那么,为了将矩形1的坐标转换为矩形2的坐标,< code>x和< c
我有两个矩形:红色和绿色。对于它们中的每一个,我有以下信息: 中心点( 和 坐标)。 旋转角度 宽度和高度 矩形将始终以正坐标移动。编辑:没有坐标可以是负的:矩形总是位于正坐标。因此,中心永远不会是(0,0)。 问题 我有一个起始位置。为了简化示例,假设我的红色和绿色矩形的位置如下: 现在,我使用0º和90º之间的角度φ旋转红色矩形。但是,绿色矩形需要旋转并保持其相对于红色矩形的位置。绿色矩形不仅