这个看似简单的问题我一直在苦苦挣扎。我给了一组点(我已经进一步简化为凸壳)我的任务是找到一个矩形(不一定是轴对齐的),包含所有这些,没有额外的空间(所以它是在点周围紧密配合)并具有最大可能的周长。找到最小的一个对我来说没有问题,但事实证明这是一个难以破解的难题。当搜索最小边界矩形时,我能够使用这样一个假设:矩形的一个边总是与一个船体边对齐,但在这里我没有看到任何这种情况。我错过了一些痛苦明显的东西吗?到目前为止我唯一可以提出的方法是测试对映点对,如果它们可以投射到矩形的两侧并使用一些触发来最大化函数,但我只是在计算中迷失了自己。
提前致谢!
答案 0 :(得分:1)
首先,计算点集的凸包。
现在,考虑旋转多边形并计算最小的包围轴对齐矩形。请注意,顶点,左点,右点和底点将沿着凸包从一个顶点顺时针进行到下一个顶点。
您无法明确尝试每个可能的角度。但是,你可以做一个扫线技巧。但是,给定一个角度,您可以在旋转多边形之后计算顶部,左侧,底部和右侧点以及顶部,左侧,底部和右侧点中的第一个,以在您继续旋转时更改标识多边形。因此,您可以获得一系列角度,您当前选择的顶部,左侧,底部和右侧是正确的;此外,您知道 next 正确选择顶部,左侧,底部和右侧是什么。
对于top,left,bottom和right的每个合法选择,你必须计算a * sin(theta)+ b * cos(theta)的最大值,对于某些范围的θ,固定a和b 。回想一下三元组a * sin(θ)+ b * cos(theta)= sqrt(a ^ 2 + b ^ 2)cos(theta - arctan(b / a))。你在你的区间的边界和导数为零的位置评估函数(在arctan(b / a)加上pi的任何整数倍)并且你是黄金。