【问题标题】:WPF 3D :check if a cube can completely contain another cubeWPF 3D:检查一个多维数据集是否可以完全包含另一个多维数据集
【发布时间】:2011-02-09 18:17:29
【问题描述】:

我正在研究 3D 中的拖放。我创建了带有墙壁(立方体)的 3D 空间(房间),这些墙壁(立方体)充当被丢弃物体(假设是较小的立方体)的占位符。

我该如何解决:

如果用户将对象丢在房间的边缘,那么房间是否可以完全包含该对象?

意思是,我不希望物体部分在房间里,部分在外面。理想情况下,我会取消放置操作/将其移动到某个点,以便房间安全地包含该对象。

我有房间和对象的边界 (ModelVisual3D.Content.Bounds) 以及对象被丢弃的点。

我想我必须做一些数学运算才能确定对象是否放置在该点,然后它将完全在边界房间内。

想法/想法/指针表示赞赏。

【问题讨论】:

    标签: wpf 3d drag-and-drop bounds-checker modelvisual3d


    【解决方案1】:

    为了使 3D 中的拖放更容易,您可以实现一个(可选的)捕捉系统。

    要检查一个盒子是否包含另一个盒子,只需检查一个盒子的所有角落。测试每个角,看它是否在另一个盒子的面的“内部”(或外部)。 如果所有的角都在里面,那么盒子就在里面。

    这适用于所有框,而不仅仅是轴对齐的框。

    【讨论】:

      【解决方案2】:

      对于任何轴对齐的框,由于您使用的是边界,因此似乎是这种情况,一个简单的测试可以判断一个轴对齐的框是否包含在另一个框中。

      给定以下Box 类:

      class Box 
      {
        Vector3 minEdge;
        Vector3 maxEdge;
      }
      

      您可以轻松地在 Box 中使用一个方法来测试是否包含:

      bool IsInside(Box other)
      {
        return maxEdge.X <= other.maxEdge.X &&
               maxEdge.Y <= other.maxEdge.Y &&
               maxEdge.Z <= other.maxEdge.Z &&
               minEdge.X >= other.minEdge.X &&
               minEdge.Y >= other.minEdge.Y &&
               minEdge.Z >= other.minEdge.Z;
      }
      

      请注意,这不适用于任意方向的框,仅适用于轴对齐。

      【讨论】:

      • 不清楚轴对齐是什么意思。房间位于 XZ 平面中,墙壁的高度为 Y。我有对应于 2 个框的 ModelVisual3D 元素。被拖动的对象肯定比房间小,问题是用户可以将它拖到房间的边缘,它可能与墙壁重叠并部分在房间外面。所以落点对计算也很重要。
      • 轴对齐意味着盒子的边与三个世界轴对齐。这种盒子通常用一条最小边和一条最大边来表示,即盒子的最小和最大坐标的两个点。您可以从任意模型轻松生成轴对齐边界框。请注意,如果涉及任意旋转,它们是不精确的。
      【解决方案3】:

      1。选取点 A。(点可以是内部立方体 CubeIn 的一个角)

      从一个立方体中选择一个点。 (我假设我们要测试一个立方体完全在另一个立方体内。意思是没有交集)。

      2。检查 A inside CubeOut (Outercube)

      3。如果 A 在 CubeOut 内而不是 CubeIn 完全在 CubeOut 内

      如果点在第二个立方体内,则意味着第一个立方体在第二个立方体内。(为什么?因为如果一个立方体在另一个立方体内。所以内立方体上的每个点都将在外立方体内)

      4。否则 CubeIn 不在 CubeOut 内

      这适用于所有类型的实体实体(球体、圆锥体...)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多