我的数学不太好,所以我很难将公式转换为代码,而且我在谷歌上找不到任何现成的东西。我有一个包含很多小矩形的大矩形......我需要做的就是计算最大的空矩形。任何人都可以帮助我吗?
这就是我想出的……没什么可说的,这是一个很大的失败。
Rect result = new Rect();
for (Double l = 0; l < bigRect.Width; ++l)
{
for (Double t = 0; t < bigRect.Height; ++t)
{
Double h = 0;
Double w = 0;
while ((h <= bigRect.Width) && (w <= bigRect.Height))
{
Rect largestEmpty = new Rect(l, t, w, h);
if (smallRects.TrueForAll(smallRect => !smallRect.IntersectsWith(largestEmpty)) && ((largestEmpty.Height * largestEmpty.Width) > (result.Height * result.Width)))
result = largestEmpty;
else
break;
++h;
++w;
}
}
}
从你的它表示大矩形中有一组点(我们称之为 ASD),您将找到不包含该组 ASD 点的最大矩形。查看您的代码,您似乎没有(直接)合并这些要点。我将从较小的矩形中提取点并创建 ASD 集。由于您使用的是 double 类型,因此您应该能够访问这些点,否则算法的运行时间将会明显增加,因为您需要检查特定范围(整个大矩形)内所有可能的双精度数。使用这些点,我会尝试找到彼此距离最短的点 (sqrt(dx^2+ dy^2)) (最短不应包含任何点),然后转到下一个最短的点,看看是否有任何点换句话说,创建所有组合的顺序列表(不是排列,(a,b) 到 (c, d) 应该 == (c, d) 到 (a,b))按距离排序在他们之间。可能不是最佳的,但可以完成工作。
编辑:除了较小矩形的对角线之外的所有订单对都应该在订单列表中,因为较小的矩形不应该被连接,您还可以排除具有相同 x 或 y 值的对。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)