- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一组矩形,我想“减少”这组,这样我就可以使用最少数量的矩形来描述与原始组相同的区域。如果可能的话,我希望它也快,但我更关心的是尽可能减少矩形的数量。我现在有一种在大多数情况下都有效的方法。
目前,我从最左上角的矩形开始,看看能否在保持矩形不变的情况下向右和向下扩展它。我这样做直到它不能再扩展,删除并拆分所有相交的矩形,然后将扩展的矩形添加回列表中。然后我用下一个最左上角的矩形再次开始这个过程,依此类推。但在某些情况下,它不起作用。例如:
对于这组三个矩形,正确的解决方案将以两个矩形结束,如下所示:
但是,在这种情况下,我的算法从处理蓝色矩形开始。这会向下扩展并拆分黄色矩形(正确)。但是当黄色矩形的剩余部分被处理时,它不是向下扩展,而是先向右扩展并收回之前拆分的部分。然后处理完最后一个矩形,不能向右扩展也不能向下扩展,所以就剩下原来的一组矩形。我可以调整算法先向下扩展然后向右扩展。这会解决这个问题,但它会在翻转的类似场景中导致同样的问题。
编辑:澄清一下,原来的矩形集不重叠,也不必连接。如果矩形的子集相连,则完全覆盖它们的多边形可能会有洞。
最佳答案
尽管您的问题标题如此,但我认为您实际上是在寻找直线多边形矩形的最小剖分。 (Jason 的链接是关于矩形的最小覆盖,这是一个完全不同的问题。)
David Eppstein在他 2010 年调查文章的第 3 节中讨论了这个问题 Graph-Theoretic Solutions to Computational Geometry Problems ,他在 this answer on mathoverflow.net 中给出了很好的总结:
The idea is to find the maximum number of disjoint axis-parallel diagonals that have two concave vertices as endpoints, split along those, and then form one more split for each remaining concave vertex. To find the maximum number of disjoint axis-parallel diagonals, form the intersection graph of the diagonals; this graph is bipartite so its maximum independent set can be found in polynomial time by graph matching techniques.
以下是我对这个令人赞叹的简洁描述的注释,使用的是 Eppstein 文章中的图 2。假设我们有一个直线多边形,可能有孔。
当多边形被分割成矩形时,每个凹顶点必须与分割的至少一条边相交。因此,如果尽可能多的这些边执行双重任务,即它们连接两个凹顶点,我们将得到最小解剖。
因此,让我们在完全包含在多边形内的两个凹顶点之间绘制轴平行对角线。 (“轴平行”在这里表示“水平或垂直”,diagonal of a polygon 是连接两个不相邻顶点的线。)我们希望在解剖中尽可能多地使用这些线,只要它们不t相交。
(如果没有轴平行对角线,剖分很简单——只需从每个凹顶点切开。或者如果轴平行对角线之间没有交点,那么我们将全部使用它们,再加上每个凹顶点的切开剩下的凹顶点。否则,请继续阅读。)
intersection graph一组线段的每个线段都有一个节点,如果线交叉,则边连接两个节点。这是轴平行对角线的交点图:
是 bipartite一部分是垂直对角线,另一部分是水平对角线。现在,我们要选择尽可能多的对角线,只要它们不相交即可。这对应于查找 maximum independent set在交叉图中。
在一般图中寻找最大独立集是一个 NP-hard 问题,但在二部图的特殊情况下,König’s theorem表明它等同于寻找最大匹配的问题,可以在多项式时间内解决,例如 Hopcroft–Karp algorithm .一个给定的图可以有多个最大匹配,但它们中的任何一个都可以,因为它们都具有相同的大小。在示例中,所有最大匹配都有三对顶点,例如{(2, 4), (6, 3), (7, 8)}:
(此图中的其他最大匹配包括 {(1, 3), (2, 5), (7, 8)};{(2, 4), (3, 6), (5, 7)} ; 和 {(1, 3), (2, 4), (7, 8)}.)
从一个最大匹配得到对应的minimum vertex cover , 应用 proof of König’s theorem .在上面显示的匹配中,左边的集合是 L = {1, 2, 6, 7},右边的集合是 R = {3, 4, 5, 8 },并且 L 中的不匹配顶点集是 U = {1}。在 U 中只有一条交替路径,即 1–3–6,因此交替路径中的顶点集为 Z = {1, 3, 6} 并且因此,最小顶点覆盖为 K = (L\Z) ∪ (R ∩ Z) = {2, 3, 7},如下图红色所示,最大独立集为绿色:
将其转化回解剖问题,这意味着我们可以在解剖中使用五个轴平行的对角线:
最后,从每个剩余的凹顶点进行切割以完成解剖:
关于找到最少的矩形以覆盖一组矩形而不重叠的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919298/
我对具有 2 个轴的数据有交叉识别问题,例如 A = array([['x0', 'y0', 'data0', 'data0'], ['x0', 'y0', 'data0', '
我知道这是代码有点傻,但有人可以解释为什么 isList [42]返回 True而isList2 [42]打印 False ,以及如何防止这种情况?我想更好地理解一些更晦涩的 GHC 类型扩展,我认为
我正在使用memmove(),但目标似乎正在覆盖源,或者也许我不明白覆盖是什么。我有一个 char 数组(目标),然后是一个指向目标的指针,该指针位于 vector 内部。 char destinat
以下AS3代码有时会导致音频多次播放,就像疯狂的回声一样,几乎同时播放。通常使用该URL都可以,但是当我使用https://soundcloud.com url时,它总是会发疯。在极少数情况下,我认为
我正在尝试在 android 2.2 中实现类似操作栏的东西。这是我的 main.xml
如何避免第一个值的重叠问题 而且,我怎样才能看到最后一个被剪裁的值? 最佳答案 我认为您在修改轴上的样式和调整视口(viewport)之间有几种选择。 我会尝试: 禁用左轴,启用右轴 chart.le
我正在构建一个简单的应用程序,您可以在其中使用纸娃娃之类的工具来描述您的外观。 Check out this image.计划是有 4 个水平 ScrollView :第一个用于发型,第二个用于面部毛
我有一个问题...我在绝对布局中有两个 ScrollView 。换句话说,它们是全屏的并且相互重叠 上面的scrollview是水平滚动的,下面的是垂直滚动的scrollview。 当我水平滚动时,我
我看了一些类似的问题,但我不太明白在我的层次结构中我应该做什么? 我有 用于屏幕底部的标签菜单 和 对于其他将创建的 fragment 。 我有 9 个标签菜单,每个都是 fragment 。 一
在我的 Android 应用程序中,我有一个编辑文本和一个按钮,单击该按钮会向我的主要 Activity 添加一个 fragment ,其中包含在我的编辑文本中写入的消息。问题是,当我更改消息并单击按
在我的分段控件中,有时标题比其段宽。我怎样才能让它截断? 假设第 1 段的标题是 Text overlaps,第 2 段的名称是 ok。 我希望它看起来如何: [Text ov...| ok
我想创建一个带有重叠单元格的 uitableview,如下图所示。问题是,即使我为单元格的内容 View 设置 clipsToBounds = NO,单元格假标题(例如,将与前一个单元格重叠的西类牙语
有了这个CSS .addProblemClass{ width:300px; height:300px; /*width:25%; height:40%;*/
我有跨窗口移动的图像(2 行),当我离开页面选项卡时,然后返回它,所有图像都相互堆叠。 JS代码(记入jfriend00) function startMoving(img) { va
这是我的一段代码。图像在 23 毫秒后正常可见,但永远不会像第二行所示那样返回隐藏状态。如果我将其从 17 毫秒更改为大于 23 毫秒的值,它就会起作用。反之亦然,如果我将第一行更改为 16 毫秒,它
我正在可汗学院为学校项目编写一款太空入侵者游戏,但我不知道如何在子弹和外星人之间进行碰撞,然后摆脱子弹所碰撞的外星人。这是非常基本的 JS,尽管我尝试过,但我不太明白如何将有关该主题的其他答案放入我的
当我尝试重新加载 tableView 的数据时出现奇怪的重叠,导致单元格的高度发生变化(使用 UITableViewAutomaticDimension),然后内容与上面的单元格重叠,无法弄清楚怎么做
我是一个新手,如果这是一个愚蠢的问题,请原谅我。我想有一个部分与标题分开,但发生了两种情况: (1) 当我把 在 下面,它们相互重叠,如下所示: Section overlapping header
我正在尝试创建两个 那是重叠的。唯一的问题是第二个 在第一个的前面它必须是相反的。我尝试设置第一个 的 z-index至 1但它仍然不起作用。 这是我的代码: #content{ backgrou
是否有重叠 2 个 div 的有效方法。 我有以下内容,但无法让它们重叠。 #top-border{width:100%; height:60px; background:url(image.jpg)
我是一名优秀的程序员,十分优秀!