【问题标题】:How to find if a 3D object fits in another 3D object (the container)?如何判断一个 3D 对象是否适合另一个 3D 对象(容器)?
【发布时间】:2013-01-12 19:15:01
【问题描述】:

给定两个 3d 对象,我如何找到一个是否适合第二个(并找到对象在容器中的位置)。

对象应该被平移和旋转以适应容器 - 但不能以其他方式修改。

其他并发症:

  1. 同样的情况 - 但要寻找最合适的解决方案,即使它不是适当的匹配(尽量减少不适合容器的对象的体积)

  2. 支持弹性对象 - 找到最佳拟合,同时最大限度地减少对象中的“失真”

这是一个非常笼统的问题 - 我不希望有一个完整的解决方案。 任何指向相关论文\文章\库\工具的指针都会很有用

【问题讨论】:

  • 简单的解决方案:检查所有可能的面对是否存在交叉点。
  • 我不够清楚 - 第一个对象应该移动\旋转以适合容器
  • 啊。那么这就复杂了!
  • 实时方法需要什么?或者可能需要一些时间?您可以尝试使用边界框:随机化位置和旋转,直到找到框不相互重叠的匹配。如果您需要更高的准确性...祝您好运:)
  • 如果确实可以保证它们彼此非常接近,这会很有帮助 - 然后您可以从对齐质心、主轴等开始并靠近。然后一些优化算法可能会起作用。

标签: algorithm computational-geometry


【解决方案1】:

这是一种可能不太理想的方法。

您可以尝试固定 1 个形状的位置(在 3D 空间中)。将另一个形状放在该形状的顶部。然后创建将形状中的一个点连接到另一个形状中的点的链接。然后模拟当链接同样拉紧时会发生什么。使不固定的点旋转平移直到稳定。

如果配合足够松,您可以只使用 3 个链接(3D 链接的最低数量)并尝试所有可能的组合。但是,为了更紧密地配合,您需要更多的链接,也许足以将它们放置在形状的每个点上,并且点数最少。这意味着您将有一些方法来确定如何放置链接,这并非易事。

【讨论】:

  • 你假设我知道对象中的哪个点应该靠近容器中的特定点
  • 这就是为什么它不太理想,因为确定这一点并不容易,因此您需要尝试每个有限的组合。我描述的这两种方法(第二种方法是使用较小点的所有点)需要 O(N^3) 组合加上进行所有模拟所需的一切,并且会发现合适的“松散”(想想里面的正方形一个八边形)或“紧”(想想一个稍微大一点的正方形里面的正方形),但可能不适用于介于两者之间的东西。虽然,我认为我可能低估了紧配合算法,因为它本身可能就足够了。
  • 再一次,如果你有 100,000+ 分,O(N^3) 或 O(N^2)(最低限度的紧身配合)可能不切实际。在这种情况下,希望有人知道更好的方法。
【解决方案2】:

这似乎是一个相当困难的问题。可能的方法是采用一些启发式方法来建议转换,然后检查它是否好。如果转换仅将对象稍微移出内部(例如在一个部分),则稍微调整以适应转换并对其进行测试。如果对象“大量”出局(例如,在同一/两侧的所有轴上),则进行新的启发式猜测。

只是启发式的一般概念。对具有相同像素大小的对象进行光栅化。它可以是对象体积的八叉树。制作像素之间的连接图。检查图之间的子图同构。如果存在子图,则该位置用于测试。

此方法还支持 90 度旋转。

有些测试甚至可以在图表上完成。如果子图的所有体积邻居都在更大的图中,那么对象就在其中。

一般来说,这是“改进的”边界框方法。

【讨论】:

    【解决方案3】:

    另一种解决方案是在两个对象上投影相同数量的点,并在点集上进行最小二乘法最佳拟合。点集的排序可能不会相同,因此在最适合的最小二乘和点的重新排序之间进行迭代,以便两个对象上的点接近相同的顺序。这个方程的发展是很多代数,但在概念上并不复杂。

    【讨论】:

      【解决方案4】:

      考虑目标对象中的一个多边形(三角形)。对于这个多边形,在另一个几何(源)中找到等效的多边形,即。边长、边角、面积都应该相同。如果只有一个匹配项,请找到以这种方式改变顶点的刚性变换矩阵:X' = M*X。由于X' AND X 对匹配多边形上的所有点都是已知的,因此这应该可以通过线性代数实现。

      如果您想要多边形的顶点之间的一对一映射,请以相同的顺序遍历多边形的边缘,并制作一个查找表,将每个顶点一个多边形映射到另一个多边形。如果您有一个 3d 对象的half edge data structure,这将大大简化此过程。

      如果您找到多个匹配的多边形,请从这两个点遍历源多边形,并继续将其相邻多边形与目标多边形匹配。继续直到其中一个中断,之后您可以执行与单匹配版本相同的步骤。

      here 列出了更严肃的解决方案,但我认为上面的方法也可以。

      【讨论】:

        【解决方案5】:

        多么有趣的问题啊!在计算几何中很典型,这个问题 不匹配的几何抽象可能会非常复杂。各种if-else案例等。 但是如果选择正确的抽象,解决方案就会变得微不足道,只需要很少的子案例。

        计算你的形状的Distance Transform,瞧!您的解决方案是微不足道的。 请允许我详细说明。

        网格上形状的距离图(像素)编码了距离上最近点的距离 形状的边界到该像素。它可以在两个方向向外或向内计算到形状中。 在这个问题中,向外的距离图就足够了。

        • 第 1 步:计算两个形状 D_S1、D_S2 的距离图
        • 第 2 步:减去距离图。差异 = D_S1-D_S2
        • 第 3 步:如果 Diff 只有正值。然后您的形状可以相互包含(+ve => S1 大于 S2 -ve => S2 大于 S1) 如果 Diff 既有正值又有负值,则形状相交。

        你有它。享受吧!

        【讨论】:

        • 问题可能不清楚,但问题允许旋转或平移对象
        猜你喜欢
        • 2012-12-03
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 2011-11-28
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多