C++ 在点周围拟合矩形

C++ 在点周围拟合矩形,c++,algorithm,C++,Algorithm,我尝试在一组8个2D点周围拟合一个矩形,同时尝试最小化覆盖区域 例如: 矩形可以缩放和旋转。但是,它需要保持矩形 我的第一种方法是对每个可能的旋转施加暴力,使矩形尽可能接近,然后计算覆盖面积。最适合的是最小面积的旋转 然而,这听起来并不是最好的解决方案 有更好的方法吗?已经证明,一组点的最小面积矩形与集合的凸面外壳多边形的一条边共线[Freeman,Shapira 1975] 该问题的O(nlogn)解决方案发表在[Allison,Noga,1981] 在[Arnon,Gieselmann 1

我尝试在一组8个2D点周围拟合一个矩形,同时尝试最小化覆盖区域

例如:

矩形可以缩放和旋转。但是,它需要保持矩形

我的第一种方法是对每个可能的旋转施加暴力,使矩形尽可能接近,然后计算覆盖面积。最适合的是最小面积的旋转

然而,这听起来并不是最好的解决方案


有更好的方法吗?

已经证明,一组点的最小面积矩形与集合的凸面外壳多边形的一条边共线[Freeman,Shapira 1975]

该问题的O(nlogn)解决方案发表在[Allison,Noga,1981]


在[Arnon,Gieselmann 1983]中发表了一个简单而优雅的O(n)解,其中输入是凸包(的复杂性等于对输入点排序的复杂性)。解决方案基于中描述的方法。在线演示可用。

我不知道你所说的“尝试所有可能的旋转”是什么意思,因为它们有无限多个,但这个基本想法实际上产生了一个非常有效的解决方案:

第一步是计算凸包。这实际上节省了多少取决于数据的分布,但是。有一个:

  • 如果这些点已经按照它们的一个坐标进行了排序,Graham扫描算法会在O(n)中进行排序。对于给定顺序中的每个点,将其连接到外壳中的前两个点,然后删除新外壳上的每个凹点(唯一候选点是与新点相邻的凹点)
  • 如果没有对点进行排序,则礼品包装算法是一个简单的算法,运行速度为O(n*h)。对于从输入最左侧点开始的外壳上的每个点,检查每个点以查看它是否是外壳上的下一个点
    h
    是船体上的点数
  • 承诺O(nlogh)性能,但我还没有完全了解它是如何工作的
  • 另一个简单的想法是按方位角对点进行排序,然后删除凹面点。然而,一开始这看起来只是O(n+sort),但我恐怕事实并非如此
在这一点上,检查到目前为止收集到的每个角度就足够了(正如我和奥利弗·查尔斯沃思(Oliver Charlesworth)所推测的那样,埃夫根尼·克鲁耶夫(Evgeny Kluev)也正是出于这一点。最后,让我参考中的相关参考资料

对于每个方向,边界框由该间隔中每个角度的相同四个(不一定不同)点定义。对于候选方向,您将至少有一个任意选择。找到这些点可能看起来像是一项O(h^2)任务,直到您意识到轴对齐边界框的极值与开始合并的极值相同,并且连续间隔的极值点相同或连续。让我们按顺时针顺序调用极值点
A、B、C、D
,并将界定边界框的对应线设为
A、B、C、D



那么,让我们来计算一下。边界框区域由
|a,c |*| b,d |
给出。但是a,c只是投影到矩形方向上的向量。设
u
为平行于
a
c
的向量,并设
v
为垂直向量。让它们在整个范围内平稳变化。用向量的说法,区域变成
((AC.v)/|v |*((BD.u)/|u |
=
{(AC.v)((BD.u)}/{u | v |
。让我们也选择
u=(1,y)
。然后
v=(y,-1)
。如果
u
是垂直的,这会带来一个涉及极限和无穷大的小问题,因此在这种情况下,让我们选择
u
为水平。为了数值稳定性,让我们只需在
(1,-1)…(1,1)
之外每隔
u
旋转90°。如果需要,将区域转换为笛卡尔形式,留给读者作为练习。

当我看到这个问题时,他们想到的第一件事是使用主成分分析。我猜想最小的矩形满足两个条件:边与主轴平行,并且至少有四个点位于边上(有界点)。应该有n维的扩展

那么,你的暴力解决方案有多复杂?凸壳上有O(n)边。即使使用蛮力矩形收缩包装,也会得到O(n^2),实际使用th(n^1.5)。我希望找到更好的解决方案,而不是蛮力approach@MrSmith42-我的直觉告诉我相反;凸包的一条边将是最小矩形的一部分。虽然还不能证明…@Smith42先生我会试着将边界框与最上面的两点对齐。所以。。。计算凸壳;对于凸面外壳方向mod 90度之间的每个角度范围,矩形由相同的四个点限定。求相应面积函数的最小值(其形式事先已知)。最低限度,嗯?与主轴平行的边?那么,为什么安装的矩形会倾斜?我的显示器弯曲了吗?主轴与显示器的边缘不平行。它们是由点决定的。啊,所以你定义了边的方向。。。一点也不PSee 3D游戏编程和计算机图形学数学,第8.1.1节(pp212及以后)