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