假设我有两个盒子(每个盒子都是rectangular cuboid,又名长方体)。我需要编写一个函数来判断尺寸(a,b,c)的方框是否适合尺寸(A,B,C)的方框,假设允许任何角度的任何旋转(不仅是90°)。
棘手的部分是内盒的边缘可能不平行于外盒的相应边缘。例如,尺寸(a,b)但非常薄的盒子,但长度 1< c<如果沿着主对角线放置,√3可以放入单位立方体(1,1,1)。
答案 0 :(得分:2)
不是一个完整的答案,但一个好的开始是确定适合较大的盒子内的最大直径(将盒子刻在圆圈中)和较小盒子所需的最小直径。这为可能性提供了第一个过滤器。这也告诉您如何将较小的盒子定位在较大的盒子中。
答案 1 :(得分:2)
如果盒子具有相同的中心,如果一个盒子可以放在另一个盒子里面,它也可以适合。因此,只有旋转足以检查,不需要进行翻译。
2D案例:对于位于X=(2A,2B)
周围的框x=(2a,2b)
和(0,0)
。这意味着X
的角落为(+-A, +-B)
。
---------(A,B)
|
-----------(a,b)
(0,0) |
-----------(a,-b)
|
---------(A,-B)
在x
周围转动(0,0)
,角落始终位于半径为C
的圆sqrt(a^2+b^2)
上。如果圈子的一部分位于框X
内,并且X
内的部分有足够的弧长,则距离2a
或2b
上的2个点,而不是x
可以放在X
内。为此,我们需要计算C
与行x=A
和y=B
的交点,并计算这些交点之间的距离。如果距离等于或大于2a
或2b
,则x
可以放在X
内。
3D案例类似。对于位于X=(2A,2B,2C)
周围的框x=(2a,2b,2c)
和(0,0,0)
。在x
周围旋转(0,0,0)
,所有角落都在半径为sqrt(a^2+b^2+c^2)
的球体上移动。要查看球框交叉部分是否有足够的空间,找到球体与平面x=A
,y=B
和z=C
的交点,并检查是否有足够的空间来适应任何四边形{{该球体部分的1}},(2a,2b)
或(2a,2c)
。在足够的距离上检查部分边界上的点就足够了。对于这部分,我不确定有效的方法,也许找到' center'交叉部分和检查它到边界的距离可以帮助。
答案 2 :(得分:0)
你基本上必须检查几个案例,一些是微不足道的,一些需要最小化搜索。
首先,有4个3平行轴的情况。如果他们中的任何一个通过(使用@ jean的测试),你就适合。否则,继续下一个测试用例:
接下来,有18个2d对角线情况,其中一个轴是平行的,另外两个是对角线的,具有一个角度自由度。如果平行轴不适合,则丢弃一个案例;否则找到单个旋转角度的一些“冲击”度量函数的最小值。然后检查该角度的任何实际撞击。撞击度量必须是内盒(4个角)如何停留在外盒的两个面内的一些连续测量,允许有时它们可能在搜索最小撞击角度时向外移动。希望a)有一个可预测的最大极小数,并希望b)如果有可能的拟合,那么在这些最小值之一的角度保证拟合。
如果这些情况都不会在没有撞击的情况下通过,那么继续前进到更大数量的3d无平行轴情况,其中旋转参数现在是三个角度而不是一个,你必须搜索一个(希望有限)冲击度量的最小值,并在那里测试实际撞击。
我认为不是很优雅。这类似于另一个线程,询问给定宽度的线条在给定尺寸的2d框内可以适合多长时间。我没有考虑那里的平行轴情况,但是对角情况需要求解四次方程(比二次方程更差)。如果您想要进行分析而不是搜索冲击度量的最小值,则对于您的单平行轴情况可能会遇到类似的问题。无平行轴3d对角线情形的解析解可能涉及求解(对于正确的根)更高阶方程。
答案 3 :(得分:0)
事实上,在下列条件下,任何尺寸为(a1,a2,a3)的方框A都可以放入另一个尺寸为(b1,b2,b3)的方框B中:
i)每个ai小于或等于每个bi,i = 1. 2. 3;
ii)任何ai必须小于或等于B(diagB)的主对角线sqrt(b1 ^ 2 + b2 ^ 2 + b3 ^ 2)。任何一个尺寸等于diagB的盒子A都有另外两个尺寸等于0,因为任何与它正交的平面都会延伸到盒子B的外面。
iii)a1,a2和a3的总和必须小于或等于diagB。
从这些中,我们可以看到方框A的最大尺寸ai,它适合方框B,给定ai> bi,应该位于区间(bi,diagB)。 因此,任何一个尺寸大于包含它的盒子尺寸的盒子都必须沿着后者的主对角线放置。
简单地说: 如果a1 a1 + a2 + a3 <= diagB,则a(a1,a2,a3)适合B(b1,b2,b3)。
答案 4 :(得分:-1)
你能得到盒子尺寸吗?假设a0,a1,a2是按大小排序的方框A的尺寸,b0,b1,b2是按大小排序的方框B的尺寸。
如果(a0&lt; = b0 AND a1&lt; = b1 AND a2&lt; = b2)
,则在B内部拟合