检测是否可以将一个矩形放入另一个矩形

时间:2012-12-09 03:12:36

标签: math rect

此问题与测试一个矩形是否在另一个矩形中不同。

已知信息是两个部分的长度。

如何计算是否可以将一个矩形放入另一个矩形?

can rect a be put into rect b

5 个答案:

答案 0 :(得分:7)

这是一个很好的问题!当且仅当满足这些条件的一个时,边长为pqp >= q)的较小矩形完全适合较大< / em>带有边aba >= b)的矩形:

enter image description here

enter image description here

请参阅this以供参考。


因此,如果我们有变量abpq,我们可以通过评估检查这种矩形排列是否可行:

(p <= a && q <= b) || (p > a &&
                        b >= (2*p*q*a + (p*p-q*q)*sqrt(p*p+q*q-a*a)) / (p*p+q*q))

编辑:感谢@amulware在评论中发布此备用版本:

enter image description here

答案 1 :(得分:4)

第一次检查当然是矩形是否在轴对齐方向中适合另一个。

如果没有,它唯一的选择就是对角线,但实际上它可能有很多适合的角度,难度不仅仅是猜测,而是确实计算一个可能的角度(如果存在的话)。

现在,请注意,如果内部矩形确实对角线适合,那么如果其相对的角部接触外部矩形的顶部和底部边缘,或者左侧和右侧,则可以旋转它直到两个。 (在你的图表中或多或少是第一个。)

在这种情况下,您已经知道在一个维度(在示例中,y轴)内部适合它。然后,您必须计算另一个维度中内部矩形的边界宽度,并根据外部框的宽度进行检查。

可能有一个更智能的算法,但我100%肯定我描述的工作。让我知道你是否可以自己弄清楚数学(如果你认为这是一个很好的解决方案),如果没有,我可能会稍后再去。我想知道我的算法是否可以在没有trig函数的情况下完全实现...

修改 好了,我无法抗拒......

以下是我为解决上述问题所做的数学计算: (对不起,只有图像形式,我希望我的笔迹可读。) algorithm on paper 如果有人能检查我的数学,我会很高兴。我现在没有看到任何步骤有任何问题,但是让其他人检查总是更好。 (当然:使用此风险需要您自担风险。)

如果有人发现此算法有任何问题,请告诉我,我会尽快解决。

此外,我非常有兴趣看看是否有人有更好的解决方案,涉及更简单的数学。也许是基于矢量的方法?

答案 2 :(得分:2)

好吧,它看起来像A.R.S.解决方案是真的,我仍然会尝试发布我的解决方案,它更难,但它会让你建立一个矩形到另一个矩形的具体嵌入(如果可能的话)。

让我们假设a>bp > q。如果a > pb > q,解决方案很明显。如果a<pb>q,问题也可以解决。看一下附图,你只需要最后一个不等式系统(如果你感兴趣的话,你可以看看它是如何得出的)

您所需要的只是确保最后一个不等式系统在01之间有一个解决方案。要做到这一点,你需要将每个不等式解为等式(如通常的二次方程)。如果没有解决方案(这是不可能的),不平等的解决方案就是完整的实线。如果方程有两个(可能相等的)解t_1t_2,则不等式的解是段[-infinity, t_1][t_2, infinity]联合。在得到两个不等式的解后,你应该将它们相交。现在我们应该记住,t是一个角度cos0pi/2之间),因此不等式应该在0和{{1}之间有解决方案}。在那种情况下,第二个矩形可以嵌入第一个矩形中。如果你拿,例如1(较小的方程根)可以构建一个矩形的混合嵌入。

enter image description here

答案 3 :(得分:1)

你可以很容易地清除这两个简单的案例:

  1. 如果第二个的较大尺寸小于第一个的较大尺寸,并且如果较小尺寸的尺寸相同,那么第二个尺寸适合于内部。
  2. 如果第二个的较大尺寸大于第一个的斜边,则第二个尺寸不适合第一个。
  3. 困难的部分是确定它是否可以适合角度,例如在草图中。我不知道一个简单的公式 - 它可能需要一个插件和突突解决方案。

    Mathematics Stack Exchange site可能是一个很好的问题。

    已添加:我不是100%确定是否这样,但我认为如果第二个的斜边小于第一个斜边那么它就适合。

    哎呀:不 - 我会收回的。但如果第二个的斜边大于第一个的斜边,那么它就不会

答案 4 :(得分:0)

我不允许发表评论,所以请回答。

在amulware的答案中:

x1 = h * cos(alpha)

x2 =(a2)* sin(beta)

并且似乎没有明显的方法来计算alpha或beta的值。