Круговое скользящее окно над алгоритмом двумерного массива - PullRequest
0 голосов
/ 16 февраля 2012

Этот вопрос решает половину моей проблемы , потому что мое скользящее окно может выходить за пределы таблицы, например, для окна 3x3, два столбца окна могут находиться на левом конце таблицы, и один столбец будетна правом конце.Эти изображения показывают окно, перемещающееся влево

enter image description here enter image description here enter image description here

Мне нужен алгоритм для этого скользящего окна, скользящее окно в упомянутом вопросе не выходит за пределы таблицы.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Вы можете использовать операцию по модулю (%) для ограничения индексов.

Size arraySize = new Size(20, 15);
Size windowSize = new Size(3, 3);

double[,] array = new double[arraySize.Width, arraySize.Height];

// Set the location of the window
Point windowLocation = new Point(18, 14);

for (int x = 0; x < windowSize.Width; x++) {
    for (int y = 0; y < windowSize.Height; y++) {
        DoSomethingWith(array[(windowLocation.X + x) % arraySize.Width,
                              (windowLocation.Y + y) % arraySize.Height]);
    }
}
2 голосов
/ 16 февраля 2012

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

Подумайте в терминах следующего псевдокода:

View getView(int leftX, int topY) {
    if (leftX >= 0 and
        topY >= 0 and
        leftX <= underlying.width() - viewWidth and
        topX <= underlying.height() - viewHeight)
    {
        return underlying.getView(leftX, topY);
    }
    // else make your own view and populate it
    View view = new View()
    for (int i = 0; i < viewWidth; ++i)
        for (int j = 0; j < viewHeight; ++j)
            view.set(i, j) = underlying.get((leftX + i) % underlying.width(), (topY + j) % underlying.height())
}

Если вы закончитеИспользуя этот код, убедитесь, что по модулю отрицательные индексы дают положительный результат.Если нет, используйте viewWidth - negative_modulo, чтобы получить правильный индекс.

...