Per Pixel Collision - объяснение кода - PullRequest
       6

Per Pixel Collision - объяснение кода

2 голосов
/ 03 сентября 2011

В настоящее время я пытаюсь понять обнаружение столкновений на пиксель.

Это код, который я не понимаю:

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;
}

Я действительно не понял весь цикл.Я буду рад за некоторые объяснения, как это работает.

Ответы [ 3 ]

7 голосов
/ 03 сентября 2011

Сначала он находит область, которую пересекают два прямоугольника изображения, затем он перебирает каждый пиксель в этой области и сравнивает альфа-значения каждого изображения каждого пикселя. Если ни один из них не имеет альфа-значения 0, они оба считаются «сплошными» и поэтому сталкиваются.

enter image description here

5 голосов
/ 03 сентября 2011

это не так сложно (в данном случае) - вы задаете алгоритму два ограничивающих прямоугольника ваших объектов (таким образом, объект дыры находится внутри этого прямоугольника) и массив с информацией о цвете для них. Алгоритм предполагает, что точка принадлежит объекту, если она не прозрачна - это важно.

Первым шагом является вычисление пересекающегося прямоугольника - если вы пересекаете два прямоугольника, стороны которых параллельны осям, как в этом случае - вы снова получите прямоугольник или пустой набор.

Следующим шагом является итерация в этом пересекающемся прямоугольнике для всех (x, y) -координат insiede - сначала y, затем x, так что сначала вы получите нормальный x, затем y внутри, но это второстепенная точка и не важно .

Затем, наконец, алгоритм получает цвет для объектов A и B в текущем пикселе (x, y) - если оба цвета НЕ прозрачны, то пиксель находится в обоих объектах, и объекты должны пересекаться в этой точке - поэтому Алгоритм заканчивается "ДА, они пересекаются"

Если все пиксели в пересечении ограничивающих рамок были отмечены, и не было обнаружено ни одного общего (например, непрозрачного) пикселя, объект не пересекается, и поэтому алгоритм завершается с «НЕТ, они не пересекаются»

Надеюсь, это поможет.

0 голосов
/ 03 сентября 2011

for (int y = top; y < bottom; y++) зацикливает линии результирующего прямоугольника сверху вниз, а for (int x = left; x < right; x++) зацикливает пиксели внутри каждой строки слева направо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...