在给定非轴对齐矩形的情况下,如何在2D矩阵中找到样本子集?

时间:2015-07-26 16:25:38

标签: algorithm math unity3d geometry

我正在编写一个小型视频游戏原型,我有一个将由对象遍历的高度图(2D浮点数组)。我希望能够在对象下获取高度图数据,以便在游戏中使用。

enter image description here

我目前使用AABB(轴对齐的边界框)在我的对象下获得高度图的子区域(黄色),因为我将处理它们周围和周围的数据。那部分是微不足道的。

但是我无法弄清楚如何在给定旋转边界框(不是轴对齐)的对象下找到样本(红色)。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

我可能会建议以下方案:

  1. 计算轮子的AABB(按其顶点)。
  2. 获取此AABB中的矩形子网格。
  3. 对于这些点中的每一点,检查它是否位于您的车轮内。
  4. 为了做第3部分,你需要做一些数学运算。假设您知道车轮的单位方向向量D,其中心位置C,半长l和半厚度w。对于点P,您可以检查以下条件:

      abs(  dot(P - C, D)) <= l
      abs(cross(P - C, D)) <= w
    

    这是解决问题的一种更复杂的方法,但效率更高。仅枚举通过AABB检查获得的子网格的行。对于每一行,您可以使用 O(1)时间中的显式公式确定车轮内的点范围。然后,您只能枚举轮内的点。总时间复杂度为 O(R + A),其中 R 是车轮AABB中子网格中行的nubmer, A 是车轮内的总点数。

    C#中的示例实现:

    if (Mathf.Abs(Vector3.Dot  (hfSampleGlobalPos - wheelPosePos, wheelPoseRot * Vector3.forward))   <= wheelRadius &&
        Mathf.Abs(Vector3.Cross(hfSampleGlobalPos - wheelPosePos, wheelPoseRot * Vector3.forward).y) <= wheelHalfWidth)
    {
        // Do something with the sample under the wheel here
    }
    

答案 1 :(得分:0)

在栅格上填充多边形是计算几何中的标准问题。您可以查找单词“even-odd rule”以开始使用。但是,这里是你所做的大致概述:

  1. 循环到黄色子区域中的每条扫描线
  2. 将扫描线与每个蓝色多边形边相交
  3. 按x值
  4. 对交点排序
  5. 使用奇偶规则填充交点之间的内部像素以确定内部点
  6. 最后,你必须防止退化的情况,比如与顶点和水平线相交。
  7. 此外,对于简单的多边形,这个奇怪的规则会减少到point-in-polygon个问题。