【问题标题】:Per Pixel Collision - Code explanationPer Pixel Collision - 代码解释
【发布时间】:2011-09-03 19:43:46
【问题描述】:

我目前正在尝试了解每像素碰撞检测。

这是我看不懂的代码:

static bool IntersectPixels(Rectangle rectangleA, Color[] dataA,
                            Rectangle rectangleB, Color[] dataB)
{
    // Find the bounds of the rectangle intersection
    int top = Math.Max(rectangleA.Top, rectangleB.Top);
    int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom);
    int left = Math.Max(rectangleA.Left, rectangleB.Left);
    int right = Math.Min(rectangleA.Right, rectangleB.Right);

    // Check every point within the intersection bounds
    for (int y = top; y < bottom; y++)
    {
        for (int x = left; x < right; x++)
        {
            // Get the color of both pixels at this point
            Color colorA = dataA[(x - rectangleA.Left) +
                                 (y - rectangleA.Top) * rectangleA.Width];
            Color colorB = dataB[(x - rectangleB.Left) +
                                 (y - rectangleB.Top) * rectangleB.Width];

            // If both pixels are not completely transparent,
            if (colorA.A != 0 && colorB.A != 0)
            {
                // then an intersection has been found
                return true;
            }
        }
    }

    // No intersection found
    return false;
}

我真的不明白整个循环。我很乐意解释它是如何工作的。

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    首先,它找到两个图像矩形相交的区域,然后遍历该区域中的每个像素,并比较每个像素的每个图像的 alpha 值。如果两者的 alpha 值都不为 0,则它们都被视为“实心”并因此发生碰撞。

    【讨论】:

      【解决方案2】:

      这并不难(在这种情况下)——你给算法你的对象的两个边界框(所以洞对象在这个框内),以及一个包含它们颜色信息的数组。 Tha 算法假设一个点属于对象 IFF 它不透明 - 这很重要。

      第一步是计算相交矩形 - 如果你相交两个边平行于轴的矩形,就像在这种情况下一样 - 你会再次得到一个矩形或一个空集。

      下一步是在这个相交的矩形中迭代所有 (x,y) 坐标 - 首先是 y,然后是 x - 这样你就可以得到正常的第一个 x,然后是内部的 y,但这是次要的,并不重要.

      然后算法最终在当前像素 (x,y) 处获取对象 A 和 B 的颜色 - 如果两种颜色都不透明,则像素在两个对象中并且对象必须在这一点相交 - 所以算法以“是的,它们相交”结束

      如果边界框相交处的所有像素都被选中并且没有发现共同(例如不透明)像素,则对象不相交,因此算法以“NO they don't intersect”终止

      我希望这会有所帮助。

      【讨论】:

      • 您的解释对我帮助很大,但我不明白的一件事是,在循环中,他如何真正找到当前像素颜色,就像我的意思一样,为什么我需要将矩形宽度乘以结束了吗?
      • 还有一个问题:这个算法是否只在交叉边界而不是在整个两个矩形中找到每个像素?
      • 第二条评论:是的,没错,第一条评论:那是完成了 dataA 和 dataB 的数组操作的部分(内部循环中的前两件事) - 里面只是一点坐标变换从“世界”视图到“对象”视图(对象中的顶部/左侧点在世界视图中具有例如坐标 RectangleA.top/RectangleA.left,但当然坐标 0/0 用于对象的颜色信息)
      • 所以你的意思是他看起来只在红色范围内,像这样? img7.imageshack.us/img7/4913/dfsb.png
      • @CarstenKönig 我对这种碰撞检测完全陌生,除了第二个和第四个参数(颜色数组)之外,我什么都知道。这是哪里来的?
      【解决方案3】:

      for (int y = top; y &lt; bottom; y++) 从上到下循环遍历生成的矩形的线,for (int x = left; x &lt; right; x++) 从左到右循环遍历每行内的像素。

      【讨论】:

        猜你喜欢
        • 2013-01-31
        • 2011-05-27
        • 2017-12-03
        • 1970-01-01
        • 2023-03-29
        • 2015-03-23
        • 2012-07-20
        • 2010-10-11
        • 2011-09-25
        相关资源
        最近更新 更多